写在前面

这篇小作文我们会学习镜像构建的另一个关键性问题,为何别人打造的镜像只有10MB而我的有几百MB?如何精简镜像减小镜像体积?


精简镜像我们可以从两个方面切入:

  • 减少镜像层数
  • 缩减容量

一、减少镜像层数

1.指令合并

Dockerfile 中的每条指令都将创建一个层,不过查看官方文档中最佳实践有这样一句话:

In older versions of Docker, it was important that you minimized the number of layers in your images to ensure they were performant. The following features were added to reduce this limitation:

  • Only the instructions RUNCOPYADD create layers. Other instructions create temporary intermediate images, and do not increase the size of the build.

    ...

参考地址:Minimize the number of layers

意味着只有 RUNCOPYADD 三个指令会创建层,其他指令会创建一个中间镜像,并且不会影响镜像大小。这样我们说的指令合并也就是以这三个指令为主。

我们以如下Dockerfile为例

FROM debian:stableWORKDIR /var/www
LABEL version=“v1”RUN apt-get update
RUN apt-get -y --no-install-recommends install curlRUN apt-get purge -y curl
RUN apt-get autoremove -y
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*

构建镜像

docker build -t curl:v1 .

通过history查看构建历史

# docker history curl:v1IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
29b721c09b67   18 seconds ago   /bin/sh -c rm -rf /var/lib/apt/lists/*          0B
aa28ae151e59   20 seconds ago   /bin/sh -c apt-get clean                        0B
4f733781f557   22 seconds ago   /bin/sh -c apt-get autoremove -y                989kB
f66887372121   29 seconds ago   /bin/sh -c apt-get purge -y curl                987kB
d458ee0de463   34 seconds ago   /bin/sh -c apt-get -y --no-install-recommend…   4.46MB
43fdcf68018c   44 seconds ago   /bin/sh -c apt-get update                       17.6MB
65631e8bb010   53 seconds ago   /bin/sh -c #(nop)  LABEL version=“v1”           0B
7ef7c53b019c   53 seconds ago   /bin/sh -c #(nop) WORKDIR /var/www              0B
8bfa93572e55   13 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      13 days ago      /bin/sh -c #(nop) ADD file:d78d93eff67b18592…   124MB

镜像大小

[root@localhost dockerfiles]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
curl                  v1        29b721c09b67   10 minutes ago   148MB

我们将RUN指令通过类shell操作&&合并后

RUN apt-get update && \apt-get -y --no-install-recommends install curl && \apt-get purge -y curl && \apt-get autoremove -y && \apt-get clean && \rm -rf /var/lib/apt/lists/*

查看构建历史与镜像大小

# docker history curl:v2
IMAGE          CREATED              CREATED BY                                      SIZE      COMMENT
928e12c2f57e   About a minute ago   /bin/sh -c apt-get update &&     apt-get -y …   989kB
5a32372025fb   About a minute ago   /bin/sh -c #(nop)  LABEL version=“v2”           0B
7ef7c53b019c   30 minutes ago       /bin/sh -c #(nop) WORKDIR /var/www              0B
8bfa93572e55   13 days ago          /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      13 days ago          /bin/sh -c #(nop) ADD file:d78d93eff67b18592…   124MB# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
curl                  v2        928e12c2f57e   3 minutes ago    125MB

可见只是一个简单的curl应用在通过指令合并的方式安装已经获得了约20MB的容量释放。同时使你的dockerfile文件更为易读和简约。

2.多阶段构建

在Docker17.05 中引入了多阶段构建,通过多阶段构建可以大大降低构建复杂度,同时使缩小镜像尺寸更为简单。我们来看多阶段构建的Dockerfile

#阶段1
FROM golang:1.16
WORKDIR /go/src
COPY app.go ./
RUN go build app.go -o myapp
#阶段2
FROM scratch
WORKDIR /server
COPY --from=0 /go/src/myapp ./
CMD ["./myapp"]

构建镜像

# docker build --no-cache  -t server_app:v2 .

查看构建好的镜像

# docker images
REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
server_app            v2        20225cb1ea6b   12 seconds ago       1.94MB

以上用例来自上篇文章《Dockerfile 多阶段构建实践》关于镜像多阶段构建具体内容可以前往查看,这里不做过多赘述。

3.启用squash特性

通过启用squash特性(实验性功能)docker build --squash -t curl:v3 . 可以构建的镜像压缩为一层。但是为了充分发挥容器镜像层共享的优越设计,这种方法不被推荐。


二、缩减容量

1. 选择小的基础镜像

每个linux发行版镜像大小相差很多,甚至相同发行版镜像也存在差异。我们以debian为例:

稳定版和瘦身版相差约40MB

# docker images
debian                stable-slim   2aa48a485e3a   13 days ago         80.4MB
debian                stable        8bfa93572e55   13 days ago         124MB

我们将Dockerfile中基础镜像改为瘦身版debian:stable-slim

FROM debian:stable-slim

构建后的镜像尺寸更小

# docker images
REPOSITORY            TAG           IMAGE ID       CREATED             SIZE
curl                  v4            1aab5c9bf8b3   17 seconds ago      81.4MB

当前映像基于 Debian,并包含许多二进制文件。Docker 容器应该包含一个进程,并包含运行它所需的最低限度。我们其实不需要整个操作系统。

我们可以使用基于 Alpine 的镜像 替换Debian 基础镜像。

FROM alpineWORKDIR /var/www
LABEL version=“v5”
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories && \apk update && \apk upgrade && \apk add --no-cache curl

查看镜像大小

# docker images
REPOSITORY            TAG           IMAGE ID       CREATED             SIZE
curl                  v5            7f735bb213be   11 seconds ago      10.1MB

此时我们的镜像来到了10MB。使用alpine镜像包管理工具是apk,一些软件包名可能不一样。最大的区别

2.上下文管理

我们经常会用到的COPY指令

COPY . /server/dir

COPY会把整个 构建上下文复制到镜像中,并生产新的缓存层。为了不必要的文件如日志、缓存文件、Git 历史记录被加载到构建上下文,我们最好添加.dockerignore用于忽略非必须文件。这也是精简镜像关键一步,同时能更好的保证我们构建的镜像安全性。

3.及时清理下载

我们有如下Dockerfile

..
WORKDIR /tmp
RUN curl -LO https://docker.com/download.zip && tar -xf download.zip -C /var/www
RUN rm  -f download.zip
...

我们虽然使用了rm删除download.zip包,由于镜像分层的问题,download.zip是在新的一层被删除,上一层仍然存在。

我们要在一层中及时清理下载

RUN curl -LO https://docker.com/download.zip && tar -xf download.zip -C /var/www &&  rm  -f download.zip

另外在安装软件时应及时使用包管理工具清除你下载的软件依赖及缓存,比如在我们dockerfile中使用apt包管理工具做清理。


关于精简镜像的相关操作介绍到这里。

docker容器 如何精简镜像减小体积相关推荐

  1. docker多个容器一起打包_详解Docker 容器基础系统镜像打包

    因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Li ...

  2. Docker容器——重命名镜像的TAG

    Docker容器--重命名镜像的TAG 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家 ...

  3. docker容器打包成镜像并上传至dockerhub

    1.docker容器commit成镜像文件 //docker commit 容器名 想要创建的镜像名:版本号 docker commit mmdetection_zjh mmdetection_zjh ...

  4. docker容器打包成镜像和压缩以及解压和载入镜像

    docker容器打包成镜像和压缩 (1)将容器保存成镜像 sudo docker commit -a 'sunmingyang' b4293c3b9202 mask_detectionv2:v2 (2 ...

  5. Docker容器(配置+镜像建立及优化+镜像加速器制作)

    一.docker简介 Docker是管理容器的引擎. Docker为应用打包.部署平台,而非单纯的虚拟化技术 1.VM vs Container 2.传统虚拟机和容器的技术对比 3.容器是如何工作的 ...

  6. 服务器系统打包,详解Docker 容器基础系统镜像打包

    因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Li ...

  7. docker 容器保存为镜像_Docker容器和镜像操作

    前言 Docker 容器和镜像操作,记录下来! 容器 创建一个新的容器(ubuntu)并启动 $ docker run -dit --name ubuntu ubuntu 在容器内执行命令(容器在后台 ...

  8. Docker 容器导出为镜像

    Docker 镜像备份与迁移 1. 容器保存为镜像 2. 镜像备份 3. 镜像恢复与迁移 1. 容器保存为镜像 我们可以通过以下命令将容器保存为镜像 docker commit pinyougou_n ...

  9. 企业必会技能Docker容器、国内镜像源、web界面管理、配置镜像仓库、镜像加速器、超细详解

    文章目录 国内镜像源 拉取 启动MySQL web界面管理docker容器 点击查看主机 配置阿里云的镜像仓库 登录镜像仓库 Docker 镜像加速器 国内镜像源 使用国内镜像:进入网站:https: ...

最新文章

  1. android标题栏添加按钮_改善Android布局性能
  2. notepad python配置_Notepad++怎么配置python?
  3. 在Vue中使用样式——使用内联样式
  4. SAP ERP项目业务流程方案设计重点内容
  5. VTK:几何对象之GeometricObjectsDemo
  6. CSS布局——display,position,float属性
  7. 软件测试之黑盒测试-边界值分析法(理论白话学习/期中期末备考)
  8. Git学习笔记 - 钢钢更新
  9. 基于SSM的校园垃圾分类系统
  10. oracle 偶尔登录超时,OracleClient,间歇性连接问题:应用程序挂起在OracleConnection.Open()上,没有超时,没有引发异常...
  11. 2022出海拉美:巴西电商市场现状及网红营销特点
  12. 2020微信的小动作整理:微信生态将进一步完善,也是电商进一步发展的机遇
  13. oracle索引创建及删除
  14. 老夫聊发少年狂,西北望,射天狼!----马云余额宝 集团(转)
  15. Thymeleaf框架
  16. 岭南师范学院专插本计算机,2019年岭南师范学院专插本招生专业
  17. 4 1000以内完数
  18. 神经网络和局部拉普拉斯滤波方法在高分辨率卫星图像中的应用
  19. 曝光房屋租售合同诈骗6手段~~!!!!大家注意了·~~~
  20. 八、边缘保留滤波(EPF)

热门文章

  1. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境
  2. python定时导出已发送文件_Python链接数据库查询导出查询结果到Excel并定时发送邮件到指定邮箱,实现巡检功能(亲测可用!!!)...
  3. 分享20个高质量的学习网站!
  4. jenkins API 使用postman调用
  5. java -g_【JVM】7、深入理解Java G1垃圾收集器
  6. 支付宝schlum url 启动指定界面
  7. PDF转图片软件有什么?建议收藏这三款软件
  8. C# 控制台程序 打开窗体
  9. 原生的HTML Table表格实现表头添加斜杠
  10. 金蝶生成凭证模板_金蝶精斗云产品的优势