文档章节

Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)

CloudMAN
 CloudMAN
发布于 2017/05/10 06:38
字数 729
阅读 213
收藏 1

Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。

第一个 Dockerfile

用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为:

70.png

下面我们运行 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 下载的镜像会有这个问题。

下一节我们学习镜像的缓存特性。

二维码+指纹.png

© 著作权归作者所有

共有 人打赏支持
CloudMAN
粉丝 515
博文 360
码字总数 221704
作品 0
海淀
私信 提问
使用Dockerfile构建镜像-Docker for Web Developers(5)

1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAINER 该容器维护作者,一般是作者的电子邮件 MA...

最美的回忆
2017/11/21
0
0
每天5分钟玩转Docker容器技术(四)

每天5分钟玩转Docker容器技术(一) 每天5分钟玩转Docker容器技术(二) 每天5分钟玩转Docker容器技术(三) 镜像的缓存特性 Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经...

阿里云云栖社区
01/04
0
0
每天5分钟玩转Docker容器技术(三)

每天5分钟玩转Docker容器技术(一) 每天5分钟玩转Docker容器技术(二) base 镜像 上一节我们介绍了最小的 Docker 镜像,本节讨论 base 镜像。 base 镜像有两层含义: 不依赖其他镜像,从 ...

阿里云云栖社区
2017/12/27
0
0
最小的镜像 - 每天5分钟玩转Docker容器技术(9)

镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。 本章内容安排如下: 首先通过研究几个典型的镜像,分析镜像的内部结构。 然后学习如何构建自己的镜像。 最后介绍怎...

cloudman6
2017/12/22
0
0
运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)

上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd 部署 service 的命令形式与运行容器的 很相似, ...

CloudMan6
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
55分钟前
0
0
Spring boot中如何获取profiles环境

  实现ApplicationContextAware @Componentpublic class QiNiuPropertiesConfig implements ApplicationContextAware { /// 获取当前环境public String getActiveProfile() { ret......

writeademo
今天
3
0
机器学习中的End-to-End到底是怎么回事?

简单讲就是,Input--->系统(这里指神经网络)--->Output(直接给出输入,NN神经网络就给出结果,一气喝成!!!) 借用一段对话:(http://dy.163.com/v2/article/detail/C3J6F2NJ0511AQHO....

火力全開
今天
2
0
maven多个模块只编译并且只打包指定的模块

在多module的maven项目中,如果每次打包整个工程显得有些冗余和笨重。 命令:mvn clean package install -pl 模块的名称 -am

lifes77
今天
0
0
eosjs中文手册【2.0】

访问地址:eosjs 2.0 中文手册 - 汇智网

汇智网教程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部