由于我们没有使用 -f 参数指定 Dockerfile 文件的位置,Docker 引擎将默认使用当前目录下的 Dockerfile 文件进行构建。镜像的名称为 myorg/centos:7.2,其中 myorg 是组织名,但不是必须的。如果你需要将镜像发布到公网去,或者尽可能的避免和别人制作的镜像发生冲突,通常还是建议加上组织名。最后的 . 表示构建位置在当前目录。通常建议将 Dockerfile 和构建所需要的文件放在一个目录下,然后在这个目录下执行构建。由于在构建开始前 Docker 引擎会读取构建目录下的所有文件,为了提高构建速度,请不要将构建中不需要的文件放到构建目录下。下面是执行上述构建命令后的输出,其中 shell 命令的输出内容被裁减掉了:
Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos:7.2.1511 ---> 4cbf48630b46 Step 2/4 : RUN yum install -y telnet kde-l10n-Chinese net-tools vim inetutils-ping unzip && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 && yum clean all ---> Running in 724ac4950fc9 // shell 命令执行的输出 ---> 2703f1dd2526 Removing intermediate container 724ac4950fc9 Step 3/4 : ENV LC_ALL "zh_CN.UTF-8" ---> Running in 2f49ec282e95 ---> f6919bceb45f Removing intermediate container 2f49ec282e95 Step 4/4 : CMD /bin/bash ---> Running in aea69f51eefd ---> e8e1d37c61a1 Removing intermediate container aea69f51eefd Successfully built e8e1d37c61a1 Successfully tagged myorg/centos:7.2Sending build context to Docker daemon 2.048kB 表示在构建开始前,Docker 引擎读取到了构建目录下共有 2.048k 的文件。这里也印证了前文提到的不要将构建无关的文件放到构建目录下,否则会影响构建速度的结论。
Step 1/4 : FROM centos:7.2.1511 表示构建镜像的第一步是使用 centos:7.2.1511 镜像作为基础镜像,由于没有任何变更操作,所以下面输出的 4cbf48630b46 就是原本这个 CentOS 镜像的 ID。如果在构建时本地没有 centos:7.2.1511 这个镜像,那么这里还将输出 Docker 引擎从镜像仓库拉取这个镜像的信息。
Step 2/4 ... 表示构建镜像的第二步是执行这些 shell 命令。其下的 Running in 724ac4950fc9 表示 Docker 引擎启动了一个 ID 为 724ac4950fc9 的容器并在容器内部执行这些操作。接着 ---> 2703f1dd2526 表示这些 shell 命令执行完成后生成了 ID 为 2703f1dd2526 的中间「层」。最后的 Removing intermediate container 724ac4950fc9 表示当中间「层」生成完成后,删除了刚才使用的容器。
Step 3/4 ... 和 Step 4/4 … 表示的意义和 Step 2/4 类似,这里不再赘述。
Successfully built e8e1d37c61a1 表示最终构建出来的镜像 ID 是 e8e1d37c61a1。
Successfully tagged myorg/centos:7.2 表示把镜像的名称设置为了构建命令中指定的 myorg/centos:7.2。
查看镜像构建完成的镜像会直接被 Docker 管理,而不会给我们生成一个文件。使用 docker images 命令可以查看到当前已有的镜像,如下所示:
REPOSITORY TAG IMAGE ID CREATED SIZE myorg/centos 7.2 e8e1d37c61a1 14 minutes ago 272MB centos 7.2.1511 4cbf48630b46 3 months ago 195MB可以看到第一个镜像就是刚才创建的镜像,大小是 272MB,比原本官方的镜像多了 77MB。在制作这个镜像的过程中还生成了 2 个中间「层」,我们可以使用 docker images -a 命令看到它们。
REPOSITORY TAG IMAGE ID CREATED SIZE myorg/centos 7.2 e8e1d37c61a1 18 minutes ago 272MB <none> <none> f6919bceb45f 18 minutes ago 272MB <none> <none> 2703f1dd2526 18 minutes ago 272MB centos 7.2.1511 4cbf48630b46 3 months ago 195MB由于中间「层」没有名字,所以名称和 TAG 都显示为 <none>。你可以尝试使用 docker rmi f6919bceb45f 命令来删除一个中间「层」,你会得到一个如下的错误提示:
Error response from daemon: conflict: unable to delete f6919bceb45f (cannot be forced) - image has dependent child images从上面构建镜像的输出可以看出,f6919bceb45f 这一「层」,即 Step 3/4 这一步生成的「层」被 e8e1d37c61a1 所引用,所以这里不能够直接删除这个中间「层」。回想一下前文的那张镜像层次图中的引用箭头,这就是「层」与「层」直接的引用关系。
使用镜像使用镜像就是利用制作好的镜像来启动容器,如下面的命令:
docker run --name mycontainer myorg/centos:7.2docker run 是启动容器的命令,--name 用于指定容器的名称,最后面是启动容器所使用的镜像名称。命令执行完成后使用 docker ps 查看运行中的容器,这时你会发现并没有任何容器出现;再使用 docker ps -a 查看所有容器将会有如下信息:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4cae07cb40c myorg/centos:7.2 "/bin/bash" Less than a second ago Exited (0) 1 second ago mycontainer