Dockerfile内容:
[root@paas-controller-2-2-0-78:/home/test/app-a]$ cat Dockerfile
# Dockerfile
FROM 10.62.55.202:5000/fakeapp:latest
ADD ./pubsubability.json /data
ADD ./session.json /data
根据Dockerfile制作镜像并分析细节:
[root@paas-controller-2-2-0-78:/home/test/app-a]$ pwd (1)
/home/test/app-a
[root@paas-controller-2-2-0-78:/home/test/app-a]$ ls(2)
Dockerfile pubsubability.json session.json
[root@paas-controller-2-2-0-78:/home/test/app-a]$ docker build -t v1.17.20.03.p03/app-a .(3)
Sending build context to Docker daemon 15.36 kB(4)
Step 1 : FROM 10.62.55.202:5000/fakeapp:latest(5)
---> 13f96805ca76
Step 2 : ADD ./pubsubability.json /data(6)
---> f536f015d39a(7)
Removing intermediate container f7074f54a62f(8)
Step 3 : ADD ./session.json /data(9)
---> d3d52935f6c2(10)
Removing intermediate container 2ee66c46a922(11)
Successfully built d3d52935f6c2(12)
(1)当前目录为/home/test/app-a
(2)构建的基础路径以及文件
(3)运行 docker build 命令,-t 将新镜像命名为v1.17.20.03.p03/app-a,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置
(4)从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /home/test/app-a,该目录下的所有文件和子目录都会被发送给 Docker daemon。所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。
(5)Step 1:执行 FROM,将 10.62.55.202:5000/fakeapp:latest 作为 base 镜像。ubuntu 镜像 ID 为13f96805ca76。
(6)Step 2:执行ADD,将pubsubability.json添加到/data,具体步骤为(6)--(11)
(7)添加文件成功后,将容器保存为镜像,其 ID 为f536f015d39a。这一步底层使用的是类似 docker commit 的命令
(8)删除临时容器f7074f54a62f。
(9)-(11)和(6) -- (8)类似
(12) 镜像构建成功,ID为:d3d52935f6c2。
通过docker images 查看信息:
[root@paas-controller-2-2-0-78:/home/test/app-a]$ docker images |grep d3d52935f6c2
v1.17.20.03.p03/app-a latest d3d52935f6c2 38 seconds ago 324.4 MB
镜像 ID 为 d3d52935f6c2,与构建时的输出一致。
在上面的构建过程中,我们要特别注意指令ADD的执行过程 (6)--(11)。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜像。
查看分层结构:
v1.17.20.03.p03/app-a是通过在 base 镜像的顶部添加一个新的镜像层而得到的。
这个新镜像层的内容由ADD ./pubsubability.json /data和ADD ./session.json /data生成。这一点我们可以通过 docker history 命令验证。
[root@paas-controller-2-2-0-78:/home/test/app-a]$ docker history 10.62.55.202:5000/fakeapp:latest
IMAGE CREATED CREATED BY SIZE COMMENT
13f96805ca76 11 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/service/app" 0 B
11 weeks ago /bin/sh -c #(nop) VOLUME [/core] 0 B
11 weeks ago /bin/sh -c #(nop) ADD file:26436c0d911f74d6aa 6.91 MB
11 weeks ago /bin/sh -c #(nop) ADD file:ea2f496a6bd524e98f 3.518 kB
11 weeks ago /bin/sh -c #(nop) ADD multi:ae9183f69c276aa8a 6.673 kB
11 weeks ago /bin/sh -c mkdir -p data 0 B
11 weeks ago /bin/sh -c mkdir -p service 0 B
11 weeks ago /bin/sh -c #(nop) EXPOSE 8000/tcp 0 B
11 weeks ago /bin/sh -c #(nop) COPY file:ea2f496a6bd524e98 3.518 kB
11 weeks ago /bin/sh -c #(nop) COPY multi:d374f7dc271db3cf 119.7 MB
11 weeks ago /bin/sh -c #(nop) ENV LD_LIBRARY_PATH=/usr/l 0 B
3 years ago /bin/sh -c #(nop) CMD [/bin/bash] 0 B
292 years ago 5.072 MB
292 years ago 1.895 kB
292 years ago 0 B
292 years ago 194.5 kB
292 years ago 192.5 MB
292 years ago 0 B
-------------
[root@paas-controller-2-2-0-78:/home/test/app-a]$ docker history v1.17.20.03.p03/app-a
IMAGE CREATED CREATED BY SIZE COMMENT
d3d52935f6c2 55 seconds ago /bin/sh -c #(nop) ADD file:92005ce62161d91a90 4.98 kB
f536f015d39a 55 seconds ago /bin/sh -c #(nop) ADD file:c74da06a6fc0b379d7 6.683 kB
13f96805ca76 11 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/service/app" 0 B
11 weeks ago /bin/sh -c #(nop) VOLUME [/core] 0 B
11 weeks ago /bin/sh -c #(nop) ADD file:26436c0d911f74d6aa 6.91 MB
11 weeks ago /bin/sh -c #(nop) ADD file:ea2f496a6bd524e98f 3.518 kB
11 weeks ago /bin/sh -c #(nop) ADD multi:ae9183f69c276aa8a 6.673 kB
11 weeks ago /bin/sh -c mkdir -p data 0 B
11 weeks ago /bin/sh -c mkdir -p service 0 B
11 weeks ago /bin/sh -c #(nop) EXPOSE 8000/tcp 0 B
11 weeks ago /bin/sh -c #(nop) COPY file:ea2f496a6bd524e98 3.518 kB
11 weeks ago /bin/sh -c #(nop) COPY multi:d374f7dc271db3cf 119.7 MB
11 weeks ago /bin/sh -c #(nop) ENV LD_LIBRARY_PATH=/usr/l 0 B
3 years ago /bin/sh -c #(nop) CMD [/bin/bash] 0 B
292 years ago 5.072 MB
292 years ago 1.895 kB
292 years ago 0 B
292 years ago 194.5 kB
292 years ago 192.5 MB
292 years ago 0 B
----------------------------------------
docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。
v1.17.20.03.p03/app-a 与10.62.55.202:5000/fakeapp:latest镜像相比,确实只是多了顶部的两层 d3d52935f6c2和f536f015d39a,由ADD 命令创建。docker history 也向我们展示了镜像的分层结构,每一层由上至下排列。