要想自动构建 Docker 镜像,你需要通过一个名为 Dockerfile 的说明文件来描述镜像构 建的步骤。这个文本文件使用一组指令来描述以下各项内容:新镜像的基础镜像,为 了安装不同的依赖和应用程序需要执行哪些操作步骤,镜像中需要提供哪些文件,这 些文件是怎么复制到镜像中的,要暴露哪些端口,以及在新的容器中启动时默认运行 什么命令,此外还有一些其他的内容。为了对此进行说明,让我们开始编写我们的第一个 Dockerfile。从该 Dockerfile 构建的 镜像启动新的容器时,会执行 /bin/echo 命令。在当前工作目录中创建一个名为 Dockerfile 的文本文件,文件内容如下所示。 

FROM ubuntu:14.04 
ENTRYPOINT ["/bin/echo"]


FROM 指令指定了新的镜像以哪个镜像为基础开始构建。这里我们选择了 ubuntu:14.04 镜像作为基础镜像。ubuntu:14.04 是来自 Docker Hub 上由 Ubuntu 官方提供的镜像仓库 (https://registry.hub.docker.com/_/ubuntu/)。ENTRYPOINT 指令设置了从该镜像创建的 容器启动时需要执行的命令。要想构建这个镜像,可以在命令行提示符下键入 docker build . 命令,如下所示。



$ docker build . 
Sending build context to Docker daemon 2.56 kB Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04 ---> 9bd07e480c5b
Step 1 : ENTRYPOINT /bin/echo ---> Running in da3fa01c973a ---> e778362ca7cf Removing intermediate container da3fa01c973a Successfully built e778362ca7cf $ docker images REPOSITORY TAG IMAGE ID ... VIRTUAL SIZE <none> <none> e778362ca7cf ... 192.7 MB ubuntu 14.04 9bd07e480c5b ... 192.7 MB

 现在就可以基于新构建的镜像启动容器了,你需要指定刚刚创建的镜像的 ID 并指定一 个参数(即 Hi Docker !),如下所示。 

$ docker run e778362ca7cf 

Hi Docker ! Hi Docker ! 

非常神奇,你在新容器中执行了 echo 命令!这里你基于上面由只有两行的 Dockerfile

构建的镜像创建了一个容器,该容器开始运行并执行了由 ENTRYPOINT 指令所定义的 命令。当这个命令结束之后,容器的工作也即告结束并退出。如果再次运行上述命令 但是不指定任何参数,那么就不会有任何内容回显出来,如下所示。

$ docker run e778362ca7cf

你也可以在 Dockerfile 文件中使用 CMD 指令。使用该指令的优点是,你可以在启动容 器时,通过在 docker run 命令后面指定新的 CMD 参数来覆盖 Dockerfile 文件中设置 的内容。让我们使用 CMD 指令来构建一个新镜像,如下所示。

FROM ubuntu:14.04 CMD ["/bin/echo" , "Hi Docker !"]

构建这个镜像并运行它,如下所示。

$ docker build . ... $ docker run eff764828551 Hi Docker !

在上面的构建命令中,我们指定了当前文件夹路径。这时候 Docker 会自动 使用刚才创建的 Dockerfile 文件。如果希望在构建镜像的时候使用在其他位置保 存的 Dockerfile,可以使用 docker build 命令的 -f 参数来指定 Dockerfile 文件 的位置。

上面的操作看起来与之前的例子一模一样,但是,如果在 docker run 命令后面指定 一个其他的可执行命令,那么该命令就会被执行,而不是执行在 Dockerfile 文件中定 义的 /bin/echo 命令,如下所示。

上面的操作看起来与之前的例子一模一样,但是,如果在 docker run 命令后面指定 一个其他的可执行命令,那么该命令就会被执行,而不是执行在 Dockerfile 文件中定 义的 /bin/echo 命令,如下所示。

$ docker run eff764828551 /bin/date Thu Dec 11 02:49:06 UTC 2014

Dockerfile 是一个文本文件,它定义了一个镜像是如何构建的,以及基于该镜像创建的 容器运行时会进行什么处理。通过 FROM、ENTRYPOINT 和 CMD 这三个简单的指令,你 已经可以构建一个能完全正常工作的镜像了。当然,我们在该范例中也只是介绍了这 三个指令而已,你可以通过阅读Dockerfile参考手册 (https://docs.docker.com/reference/builder/)学习一下其他指令,或者在范例 2.4 中看一 个更详细的例子。

CentOS 项目维护着很多 Dockerfile 的例子。可以在该项目的代码仓库 (https://github.com/CentOS/CentOS-Dockerfiles)中查看这些例子,并通过运行其 中的一些例子来加深对 Dockerfile 文件的理解。