Dockerfile 是一个文本文件,记录了镜像构建的全部步骤。docker
第一个 Dockerfileubuntu
用 Dockerfile 建立上节的 ubuntu-with-vi,其内容则为:vim
下面咱们运行 docker build 命令构建镜像并详细分析每一个细节。缓存
root@ubuntu:~# pwd ① 学习
/root ui
root@ubuntu:~# ls ② .net
Dockerfile code
root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile . ③ get
Sending build context to Docker daemon 32.26 kB ④ dockerfile
Step 1 : FROM ubuntu ⑤
---> f753707788c5
Step 2 : RUN apt-get update && apt-get install -y vim ⑥
---> Running in 9f4d4166f7e3 ⑦
......
Setting up vim (2:7.4.1689-3ubuntu1.1) ...
---> 35ca89798937 ⑧
Removing intermediate container 9f4d4166f7e3 ⑨
Successfully built 35ca89798937 ⑩
root@ubuntu:~#
① 当前目录为 /root。
② Dockerfile 准备就绪。
③ 运行 docker build 命令,-t
将新镜像命名为 ubuntu-with-vi-dockerfile
,命令末尾的 .
指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,咱们也能够经过 -f
参数指定 Dockerfile 的位置。
④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的全部文件发送给 Docker daemon。build context 为镜像构建提供所须要的文件或目录。
Dockerfile 中的 ADD、COPY 等命令能够将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root
,该目录下的全部文件和子目录都会被发送给 Docker daemon。
因此,使用 build context 就得当心了,不要将多余文件放到 build context,特别不要把 /
、/usr
做为 build context,不然构建过程会至关缓慢甚至失败。
⑤ Step 1:执行 FROM
,将 ubuntu 做为 base 镜像。
ubuntu 镜像 ID 为 f753707788c5。
⑥ Step 2:执行 RUN
,安装 vim,具体步骤为 ⑦、⑧、⑨。
⑦ 启动 ID 为 9f4d4166f7e3 的临时容器,在容器中经过 apt-get 安装 vim。
⑧ 安装成功后,将容器保存为镜像,其 ID 为 35ca89798937。
这一步底层使用的是相似 docker commit 的命令。
⑨ 删除临时容器 9f4d4166f7e3。
⑩ 镜像构建成功。
经过 docker images 查看镜像信息。
镜像 ID 为 35ca89798937,与构建时的输出一致。
在上面的构建过程当中,咱们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操做,并经过 commit 保存为新的镜像。
查看镜像分层结构
ubuntu-with-vi-dockerfile 是经过在 base 镜像的顶部添加一个新的镜像层而获得的。
这个新镜像层的内容由 RUN apt-get update && apt-get install -y vim
生成。这一点咱们能够经过 docker history
命令验证。
docker history
会显示镜像的构建历史,也就是 Dockerfile 的执行过程。
ubuntu-with-vi-dockerfile 与 ubuntu 镜像相比,确实只是多了顶部的一层 35ca89798937,由 apt-get 命令建立,大小为 97.07MB。docker history 也向咱们展现了镜像的分层结构,每一层由上至下排列。
注: 表示没法获取 IMAGE ID,一般从 Docker Hub 下载的镜像会有这个问题。
下一节咱们学习镜像的缓存特性。