Dockerfile 构建镜像 – 每天5分钟玩转容器技术(13)
下面我们运行 docker build 命令构建镜像并详细分析每个细节。
root@ubuntu:~# pwd ①
/root
root@ubuntu:~# ls ②
Dockerfile
root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile . ③
Sending build context to Docker daemon 32.26 kB ④
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 下载的镜像会有这个问题。
下一节我们学习镜像的缓存特性。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/54038.html
DockerUbuntu相关文章
- 使用 Linux 网络虚拟化技术探究容器网络原理
- 一篇搞懂容器技术的基石: cgroup
- eBPF,一个颠覆容器监控的技术
- ATEC 2022 带着一百多万奖金又双叒叕来了,技术大牛等你来战
- Oracle 数据分区的技术指南(oracle怎么分区)
- Oracle技术引领未来明日(oracle明日科技)
- Oracle建立Link的技术指南(oracle建link)
- MySQL列连接技术:实现多表数据查询(mysql列连接)
- 高可用集群介绍入门以及实现技术
- 在 overlay 中运行容器 – 每天5分钟玩转 Docker 容器技术(51)
- 容器间通信的三种方式 – 每天5分钟玩转 Docker 容器技术(35)
- 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)
- 运行容器的最佳实践 – 每天5分钟玩转 Docker 容器技术(24)
- 构建镜像 – 每天5分钟玩转容器技术(12)
- base 镜像 – 每天5分钟玩转容器技术(10)
- Linux 容器技术史话:从 chroot 到未来
- 容器技术和 K8S 的下一站
- C开发招聘Linux:寻找拥有技术热情的工程师(c开发招聘linux)
- Linux: 用过滤技术实现数据安全(linux过滤关键字)
- MySQL中索引技术的奇妙作用(mysql 中 的索引)
- 利用Oracle技术优化内存查询(oracle使用内存查询)