数据API 产品矩阵 案例 关于
掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

如何 build 出尽可能小的 docker image?

1. 简介

我们自己构建 Docker image 时都希望结果镜像越小越好,那么如何才能尽量变小呢?

下面我们通过一个简单的案例,了解下优化思路,看一个简单的镜像如何从 743MB 减到 536MB

2. 案例

目标

非常简单,build 一个 java 镜像

基于 centos 基础镜像,和下载好的 jdk-8u101-linux-x64.tar.gz

过程

1)第一版

Dockerfile 内容:

FROM centos

COPY jdk-8u101-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local
RUN tar -zxf /usr/local/jdk-8u101-linux-x64.tar.gz && rm /usr/local/jdk-8u101-linux-x64.tar.gz

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

build 后镜像大小为:743 MB

centos 基础镜像的大小是 197MB,jdk 压缩包是 173MB,而最终结果 743MB 有点太大了

这个 Dockerfile 的问题在于:虽然 tar 解压之后立即使用 rm 删除了压缩包,但与上面的 COPY 不在一层,所以删了也无法减小最终的体积

2)第二版

为了解决上一版中压缩包的问题,可以使用 ADD 命令,直接把解压后的内容放入镜像,而不是把压缩包放入进行内再解压

FROM centos

ADD jdk-8u101-linux-x64.tar.gz /usr/local/

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

build 后镜像大小为:562 MB,少了压缩包的大小,这样就好了很多

如果压缩包不在本地,需要通过网络下载,然后解压,那么就要让 下载、解压、删除 这3个动作在同一层操作,例如:

RUN wget http://xxx.com/app && tar -xzf app.tar.gz && rm app.tar.gz

这样就可以避免压缩包占用镜像空间

3)第三版

上一版已经很简洁了,还有什么可以优化的呢?

我们先在本地把 jdk-8u101-linux-x64.tar.gz 解压看一下

解压后目录是 jdk1.8.0_101,大小 352M 

进入目录可以看到 javafx-src.zip(4.9M) 和 src.zip(21M) 这两个源码包文件,我们在实际环境中可能并不需要他们,那么拷贝到镜像中就比较多余了

Docker 有一个过滤功能,可以让我们排除掉不需要的文件,方法是编写 .dockerignore 文件

Dockerfile内容:

FROM centos

COPY jdk1.8.0_101 /usr/local/jdk1.8.0_101

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

.dockerignore内容:

*/*.zip

位置关系:

├── .dockerignore
├── Dockerfile
└── jdk-8u101-linux-x64.tar.gz

build 后镜像大小为:536 MB,比第一版的 743MB 少了 207MB

.dockerignore 的作用很大,一般的开源项目包中会有源码、文档,例如 hadoop 包中的 doc 就有 96MB,还有我们自己项目中也可能会有不必要的文件,例如 .git、.svn、tmp 等等,都可以通过 .dockerignore 进行排除

3. 小结

上面的案例中,优化的思路就是尽量少往镜像里放东西

还有一点比较重要,一定要选用最合适的基础镜像,例如:

  1. 可以看看只有 5MB 的 alpine 镜像是否能满足自己的需求,ubuntu、centos 这些基础镜像都是100多MB的,如果能使用 alpine 那么就减小了很多

  2. 通常公司内会构建自己的基础镜像,例如构建一个 Ruby+Rails+... 通用镜像,需要其他镜像时就以此为基础,但如果有的 service 只需要 Ruby 而不要 Rails 等其他东西,这时就多余了,有精力的话可以把基础镜像拆分得更细一些

原文来自:性能与架构

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
如何 build 出尽可能小的 docker image?
发布:2017-03-28 14:02:56

1. 简介

我们自己构建 Docker image 时都希望结果镜像越小越好,那么如何才能尽量变小呢?

下面我们通过一个简单的案例,了解下优化思路,看一个简单的镜像如何从 743MB 减到 536MB

2. 案例

目标

非常简单,build 一个 java 镜像

基于 centos 基础镜像,和下载好的 jdk-8u101-linux-x64.tar.gz

过程

1)第一版

Dockerfile 内容:

FROM centos

COPY jdk-8u101-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local
RUN tar -zxf /usr/local/jdk-8u101-linux-x64.tar.gz && rm /usr/local/jdk-8u101-linux-x64.tar.gz

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

build 后镜像大小为:743 MB

centos 基础镜像的大小是 197MB,jdk 压缩包是 173MB,而最终结果 743MB 有点太大了

这个 Dockerfile 的问题在于:虽然 tar 解压之后立即使用 rm 删除了压缩包,但与上面的 COPY 不在一层,所以删了也无法减小最终的体积

2)第二版

为了解决上一版中压缩包的问题,可以使用 ADD 命令,直接把解压后的内容放入镜像,而不是把压缩包放入进行内再解压

FROM centos

ADD jdk-8u101-linux-x64.tar.gz /usr/local/

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

build 后镜像大小为:562 MB,少了压缩包的大小,这样就好了很多

如果压缩包不在本地,需要通过网络下载,然后解压,那么就要让 下载、解压、删除 这3个动作在同一层操作,例如:

RUN wget http://xxx.com/app && tar -xzf app.tar.gz && rm app.tar.gz

这样就可以避免压缩包占用镜像空间

3)第三版

上一版已经很简洁了,还有什么可以优化的呢?

我们先在本地把 jdk-8u101-linux-x64.tar.gz 解压看一下

解压后目录是 jdk1.8.0_101,大小 352M 

进入目录可以看到 javafx-src.zip(4.9M) 和 src.zip(21M) 这两个源码包文件,我们在实际环境中可能并不需要他们,那么拷贝到镜像中就比较多余了

Docker 有一个过滤功能,可以让我们排除掉不需要的文件,方法是编写 .dockerignore 文件

Dockerfile内容:

FROM centos

COPY jdk1.8.0_101 /usr/local/jdk1.8.0_101

ENV JAVA_HOME /usr/local/jdk1.8.0_101
ENV PATH $JAVA_HOME/bin:$PATH

.dockerignore内容:

*/*.zip

位置关系:

├── .dockerignore
├── Dockerfile
└── jdk-8u101-linux-x64.tar.gz

build 后镜像大小为:536 MB,比第一版的 743MB 少了 207MB

.dockerignore 的作用很大,一般的开源项目包中会有源码、文档,例如 hadoop 包中的 doc 就有 96MB,还有我们自己项目中也可能会有不必要的文件,例如 .git、.svn、tmp 等等,都可以通过 .dockerignore 进行排除

3. 小结

上面的案例中,优化的思路就是尽量少往镜像里放东西

还有一点比较重要,一定要选用最合适的基础镜像,例如:

  1. 可以看看只有 5MB 的 alpine 镜像是否能满足自己的需求,ubuntu、centos 这些基础镜像都是100多MB的,如果能使用 alpine 那么就减小了很多

  2. 通常公司内会构建自己的基础镜像,例如构建一个 Ruby+Rails+... 通用镜像,需要其他镜像时就以此为基础,但如果有的 service 只需要 Ruby 而不要 Rails 等其他东西,这时就多余了,有精力的话可以把基础镜像拆分得更细一些

原文来自:性能与架构

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

选择想要的接口, 看看能免费获取多少次调用 选择(单选)或填写想要的接口
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 证件识别
  • 企业工商信息
短信API服务
  • 短信API服务
  • 银行卡四元素检测[简]
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证[简]
  • 身份证OCR识别
  • 证件识别
  • 企业工商信息
  • 确定
选择您的身份
请选择寻找接口的目的
预计每月调用量
请选择预计每月调用量
产品研发的阶段
请选择产品研发的阶段
×

前往领取
电话 0512-88869195
提需求
×
企业用户认证,
可获得1000次免费调用
注册登录 > 企业账户认证 > 领取接口包
企业用户认证领取接口包 立即领取
× 企业用户认证,
可获得1000次免费调用,立即领取>
数 据 驱 动 未 来
Data Drives The Future