削减Docker Images的大小

削减Docker Images的大小

削减images的大小意味着需要构建自己新的images。

如何让构建出来的镜像更小更具有效率呢?

在这里插入图片描述

我们需要通过docker build指令来对我们定制的镜像进行构建。在Docker build的过程中,会读取Dockerfile中的命令进行构建

FROM centos:7.2.1511
COPY . /tmp/

RUN yum install -y make \
    gcc \
    openssl-devel \
    zlib-devel \
    perl-devel \
    pcre-devel && \
    cd /tmp/ && tar zxf nginx-1.10.2.tar.gz && \
    cd /tmp/nginx-1.10.2 && \
    ./configure --with-http_gzip_static_module --with-http_ssl_module && \
    make && make install && \
    rm -rf /tmp/* && \
    ln -sf /dev/stdout /usr/local/nginx/logs/access.log && \
    ln -sf /dev/stderr /usr/local/nginx/logs/error.log

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
  • 通过FROM指令选择需要进行构建的镜像
  • 根据指令对镜像进行持续的修改
    1. run (create和start)
    2. 修改
    3. commit
    4. 重复以上三步操作(如果有多次修改)

原则一 尽量在同一层运行更多的命令,而不是分多次RUN指令执行

我们可以看到,在修改镜像的过程中会持续的run镜像。然而每run一次,实际上都会在images的内部形成一个新的文件层。这样做最终会增大文件层的体积。因此我们需要尽量减少Run的次数。

由于 Docker 镜像的储存原理是分层的,其实 docker build 的过程就是 docker 运行了一个容器,然后执行 Dockerfile 里写的命令。并且每一个命令都会 commit 一下,每一次 commit 都是一层一层的叠加在原来的镜像上,也就是说在某一层里增加了一个文件,在下一层里删除这个文件,是没有任何效果的,镜像体积是不变的,可能反而会增加。所以减小镜像的体积除了替换基础镜像,还需要优化 Dockerfile,减少镜像的层级。

那么对于一些需要通过 COPY 命令的方式拷贝到镜像里面的文件,可以使用 wget 的方式,下载到镜像里,然后使用完之后就删掉。

RUN cp /usr/local/aa.tar.gz /opt
RUN tar xvf /opt/aa.tar.gz
RUN rm -rf /opt/aa.tar.gz

可以修改成

RUN cp /usr/local/aa.tar.gz /opt && \
       tar xvf /opt/aa.tar.gz && \
       rm -rf /opt/aa.tar.gz

注意使用&&\换行符来拼接命令。

原则二 使用包管理软件之后运行clean all指令能够缩减images的大小

RUN yum -y —enablerepo=rpmforge-extras install php \
 php-pecl-xdebug \
 php-soap \
 php-mysql \
 php-gd \
 php-process \
 php-xml \
 php-mbstring \
 mysql-server \
 php-zendframework \
 htmlpurifier \
 jpgraph-tuleap \
 php-pear-Mail-mimeDecode \
 rcs \
 cvs \
 php-guzzle \
 php-password-compat \
 unzip \
 tar \
 subversion \
 bzip2 \
 php-pecl-xdebug \
 git \
 && yum clean all

原则三 移除 build 依赖的文件

有一些软件安装时,可能在编译时会依赖于一些头文件,例如 openssl-dev 这之类的 dev 文件,还有就是 gccmake 这之类的编译工具,在程序运行时完全不需要,所以可以在编译完之后,删除掉,这样可以也是可以减小一定的体积。

Dockerfile FROM centos:7.2.1511

COPY . /tmp/

RUN yum install -y make
		gcc
		openssl-devel
		zlib-devel
		perl-devel
		pcre-devel &&
		cd /tmp/ && tar zxf nginx-1.10.2.tar.gz &&
		cd /tmp/nginx-1.10.2 &&
		./configure --with-http_gzip_static_module --with-http_ssl_module &&
		make && make install &&
		yum remove -y gcc openssl-devel zlib-devel perl-devel pcre-devel make &&
		yum clean all &&
		rm -rf /tmp/* &&
		ln -sf /dev/stdout /usr/local/nginx/logs/access.log &&
		ln -sf /dev/stderr /usr/local/nginx/logs/error.log

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

上面的 yum remove -y gcc openssl-devel zlib-devel perl-devel pcre-devel makeyum clean all 就是移除不需要的文件,从而进一步减小体积,加上两条命令后,执行 docker build 后的镜像的体积为 413.8MB,相对上述的 535.2MB 减小了 121.4 MB。

参考博客

https://www.cnblogs.com/ericnie/p/7991218.html Dockerfile减少构建镜像大小的方法

http://dockone.io/article/783 10张图带你深入理解Docker容器和镜像 (强力推荐)

https://hui.lu/reduce-docker-image-size/ 减小 Docker 镜像体积

发布了3 篇原创文章 · 获赞 0 · 访问量 829

猜你喜欢

转载自blog.csdn.net/APPTITE/article/details/102373360