镜像
查看镜像信息
docker image ls
或 docker images
查看所有镜像加 -a
参数
docker image ls -a
查看虚悬镜像(没有仓库名没有标签的镜像)
docker image ls -f dangling=true
获取镜像
docker pull IMAGE[:TAG]
其中IMAGE可以为标签或ID
如果不显示地指定TAG,则默认会选择latest标签如果不显示地指定TAG,则默认会选择latest标签
删除镜像
docker iamge rm IMAGE [IMAGE...]
或 docker rmi IMAGE [IMAGE...]
注意:当有该镜像创建的容器存在时(无论该容器正在运行中还是已经停止),镜像文件默认是无法被删除的。
如果想要强行删除镜像,可以使用 -f
参数:docker rmi -f IMAGE
。但不推荐使用 -f
参数强制删除,因为这样往往会造成一些遗留问题。假设我们使用 -f
参数强制删除,再次使用 docker images
命令查看本地镜像情况,会发现一个标签为
因此,正确的做法是,先删除依赖该镜像的所有容器,再删除该镜像。
创建镜像
创建镜像的方式有三种:
基于已有镜像的容器创建(每一次commit都会提交一层, 有点像git的每一次commit, 会保留每一次的记录)
docker commit [OPTIONS] CONTAINERS [REPOSITORY[:TAG]]
基于本地模板导入, –> 即导入容器快照
基于Dockerfile创建创建镜像(使用指令构建, 每个指令构建一层)
FROM IMAGE
RUN <命令>
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM
和 RUN
。
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch
。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
多个命令应该串联起来
FROM debian:stretch
RUN buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
首先,之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。因此没有必要建立很多层,这只是一层的事情。因此,这里没有使用很多个 RUN
对一一对应不同的命令,而是仅仅使用一个 RUN
指令,并使用 &&
将各个所需命令串联起来。不应该使用多个 RUN
指令,每一个指令会生成一层,而是串联命令简化为了 1 层。在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。
并且,这里为了格式化还进行了换行。Dockerfile 支持 Shell 类的行尾添加 \
的命令换行方式,以及行首 #
进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。
此外,还可以看到这一组命令的最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt
缓存文件。这是很重要的一步,我们之前说过,镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。
保存和载入镜像
可以使用 docker save
和 docker load
命令来存出和载入镜像
保存镜像
docker save -o TARGET_FILE IMAGE:TAG
载入镜像
docker load --input TARGET_FILE
上传镜像到仓库
docker push IMAGE[:TAG]
给镜像打标签, 标记本地镜像, 将其归入某一仓库。
例: 将镜像 ubuntu:18.04 标记为 cymok/ubuntu:v1 镜像。
docker tag ubuntu:18.04 cymok/ubuntu:v1
容器
新建并启动容器
docker run IMAGE
启动并绑定标准输入, -t
绑定标准输入, -i
则让容器的标准输入保持打开
docker run -t -i IMAGE
启动已终止容器
docker container start CONTAINER
重启已启动容器
docker container restart CONTAINER
后台运行, 加参数-d
docker run -d IMAGE
查看运行中容器信息
docker container ls
获取容器的输出信息
docker container logs
终止容器
docker container stop
查看所有容器信息, 可以看到终止的容器
docker container ls -a
进入容器
在使用 -d 参数时,容器启动后会进入后台
某些时候需要进入容器进行操作,包括使用 docker attach
命令或 docker exec
命令,推荐大家使用 docker exec
命令,原因会在下面说明。
attach 命令
docker attach CONTAINER
注意: 如果从这个 stdin 中 exit,会导致容器的停止。
exec 命令
docker exec
后边可以跟多个参数,这里主要说明 -i
-t
参数。
只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
如果从这个 stdin 中 exit,不会导致容器的停止。这就是为什么推荐大家使用 docker exec
的原因。
导出容器
docker export CONTAINER > TARGET_FILE
导入容器快照
可以使用 docker import 从容器快照文件中导入为镜像,例如
cat TARGET_FILE | docker import - IMAGE:TAG
此外,也可以通过指定 URL 或者某个目录来导入,例如
docker import http://example.com/exampleimage.tgz IMAGE:TAG
注:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用 docker container rm
来删除一个处于终止状态的容器。例如
docker container rm CONTAINER
如果要删除一个运行中的容器,可以添加 -f
参数。Docker 会发送 SIGKILL 信号给容器。
清理所有处于终止状态的容器
docker container prune
参考资料