Docker 镜像制作教程:减小镜像体积 两个技巧,将 Docker 镜像体积减小 99%
对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积吓到,我只需要一个几 MB 的可执行文件而已,为何镜像的体积会达到 1 GB
以上?本文将会介绍几个奇技淫巧来帮助你精简镜像,同时又不牺牲开发人员和运维人员的操作便利性。本系列文章将分为三个部分:
第一部分着重介绍多阶段构建(multi-stage builds),因为这是镜像精简之路至关重要的一环。在这部分内容中,我会解释静态链接和动态链接的区别,它们对镜像带来的影响,以及如何避免那些不好的影响。中间会穿插一部分对 Alpine
镜像的介绍。链接:Docker 镜像制作教程:减小镜像体积
第二部分将会针对不同的语言来选择适当的精简策略,其中主要讨论 Go
,同时也涉及到了 Java
,Node
,Python
,Ruby
和 Rust
。这一部分也会详细介绍 Alpine 镜像的避坑指南。什么?你不知道 Alpine
镜像有哪些坑?我来告诉你。链接:Docker 镜像制作教程:针对不同语言的精简策略
第三部分将会探讨适用于大多数语言和框架的通用精简策略,例如使用常见的基础镜像、提取可执行文件和减小每一层的体积。同时还会介绍一些更加奇特或激进的工具,例如 Bazel
,Distroless
,DockerSlim
和 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:gcc
,hello:ubuntu
,hello: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%相关推荐
- Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)
VS Code是一个年轻的编辑器,但是确实是非常犀利.通过本篇,老司机带你使用VS Code玩转Docker--相信阅读本篇之后,无论是初学者还是老手,都可以非常方便的玩转Docker了!所谓是&qu ...
- OpenStack镜像制作教程
说明:本文档以CentOS6.5为例,讲解如何制作openstack镜像.不同的linux发行版的具体操作不一样,但制作镜像的过程是一样的. 一.准备环境 建议使用一台物理机来配置kvm环境,需要cp ...
- 【超全教程】SpringBoot 2.3.x 分层构建 Docker 镜像实践
作者:超级小豆丁 http://www.mydlq.club/article/98/ 目录 什么是镜像分层 SpringBoot 2.3.x 新增对分层的支持 创建测试的 SpringBoot 应用 ...
- 私有镜像制作及上传harbor私有仓库
#镜像制作及上传Harbor私有库 ---- #登录harbor ``` docker login -u admin -p Harbor12345 ip:端口 或者直接浏览器输入 默认帐号密码是Ha ...
- OpenStack镜像制作系列2—Windows7镜像
本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1-环境准备 OpenStack镜像制作系列2-Wi ...
- Jetson Xavier NX 的SD卡系统镜像制作
Jetson Xavier NX 的SD卡系统镜像制作 一.SD卡系统查看 二.系统镜像制作 三.系统镜像烧录 一.SD卡系统查看 现有的SD卡的内存为128G,其中64G内存并未分配. # 安装gp ...
- Docker最全教程——从理论到实战(四)
容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右并且一直在完善.补充具体的细节和实践,预计全部完成需要1到2个月的 ...
- Docker最全教程——从理论到实战(七)
Docker最全教程--从理论到实战(七) 原文:Docker最全教程--从理论到实战(七) 在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解 ...
- Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)
本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...
最新文章
- mysql pdo 查询一条数据_pdo mysql怎么输出第1条 第4条 第7条数据
- python 加速器 numba 示例
- [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能
- linux文件目录作用,linux 文件目录,及其作用
- python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...
- Python3常用字符串操作
- 全局 HOOK 研究
- 用scikit-learn和pandas学习线性回归,XGboost算法实例,用MSE评估模型
- 【VS2015】 C++实现硬件ID的查询
- 9种常用的数据分析方法
- 如何将win7系统的电脑屏幕改成护眼的豆沙绿
- Alien Skin X7PS调色滤镜插件下载及PS调色滤镜教程
- 99乘法口诀表用python写_python 99乘法口诀表
- 机器学习平台系列——XGB feature_names mismatch 问题解决方案
- C#编程实现阶乘的两种方法
- 微服务(一)—— 项目结构
- 「津津乐道播客」#293 津津有味:夏天是在拧开冰镇饮料的那一刻到来的
- 创业公司的九种商业模式和定价策略 | Business Models and Pricing
- 民间和官方借贷中分利与厘利是如何计算?
- 链塔智库|区块链产业要闻及动态周报(2020年9月第2周)
热门文章
- 申请认定高新技术企业未通过的10大原因分析
- matlab中随机矩阵函数,matlab怎么生成随机矩阵 Matlab如何生成随机矩阵?
- [高维随机矩阵-2] 特征值和特征向量
- GlusterFS分布式文件系统群集
- 巴比特 | 元宇宙每日必读:央视网旗下平台2款藏品卖出51万元,支持30天后转赠,投资者称期待看到赋能...
- 软件设计师学习笔记-系统安全分析与设计
- 基于yolov5车辆识别的数据集
- office2003引起的输入法异常
- 基于Python/diango实现的学生在线选课系统 | 计算机毕业设计 | Python | 计算机毕业设计定制
- 我开店了!为独立开发者提供服务