对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积吓到,我只需要一个几 MB 的可执行文件而已,为何镜像的体积会达到 1 GB 以上?本文将会介绍几个奇技淫巧来帮助你精简镜像,同时又不牺牲开发人员和运维人员的操作便利性。本系列文章将分为三个部分:

第一部分着重介绍多阶段构建(multi-stage builds),因为这是镜像精简之路至关重要的一环。在这部分内容中,我会解释静态链接和动态链接的区别,它们对镜像带来的影响,以及如何避免那些不好的影响。中间会穿插一部分对 Alpine 镜像的介绍。链接:Docker 镜像制作教程:减小镜像体积

第二部分将会针对不同的语言来选择适当的精简策略,其中主要讨论 Go,同时也涉及到了 JavaNodePythonRuby 和 Rust。这一部分也会详细介绍 Alpine 镜像的避坑指南。什么?你不知道 Alpine 镜像有哪些坑?我来告诉你。链接:Docker 镜像制作教程:针对不同语言的精简策略

第三部分将会探讨适用于大多数语言和框架的通用精简策略,例如使用常见的基础镜像、提取可执行文件和减小每一层的体积。同时还会介绍一些更加奇特或激进的工具,例如 BazelDistrolessDockerSlim 和 UPX,虽然这些工具在某些特定场景下能带来奇效,但大多情况下会起到反作用。

本文介绍第一部分。

1. 万恶之源


我敢打赌,每一个初次使用自己写好的代码构建 Docker 镜像的人都会被镜像的体积吓到,来看一个例子。

让我们搬出那个屡试不爽的 hello world C 程序:

/* hello.c */
int main () {puts("Hello, world!");return 0;
}

并通过下面的 Dockerfile 构建镜像:

FROM gcc
COPY hello.c .
RUN gcc -o hello hello.c
CMD ["./hello"]

然后你会发现构建成功的镜像体积远远超过了 1 GB。。。因为该镜像包含了整个 gcc 镜像的内容。

如果使用 Ubuntu 镜像,安装 C 编译器,最后编译程序,你会得到一个大概 300 MB 大小的镜像,比上面的镜像小多了。但还是不够小,因为编译好的可执行文件还不到 20 KB

$ ls -l hello
-rwxr-xr-x   1 root root 16384 Nov 18 14:36 hello

类似地,Go 语言版本的 hello world 会得到相同的结果:

package mainimport "fmt"func main () {fmt.Println("Hello, world!")
}

使用基础镜像 golang 构建的镜像大小是 800 MB,而编译后的可执行文件只有 2 MB 大小:

$ ls -l hello
-rwxr-xr-x 1 root root 2008801 Jan 15 16:41 hello

还是不太理想,有没有办法大幅度减少镜像的体积呢?往下看。

为了更直观地对比不同镜像的大小,所有镜像都使用相同的镜像名,不同的标签。例如:hello:gcchello:ubuntuhello:thisweirdtrick 等等,这样就可以直接使用命令 docker images hello 列出所有镜像名为 hello 的镜像,不会被其他镜像所干扰。

2. 多阶段构建


要想大幅度减少镜像的体积,多阶段构建是必不可少的。多阶段构建的想法很简单:“我不想在最终的镜像中包含一堆 C 或 Go 编译器和整个编译工具链,我只要一个编译好的可执行文件!”

多阶段构建可以由多个 FROM 指令识别,每一个 FROM 语句表示一个新的构建阶段,阶段名称可以用 AS 参数指定,例如:

FROM gcc AS mybuildstage
COPY hello.c .
RUN gcc -o hello hello.c
FROM ubuntu
COPY --from=mybuildstage hello .
CMD ["./hello"]

本例使用基础镜像 gcc 来编译程序 hello.c,然后启动一个新的构建阶段,它以 ubuntu 作为基础镜像,将可执行文件 hello 从上一阶段拷贝到最终的镜像中。最终的镜像大小是 64 MB,比之前的 1.1 GB 减少了 95%

												

Docker 镜像制作教程:减小镜像体积 两个技巧,将 Docker 镜像体积减小 99%相关推荐

  1. Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

    VS Code是一个年轻的编辑器,但是确实是非常犀利.通过本篇,老司机带你使用VS Code玩转Docker--相信阅读本篇之后,无论是初学者还是老手,都可以非常方便的玩转Docker了!所谓是&qu ...

  2. OpenStack镜像制作教程

    说明:本文档以CentOS6.5为例,讲解如何制作openstack镜像.不同的linux发行版的具体操作不一样,但制作镜像的过程是一样的. 一.准备环境 建议使用一台物理机来配置kvm环境,需要cp ...

  3. 【超全教程】SpringBoot 2.3.x 分层构建 Docker 镜像实践

    作者:超级小豆丁 http://www.mydlq.club/article/98/ 目录 什么是镜像分层 SpringBoot 2.3.x 新增对分层的支持 创建测试的 SpringBoot 应用 ...

  4. 私有镜像制作及上传harbor私有仓库

    #镜像制作及上传Harbor私有库 ---- #登录harbor ```  docker login -u admin -p Harbor12345 ip:端口 或者直接浏览器输入 默认帐号密码是Ha ...

  5. OpenStack镜像制作系列2—Windows7镜像

    本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1-环境准备 OpenStack镜像制作系列2-Wi ...

  6. Jetson Xavier NX 的SD卡系统镜像制作

    Jetson Xavier NX 的SD卡系统镜像制作 一.SD卡系统查看 二.系统镜像制作 三.系统镜像烧录 一.SD卡系统查看 现有的SD卡的内存为128G,其中64G内存并未分配. # 安装gp ...

  7. Docker最全教程——从理论到实战(四)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右并且一直在完善.补充具体的细节和实践,预计全部完成需要1到2个月的 ...

  8. Docker最全教程——从理论到实战(七)

    Docker最全教程--从理论到实战(七) 原文:Docker最全教程--从理论到实战(七) 在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解 ...

  9. Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

    本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...

最新文章

  1. mysql pdo 查询一条数据_pdo mysql怎么输出第1条 第4条 第7条数据
  2. python 加速器 numba 示例
  3. [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能
  4. linux文件目录作用,linux 文件目录,及其作用
  5. python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...
  6. Python3常用字符串操作
  7. 全局 HOOK 研究
  8. 用scikit-learn和pandas学习线性回归,XGboost算法实例,用MSE评估模型
  9. 【VS2015】 C++实现硬件ID的查询
  10. 9种常用的数据分析方法
  11. 如何将win7系统的电脑屏幕改成护眼的豆沙绿
  12. Alien Skin X7PS调色滤镜插件下载及PS调色滤镜教程
  13. 99乘法口诀表用python写_python 99乘法口诀表
  14. 机器学习平台系列——XGB feature_names mismatch 问题解决方案
  15. C#编程实现阶乘的两种方法
  16. 微服务(一)—— 项目结构
  17. 「津津乐道播客」#293 津津有味:夏天是在拧开冰镇饮料的那一刻到来的
  18. 创业公司的九种商业模式和定价策略 | Business Models and Pricing
  19. 民间和官方借贷中分利与厘利是如何计算?
  20. 链塔智库|区块链产业要闻及动态周报(2020年9月第2周)

热门文章

  1. 申请认定高新技术企业未通过的10大原因分析
  2. matlab中随机矩阵函数,matlab怎么生成随机矩阵 Matlab如何生成随机矩阵?
  3. [高维随机矩阵-2] 特征值和特征向量
  4. GlusterFS分布式文件系统群集
  5. 巴比特 | 元宇宙每日必读:央视网旗下平台2款藏品卖出51万元,支持30天后转赠,投资者称期待看到赋能...
  6. 软件设计师学习笔记-系统安全分析与设计
  7. 基于yolov5车辆识别的数据集
  8. office2003引起的输入法异常
  9. 基于Python/diango实现的学生在线选课系统 | 计算机毕业设计 | Python | 计算机毕业设计定制
  10. 我开店了!为独立开发者提供服务