原标题:两个奇技淫巧,将 Docker 镜像体积减小 99%

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

01

万恶之源

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

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

/* hello.c */

intmain{

puts( "Hello, world!");

return0;

}

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

FROMgcc

COPYhello.c .

RUNgcc -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 会得到相同的结果:

packagemain

import"fmt"

funcmain{

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 的镜像,不会被其他镜像所干扰。

02

多阶段构建

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

FROMgcc AS mybuildstage

COPYhello.c .

RUNgcc -o hello hello.c

FROMubuntu

COPY--from=mybuildstage hello .

CMD[ "./hello"]

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

c语言将一段英文镜像输出,两个奇技淫巧,将 Docker 镜像体积减小 99%相关推荐

  1. 键盘输入一段英文,输出其中的单词个数。

    [题目描述] 键盘输入一段英文,输出其中的单词个数. [输入] 一段英文单词 [输出] 单词的个数 [样例输入] I love China and the people↙ [样例输出] 6 #incl ...

  2. 把代码和环境做成docker镜像_Jenkins把GitHub项目做成Docker镜像

    本文是<Jenkins流水线(pipeline)实战>系列的第三篇,前面已对Jenkins流水线有了基本认识,也试过从GitHub下载pipeline脚本并执行,今天的实战是编写一段pip ...

  3. Docker push命令使用 Docker镜像推送到远程仓库 Docker镜像推送Dockerhub

    Docker push命令使用 Docker镜像推送到远程仓库 Docker镜像推送Dockerhub 一.push命令 1.在Docker中使用push命令,可以镜像提送到Docker公共仓库 -- ...

  4. docker配置阿里云镜像加速、镜像和容器常用命令、docker镜像原理

    6. Docker 配置阿里镜像加速服务 6.1 docker 运行流程 6.2 docker配置阿里云镜像加速 查看自己的镜像加速地址(链接直达):https://cr.console.aliyun ...

  5. 上传镜像文件到服务器,通过把docker镜像保存为文件载入到别的服务器

    在我们的工作环境中,一般镜像通过上传到镜像仓库中(本地或者公共仓库),用到时下载到服务器上即可.如果服务器不能上网,又没有私有仓库,我们就需要将镜像保存为文件上传到服务器上,载入镜像即可使用. 1.保 ...

  6. 最简单的Docker镜像教程:从头基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  7. 从头基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  8. docker 仓库镜像 替换_自己动手创建 Docker 镜像并分享到镜像仓库,容器引擎的用途越来越广泛!...

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 前面在公众号里讲过Docker安装和基本用法和概念,新来的小伙伴可以先去学习一下: docker yum快速安装和 ...

  9. docker 安装linux镜像制作,制作ubuntu完整版docker镜像

    最近需要制作ubuntu14.04  server版完整docker镜像,并启动container(容器)用来编译kernel等. 以下是步骤: 一:获取ubuntu14.04 server版的完整根 ...

最新文章

  1. ubuntu下wireshark添加root权限
  2. Windows Phone开发(48):不可或缺的本地数据库
  3. spark并发读mysql_spark jdbc(mysql) 读取并发度优化
  4. 组播技术中IP地址到MAC地址的映射
  5. Windows批处理脚本%1和%1%有区别吗?
  6. 硬盘由于io设备错误无法运行此项请求_移动硬盘坏了真倒霉,祸不单行U盘也坏了,数据怎么存储才安全?...
  7. Ural_1003 Parity(并查集)
  8. 毕业一年的员工跳槽需要理由吗?
  9. RMAN CATALOG命令手动注册磁带库中的备份片
  10. 【实践】多模态内容理解技术在腾讯搜索中的应用及实践.pdf(附下载链接)
  11. 利用图神经网络进行社交机器人检测
  12. 台达服务器电源原理电路图,台达DPS-250GB-4B ATX电源原理分析与检修
  13. 增值电信业务经营许可证在怎么申请 办理攻略在这里
  14. 探究from表单的身份证号码的校验逻辑 javascript
  15. MP4视频太大怎么在线压缩
  16. eve网络模拟器使用wireshark抓包
  17. 互联网晚报 | 10月14日 星期四 | 钉钉宣布用户数破5亿;顺丰王卫将出任嘉里物流董事会主席;字节跳动巨量引擎进军职业教育...
  18. CSS: text-decoration
  19. php越权执行命令漏洞_PHP漏洞挖掘思路+实例 第二章
  20. 这两个能这样搭配?海关数据+决策人挖掘,用过的外贸人都说好!

热门文章

  1. Excel统计关键词在一个句子/单元格的出现次数
  2. 基于Python/diango实现的学生在线选课系统 | 计算机毕业设计 | Python | 计算机毕业设计定制
  3. 解读苏宁易购开放平台
  4. 用于在MYSQL中创建存储过程的关键字是_下面选项中,用于在删除存储过程时,检测存储过程是否存在的关键字是_学小易找答案...
  5. unity 修改编辑器主题颜色
  6. 3D建模教程,使用ZBrush和MAYA制作超酷维京猫
  7. 从0开始搞一个锦鲤游动——画锦鲤
  8. RecycleView Item设置隐藏会空白占位解决方案
  9. Jmeter连接MySQL获取短信验证码
  10. 旅游系统(SSM框架+MySQL+Redis+VUE)后端代码