Michael.W谈Docker 第二期-docker的镜像管理
1 Docker的镜像管理
1.1 镜像的搜索
# 查看docker中的所有指令
docker --help
# 命令
$ docker search 镜像名
在这里插入图片描述
NAME: 镜像名字
DESCRIPTION: 描述信息
STARS: 下载量
OFFICIAL: 镜像是否为官方发行
AUTOMATED: 是否会启动一些脚本之类的程序
1.2 镜像的获取
# 下载远程仓库(如Docker Hub)中的镜像
$ docker pull 镜像名
# 下载完成之后, 就存储到了本地的镜像仓库 /var/lib/docker
镜像名为docker search xxx中Name字段对应的名字
1.3 镜像的查看
# 查看所有的镜像
$ docker images
$ docker image ls
# 查看某个镜像
$ docker images 镜像名
$ docker image ls 镜像名字
在这里插入图片描述
REPOSITORY: 镜像的名字
TAG: 镜像版本
IMAGE ID: 镜像ID(唯一)
CREATED: 创建时间
SIZE: 镜像的大小
注:在docker中描述一个镜像的时候,必须用
镜像名:版本号(TAG)
的方式来描述。如果TAG为latest,TAG可以省略不写。即:ubuntu 等价于 ubuntu:latest
1.4 镜像的别名
$ docker tag 现在的名字:tag 别名:tag
不同的名字对应的ID相同。镜像并没有复制, 只是多了一个别名而已。
镜像名中必须是小写字母。
1.5 镜像的删除
$ docker rmi [OPTIONS] 镜像名/镜像ID
- 如果镜像有别名, 只能够按照镜像名:tag 进行删除, 不能根据ID进行删除;
- 如果镜像有多个名字, 删除任意一个名字,如果镜像有多个名字,删除任意一个名字,名字会删除,镜像还在;
- 当镜像只剩下一个名字的时候,对其进行删除,镜像可被删除。当镜像只剩下一个名字的时候,对其进行删除,镜像可被删除;
-
可以一次删除多个镜像。
在这里插入图片描述
1.6 镜像的导入和导出
像将自己仓库中的镜像文件做备份或者传给其他人需要做镜像的导入和导出。
注:镜像存储的仓库目录为/var/lib/docker,但是在该路径下都是很多琐碎的文件,并没有完整的文件。所以不要尝试去路径下直接考走。
导入
$ docker load -i 仓库中的镜像名
$ docker load < 仓库中的镜像名
在这里插入图片描述
导出
# 将本地仓库中的镜像导出的磁盘目录
$ docker save -o 导出之后镜像名字(自己起名) 仓库中的镜像名
1.7 镜像的历史和详细信息
# 制作镜像的时候的操作步骤
$ docker history 仓库中的镜像名
在这里插入图片描述
# 镜像的属性信息, 以json格式输出的
$ docker inspect 镜像名/镜像ID
关于Docker --format 格式化输出概要操作说明可访问:https://yq.aliyun.com/articles/230067
2 Docker的容器管理
启动Docker的镜像文件就会得到一个容器。一个容器可以被看做一个运行的操作系统。
启动的每个容器都是一个进程。
2.1 容器的查看
# 命令, 只能看到正在运行的容器的状态
$ docker ps
#参数:
# -a, --all: 显示所有容器, 默认只显示running状态的
# -q, --quiet: 只显示容器ID
在这里插入图片描述
CONTAINER ID: 容器启动之后的ID, 唯一;
IMAGE: 当前容器是基于那个镜像启动的;
COMMAND: 容器启动之后, 默认执行了什么命令;
CREATED: 容器的创建时间;
STATUS: 容器当前状态。容器一共有四种状态:
- created: 容器被创建, 但是不能使用
- runing: 运行状态
- pause: 暂停状态
- exited: 终止运行
PORTS: 映射端口,具体指主机和容器之间的端口映射;
NAMES: 容器启动之后的名字, 如果没有指定, 会随机生成一个, 这个名字不能重复。
2.2 容器的创建
容器被创建, 但是还不能使用,需要启动!
$ docker create [OPTIONS] 仓库中的镜像名 [COMMAND]
# OPTIONS:
# -a, --attach list 给容器关联 STDIN, STDOUT or STDERR
# -t, --tty: 给容器绑定终端
# -i, --interactive: 关联标准输入
# --rm: 容器终止运行的时候, 自动被删除
# --name string: 手动指定容器的名字
# COMMAND: 可以不写, 或许写个bash
# 例子
$ docker create -it --rm --name myubuntu ubuntu bash
在这里插入图片描述
可见创建后的容器并不是运行状态,需要docker ps -a 才可以显示出来。
2.3 启动创建的容器
$ docker start [OPTIONS] 容器名或者容器ID [CONTAINER...]
OPTIONS:
-a, --attach Attach STDOUT/STDERR and forward signals
-i, --interactive Attach container's STDIN
# 例子
$ docker start -i ubuntu
在这里插入图片描述
启动后,直接进入容器内的系统中
2.4 创建并启动容器
docker run 等价于 docker create + docker start ,一般开发中都使用docker run
# 通过一个命令创建容器, 并且启动
$ docker run [OPTIONS] 仓库中的镜像名 [COMMAND]
# OPTIONS:
# -d, --detach: 以守护进程的形式运行
# -a, --attach list 给容器关联 STDIN, STDOUT or STDERR
# -t, --tty: 给容器绑定终端
# -i, --interactive: 关联标准输入
# --rm: 容器终止运行的时候, 自动被删除
# --name string: 手动指定容器的名字
在这里插入图片描述
创建并运行。参数-d是docker run特有的,即启动容器后并不进入容器。
2.5 容器的暂停和重启
# 暂停
$ docker pause 容器名或ID [CONTAINER...]
# 取消暂停
$ docker unpause 容器名或ID [CONTAINER...]
# 重启
$ docker restart [OPTIONS] 容器名或ID [CONTAINER...]
# Options:
# -t, --time int: 延时时间, 默认10s
重启容器后,其STATUS选项重新从0开始计时。
这三个指令都可以接多个容器。
pause后容器状态为paused,unpause和restart后容器状态为running。
2.6 容器的关闭、终止和删除
# 关闭容器:状态, 容器还在, 有延时
$ docker stop [OPTIONS] 容器名或ID [CONTAINER...]
# Options:
# -t, --time int: 延时时间, 默认10s
关闭容器后,状态从running变成exited。
在这里插入图片描述
# 终止容器:容器还在, 直接关闭, 没有延时
$ docker kill [OPTIONS] 容器名或ID [CONTAINER...]
# Options:
# -s, --signal string: 指定发出的信号, 一般不用
终止容器后,状态从running变成exited。
# 删除未运行的容器
$ docker rm 容器名或ID
# 删除运行中的容器
$ docker rm 容器名或ID -f
# 批量删除容器(二者均可)
$ docker rm $(docker ps -aq) -f
$ docker rm `docker ps -aq` -f
关于批量删除容器的解释:
docker ps -aq 是显示当前所有的容器的ID。把这个返回值作为docker rm 的一个参数,达到一键删除所有容器的功效。
这个需要记住,在开发中很有用!
2.7 容器的进入和退出
# 创建并启动容器。前面提到过,例子如下:
$ docker run -itd --rm --name myubuntu ubuntu bash
# 手动进入容器中
$ docker exec [OPTIONS] 容器名字或ID COMMAND [ARG...]
# OPTIONS:
# -i, --interactive 保持与标注输入的连接
# -t, --tty 将容器与终端绑定
# COMMAND: shell指令 -> bash
# [ARG...]: shell命令的参数
注:docker run这种创建、启动并直接进入容器的方式使用频率很低。建议多多使用docker exec这种方式。如果docker exec不加-it参数,在终端将无法显示出进入容器的效果。
同时COMMAND位置这次不是可选填项。没有任何操作,请添bash。
在这里插入图片描述
# 容器内输入
$ exit
# 或直接按Ctrl+D,均可退出容器
2.8 容器的日志、信息、端口和重命名
# 查看容器日志
$ docker logs 容器名或ID
# 查看容器的详细信息
$ docker inspect 容器名或ID
# 查看本机和容器的端口映射
$ docker port 容器名或ID
# 容器重命名
$ docker rename 容器名 新的容器名
在这里插入图片描述
- 容器运行一段时间后才会有日志生成,。如果没有生成, 是看不到的;
- 查看容器详细信息返回的是json对象。关于输出格式的设定,可查阅:https://yq.aliyun.com/articles/230067
2.9 基于容器的镜像导入和导出
导出容器的镜像文件
# 第一种
$ docker export -o 导出的镜像的名字(自定义) 容器名或ID
# 第二种
$ docker export 容器名或ID > 导出的镜像的名字(自定义)
镜像导入到本地的镜像仓库中
$ cat 要导入的镜像文件 | docker import - 新的镜像名:tag
在这里插入图片描述
2.10 对比
docker save 和 docker export:
- 使用save是基于仓库内的镜像导出文件, 不能对镜像进行修改;
- export通过容器导出, 原始镜像可以通过启动容器进行修改;
- 通过export导出镜像, 会丢失镜像的历史记录;
- 如果没有通过容器对进行做任何修改, export导出的镜像小。
docker load 和 docker import:
- 都是将导出的镜像导入到本地镜像仓库;
- 如果使用load进行导入: 镜像名无法修改;
- 如果使用import进行导入: 镜像名是可以修改的。
在网上找到一个图把这些指令的操作关系描述的很到位。最后分享给大家:
在这里插入图片描述
ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。