云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

15|容器化:如何选择最适合业务的基础镜像?

你好,我是王炜。
在上一节课,我们介绍了缩小镜像体积的有效方法,其中包括更换基础镜像和多阶段构建。在编写多阶段构建的 Dockerfile 时,我推荐你使用 ubuntu:latest 镜像作为第二阶段的基础镜像,不推荐你在生产环境下使用 Alpine 或者 Scratch 镜像。
这是为什么呢?
归根结底,Docker 镜像包含了运行环境和业务应用。我们在镜像构建过程中,需要从程序依赖、可调试(开发)、安全性和镜像大小方面综合考虑。由于镜像大小的优先级并不是最高的,因此我们首先要保证的是程序的运行及其依赖的完整性,没必要一味地追求大小的极限。
但是,在业务容器化的过程中,基础镜像的数量非常多,每一种编程语言的实践都有所不同,我们又该如何选择基础镜像呢?如何避免选择错误的镜像埋下隐患?
这节课,我们就延伸一下上节课的内容,看看镜像选择的实践。

通用镜像

我们知道,镜像并不是从头开始构建的,我们会基于一个基础镜像来构建,这个基础镜像包含编译工具和运行环境,它负责构建和运行我们的业务代码。
例如,在上节课多阶段构建的第二个阶段,我们用了 ubuntu:latest 为 Golang 应用提供运行环境,也就是在 Dockerfile 中通过 FROM 关键字引用 ubuntu:latest 为基础镜像。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在容器化过程中选择适合业务的基础镜像是至关重要的一环。本文通过介绍通用镜像和专用镜像的概念,以及针对不同语言的镜像选择建议,为读者提供了宝贵的指导。对于通用镜像,作者推荐了ubuntu:latest、debian:slim和alpine:latest这三个镜像,并强调了在选择镜像时需要考虑通用性、可调式、安全和镜像大小等因素。对于专用镜像,以Golang和Java为例,作者介绍了如何选择合适的镜像组合,并指出了在选择Alpine镜像时需要注意的问题。总的来说,本文通过实际案例和技术细节,帮助读者了解了如何在容器化过程中选择最适合业务的基础镜像。文章还提出了一些思考题,鼓励读者分享自己在构建业务镜像过程中的经验,为读者提供了更多交流和学习的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • includestdio.h
    以前整理的关于 dockerfile 的最佳实践: 1. 不安装无效软件包 2. 理想状态下,每个镜像应该只有一个进程 3. 无法避免多进程运行时,应选择合理的初始化进程【1.需要捕获 SIGTERM 信号并完成子进程的优雅终止;2.负责清理退出的子进程以避免僵尸进程 --init 参数】 4. 最小层级数:1.多条 RUN 命令可通过连接符连接成一条指令集以减少层数;2.通过多段构建减少镜像层数 5. 多行参数按字母排序,可以减少可能出现的重复参数,并且提供可读性 6. 把变更频率低的编译指令放在镜像底层,有效利用 build cache【考虑 build cache 下层失效,上层同步失效的机制】 7. 复制文件时,每个文件应独立复制,确保某个文件变更时,只影响该文件对应的缓存

    作者回复: 很棒的总结👍🏻,例如提到的多阶段构建和复制文件都是在实际使用场景用的很多的。

    2023-01-11归属地:陕西
    8
  • jeffery
    优化镜像大小 FROM 适合业务基础镜像 减少镜像层 清理无用数据 使用.dockerignore忽略构建镜像时非必需的文件 多阶段构建

    作者回复: 👍🏻很完整的总结~

    2023-01-11归属地:陕西
    2
  • Jich
    老师,有一个问题,多阶段构建,在对应多环境的话,是不是会存在发布效率上的问题。我们现在是在DEV环境编译完之后,直接可以用这个镜像发布test或生产。如果使用多阶段构建的话,是不是意味着我在每个环境都会要执行编译的阶段。

    作者回复: 使用多阶段构建不影响原有的镜像发布过程,只是可以帮助你减小镜像大小,构建完成之后仍然走老的流程。

    2023-01-13归属地:上海
    1
  • Geek_d3ac4e
    rust怎么和Python一起变解释型语言了

    作者回复: 抱歉,笔误,稍后修正。

    2023-08-13归属地:广东
  • Geek_c680d7
    老师,有一个问题,现在jdk17的基础镜像太大了,也不提供jre镜像,需要自己导出jre镜像,但是怎么在导出的jre镜像中使用jmap、jstack等命令呢?

    作者回复: 可以制作一个基于 jre 镜像的 dockerfile,并安装这些工具重新打包镜像即可。

    2023-06-08归属地:美国
  • Wisdom
    总结的挺好的,不难理解。老师可以出品快一点吗? :)

    作者回复: 感谢你的认可,固定每周一三五更新,敬请期待~

    2023-01-11归属地:中国香港
  • BertGeek
    1. 编译型语言,使用多阶段构建的确是减少大小的最佳方式 2. 对于h5 前端,nginx-alpine:latest 也可以推荐,我们生产环境大量使用 3. python 解释性,更推荐 python:slim
    2023-10-09归属地:上海
  • 了解每一种镜像的优缺点和使用场景 才能更好的进行选择
    2023-01-11归属地:广东
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部