17 | 容器镜像构建的那些事儿
王潇俊
该思维导图由 AI 生成,仅供参考
随着容器发布越来越流行,持续交付最后一公里的产物,逐渐由之前的代码包变成了容器镜像。然而,容器镜像构建与传统的代码构建有很多不同之处,也增加了很多新鲜的技术领域和内容需要我们去学习。
所以,今天我们就一起来聊聊容器镜像构建的那些事儿,打通容器镜像构建的各个环节。
什么是容器镜像?
在虚拟机时代就有镜像的说法,当我们创建一个虚拟机时,通常会去网上下载一个 ISO 格式的虚拟机镜像,然后经过 VirtualBox 或者 VMware 加载,最终形成一个包含完整操作系统的虚拟机实例。
而容器镜像也是类似的意思,只不过它不像虚拟机镜像那么庞大和完整,它是一个只读的模板,一个独立的文件系统,包含了容器运行初始化时所需要的数据和软件,可以重复创建出多个一模一样的容器。
容器镜像可以是一个完整的 Ubuntu 系统,也可以是一个仅仅能运行一个 sleep 进程的独立环境,大到几 G 小到几 M。而且 Docker 的镜像是分层的,它由一层一层的文件系统组成,这种层级的文件系统被称为 UnionFS。下图就是一个 Ubuntu 15.04 的镜像结构。
图中的镜像部分画了一个锁的标记,它表示镜像中的每一层都是只读的,只有创建容器时才会在最上层添加一个叫作 Container layer 的可写层。容器运行后的所有修改都是在这个可写层进行,而不会影响容器镜像本身。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了容器镜像构建的重要性和基本概念,以及Dockerfile的作用和优化方法。容器镜像是一个只读的模板,可以重复创建出多个一模一样的容器,而Docker的镜像是分层的,由一层一层的文件系统组成。Dockerfile通过文本格式的配置文件描述镜像,可以通过运行docker build将这些指令转化为镜像。文章还介绍了镜像构建的优化方法,包括选择合适的Base镜像、减少不必要的镜像层的产生以及充分利用指令的缓存。此外,还介绍了两种用容器构建容器镜像的方式:Docker Out Of Docker(DooD)和Docker In Docker(DinD)。通过本文的介绍,读者可以快速了解容器镜像构建的基本概念和关键步骤,以及如何优化镜像构建过程。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《持续交付 36 讲》,新⼈⾸单¥59
《持续交付 36 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- knightray请教一个问题。如果使用Jenkins pipeline + Docker的方式,这是否意味着每次测试环境的构建都需要生成镜像?如果是传统的构建方式,只需要编译生成jar/war包就可以了,现在加上生成镜像这一步,构建耗时增加了不少。请问这有没有更好的解决办法?
作者回复: 其实不会增加很多时间的,文章中也解释了,docker的原理是分层的文件系统。一般我们是在基础镜像之上做的发布镜像。下载也是下载的差异那层。差异那部分就是代码和一些配置,以java来说最多百兆吧,携程应用的镜像时间最多的也就分钟内吧
2018-09-114 - 暴风之前说错了,不是kibana,是kaniko。这俩名字容易搞混2018-08-134
- 雅各布千万别去碰dind, 绝对是个坑2024-01-04归属地:福建
- 箫潇2. ADD 命令与 COPY 命令:Dockerfile 没有发生任何改变,但是命令ADD run.sh / 中 Dockerfile 当前目录下的 run.sh 却发生了变化,从而将直接导致镜像层文件系统内容的更新,原则上不应该再使用 cache。那么,判断 ADD 命令或者 COPY 命令后紧接的文件是否发生变化,则成为是否延用 cache 的重要依据。Docker 采取的策略是:获取 Dockerfile 下内容(包括文件的部分 inode 信息),计算出一个唯一的 hash 值,若 hash 值未发生变化,则可以认为文件内容没有发生变化,可以使用 cache 机制;反之亦然。2021-05-17
- 戴斌Docker镜像的版本效果适合后续的维护,减少系统配置、系统环境依赖等无版本控制的风险2020-03-22
- 暴风对于第一个问题,还可以用谷歌出的kibana2018-08-11
收起评论