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

14|容器化:如何将镜像体积缩减 90%?

你好,我是王炜。今天是我们容器化实践的第二课。
容器化的学习曲线是非常陡峭的,对于初学 Docker 的同学来说,短时间内很难针对已有业务编写合适的 Dockerfile。所以上节课,我直接给出了不同语言接近生产可用的 Dockerfile,但我并没有深入介绍里面涉及的一些构建技巧。
在这些案例中,我用到最多的就是通过“多阶段”的方式来构建镜像,但是对于“多阶段构建”,我们只知道了它的具体用法,并没有解释为什么要使用它。
在一般情况下,只知道“多阶段构建”的用法也是可以的。不过在现实生产过程中,我们可能面临一系列问题,例如,由于对镜像构建过程不够熟悉,很容易出现构建慢、构建镜像过大等问题,这会导致推送镜像变得缓慢,同时也会导致在 Kubernetes 更新应用镜像版本时拉取镜像的过程也变得缓慢,从而影响整体应用发布效率。所以,如何进一步借助多阶段构建来优化镜像大小就显得非常重要了。
这节课,我将带你深入了解“多阶段构建”,通过具体的实践,进一步理解它的最重要特性之一:减小镜像体积。在缩减镜像的实战过程中,我还会为你解释在上一节课用到的其他构建技巧。
在正式开始今天的学习之前,你需要确保已经在本地安装了 Docker,并将我提前准备好的示例应用仓库克隆到本地:https://github.com/lyzhang1999/gitops.git
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过实际操作和技术讲解,向读者介绍了如何通过多阶段构建来缩减容器镜像体积,并优化镜像大小的方法和技巧。作者以构建Golang镜像为例,展示了减小镜像体积的具体方法,包括更换基础镜像和多阶段构建。文章强调了多阶段构建的重要性,以及如何利用这一技术特点来优化镜像大小,提高应用发布效率。此外,还介绍了如何进一步压缩镜像大小,使用Alpine镜像作为第二阶段的运行镜像,以及如何复用构建缓存以加速镜像构建过程。总之,本文为读者提供了优化容器镜像大小的有效方法和技巧,对于需要深入了解镜像优化的技术人员具有重要参考价值。

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

全部留言(9)

  • 最新
  • 精选
  • includestdio.h
    1.不加[]代表用 /bin/sh 执行 /opt/app/example ,由于 scratch 是空镜像,所以会报错:exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown.(加[]代表为 ENTRYPOINT 提供参数) 2.去掉 CGO_ENABLED=0 启动容器后会提示:exec user process caused: no such file or directory,alpine 更换 ubuntu 后运行正常。原因:因为 alpine 镜像中没有 glibc ,不禁用 CGO 的话编译会失败,不会产生二进制文件,所以最终CMD ["/opt/app/example"] 会报错:no such file or directory(而 ubuntu 本身包含 glibc ,不禁用 CGO 编译也是正常的)

    作者回复: 👍🏻非常正确!

    2023-01-09归属地:广东
    2
    15
  • 争光 Alan
    Alpine 能压缩大小,但也会引入很多问题 1. 新的操作系统的安全补丁维护 2. bug,比如glibc的导致的很多问题 这一块再具体落地的时候怎么抉择呢?

    作者回复: 是的,Alpine 的c 语言库差异会导致很多奇怪的问题。 生产实践上还是推荐用标准的 Linux 发行版镜像,比如 ubuntu,debian 之类的,此外,slim 版本的镜像在大部分场景已经很小了,没必要追求极限的镜像大小。

    2023-01-10归属地:广东
    1
  • 农民园丁
    请问老师,spring-boot的构建方法环能优化吗?之前的占了284MB。

    作者回复: 可以的,下一节课的内容有提到。

    2023-01-09归属地:广东
    1
  • jeffery
    问题1 更改后 image 可以正常构建 但run报错 docker: Error response from daemon: failed to create shim: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown. ERRO[0000] error waiting for container: context canceled 问题2 删除CGO_ENABLED=0 后启动 docker run --publish 8080:8080 delete exec /opt/app/example: no such file or directory 镜像构建后大小 delete latest d968f205c52d 8 minutes ago 13.9MB delete1 latest cb6a0e65cda9 34 minutes ago 84.7MB Alpine 不带常规debug 命令

    作者回复: 👍🏻可以继续深入调查一下第一个问题为什么两种写法会有差异。

    2023-01-09归属地:广东
    3
    1
  • Kyle
    这一期听得相当爽,可以说是极致的体积优化了

    作者回复: 感谢对课程的认可!

    2023-04-20归属地:湖北
  • 0ck0
    比较关心 python 业务的镜像如何优化

    作者回复: 下一讲里有提到,主要是选择合适的基础镜像。

    2023-01-11归属地:北京
  • 哈德韦
    如果是 JAVA 应用,如果利用构建缓存呢?另外先 COPY 依赖,会不会导致宿主机的依赖文件不适配 Docker 里的依赖呀?
    2023-11-07归属地:浙江
  • 哈德韦
    Dockerfile 开头的 # syntax=docker/dockerfile:1 是什么意思?是用来指示语法高亮的,还是类似 Shebang 的?
    2023-11-07归属地:浙江
  • 橙汁
    我艹 scrtch是什么,竟然还有这种镜像 学到了,目前项目用啥镜像的都有 debian alpine ubuntu 真是乱七八糟的,镜像就是还缺点基础工具 比如ping ip 等这些不同底包里面的基础包也不同,安装后镜像其实也挺大,还比较期待周三 alpine的glibc和m什么的之前就一直没懂
    2023-01-09归属地:北京
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部