削减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指令选择需要进行构建的镜像
- 根据指令对镜像进行持续的修改
- run (create和start)
- 修改
- commit
- 重复以上三步操作(如果有多次修改)
原则一 尽量在同一层运行更多的命令,而不是分多次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
文件,还有就是 gcc
和 make
这之类的编译工具,在程序运行时完全不需要,所以可以在编译完之后,删除掉,这样可以也是可以减小一定的体积。
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 make
和 yum 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 镜像体积