一、减少/合并镜像层二、将不必要的命令输出信息屏蔽三、多阶段构建
在使用dockerfile编写容器镜像的时候,不使用优化的话,制作完成之后的镜像是非常大的,对于我这种初学者而言,官网上的几百M的一个纯净版镜像,在自己编译的时候,动不动就能编译出来几G的大小的文件来,所以对于dockerfile而言,优化是非常重要的,优化一般大致分为三个部分:
1、减少/合并镜像层,2、将不需要的有输出信息的执行丢掉,3、多阶段构建。这三种优化方式
下面将三种方式都试用一下,看看各自的大小
先看一下不做优化的镜像文件的大小,用正常的步骤封装一个PHP容器镜像
FROM centos:7
ADD php-7.1.10.tar.bz2 /tmp
RUN yum -y install gcc gcc-c++ make
gd-devel libxml2-devel libcurl-devel
libjpeg-devel libpng-devel openssl-devel bison
RUN mkdir -p /usr/local/php/etc
WORKDIR /tmp/php-7.1.10
RUN ./configure --prefix=/usr/local/php
--with-mysql-sock=/usr/local/mysql/mysql.sock
--with-mysqli --with-zlib --with-curl
--with-gd --with-jpeg-dir --with-png-dir
--with-freetype-dir --with-openssl --enable-fpm
--enable-mbstring --enable-xml --enable-session
--enable-ftp --enable-pdo
--enable-tokenizer --enable-zip
RUN make
RUN make install
COPY php.ini /usr/local/php/etc/php.ini
COPY php-fpm.conf /usr/local/php/etc/php-fpm.conf
RUN cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.d/www.conf
WORKDIR /usr/loacl/php/
EXPOSE 9000
CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]
docker build -t php:1 . ..... docker images REPOSITORY TAG IMAGE ID CREATED SIZE php 1 9cfdb75a9e39 27 seconds ago 1.25GB
当前未优化的大小是1.25G的大小
一、减少/合并镜像层这个步骤就是相对简单,就是将相同的命令指令进行合并,或者去除不必要的指令,因为每一层指令都会生成一层镜像层,每一层镜像层都会基于之前的镜像层来占用内存,所以,可以将相同的指令进行合并,以及压缩包等,使用完之后没有需要就进行删除。减少当前镜像层的容量
FROM centos:7
ADD php-7.1.10.tar.bz2 /tmp
RUN yum -y install gcc gcc-c++ make
gd-devel libxml2-devel libcurl-devel
libjpeg-devel libpng-devel openssl-devel bison &&
cd /tmp/php-7.1.10 &&
./configure --prefix=/usr/local/php
--with-mysql-sock=/usr/local/mysql/mysql.sock
--with-mysqli --with-zlib --with-curl
--with-gd --with-jpeg-dir --with-png-dir
--with-freetype-dir --with-openssl --enable-fpm
--enable-mbstring --enable-xml --enable-session
--enable-ftp --enable-pdo
--enable-tokenizer --enable-zip &&
make &&
make install &&
rm -rf /tmp/php* &&
yum -y remove gcc gcc-c++ make &&
yum clean all
EXPOSE 9000
CMD ["/sbin/php-fpm","-c","etc/php-fpm.conf"]
docker build -t php:2 . ..... docker images REPOSITORY TAG IMAGE ID CREATED SIZE php 2 09243b76aa7d 49 seconds ago 583MB二、将不必要的命令输出信息屏蔽
这个优化可以在上面的优化的基础上,进一步优化,可以将yum安装,make编译步骤等等方式都进行不显示。也可以进一步的减少镜像的容量的大小。例如 &> /dev/null 以这种方式,将输出结果输入到该文件内
FROM centos:7
ADD php-7.1.10.tar.bz2 /tmp
RUN yum -y install gcc gcc-c++ make
gd-devel libxml2-devel libcurl-devel
libjpeg-devel libpng-devel openssl-devel bison &> /dev/null &&
cd /tmp/php-7.1.10 &&
./configure --prefix=/usr/local/php
--with-mysql-sock=/usr/local/mysql/mysql.sock
--with-mysqli --with-zlib --with-curl
--with-gd --with-jpeg-dir --with-png-dir
--with-freetype-dir --with-openssl --enable-fpm
--enable-mbstring --enable-xml --enable-session
--enable-ftp --enable-pdo
--enable-tokenizer --enable-zip &> /dev/null &&
make &> /dev/null &&
make install &> /dev/null &&
rm -rf /tmp/php* &&
yum -y remove gcc gcc-c++ make &> /dev/null &&
yum clean all &> /dev/null
EXPOSE 9000
CMD ["/sbin/php-fpm","-c","etc/php-fpm.conf"]
docker build -t php:3 . ..... images REPOSITORY TAG IMAGE ID CREATED SIZE php 3 3056fd161039 about a minute ago 604MB三、多阶段构建
使用FROM命令,构建出多个镜像,将指定的镜像做为其他镜像的基础镜像来使用,在后面再调用这个基础镜像,这样容器镜像内存的大小就只有很小的一部分
FROM centos:7 as build
ADD php-7.1.10.tar.bz2 /tmp
RUN yum -y install gcc gcc-c++ make
gd-devel libxml2-devel libcurl-devel
libjpeg-devel libpng-devel openssl-devel bison &> /dev/null &&
cd /tmp/php-7.1.10 &&
./configure --prefix=/usr/local/php
--with-mysql-sock=/usr/local/mysql/mysql.sock
--with-mysqli --with-zlib --with-curl
--with-gd --with-jpeg-dir --with-png-dir
--with-freetype-dir --with-openssl --enable-fpm
--enable-mbstring --enable-xml --enable-session
--enable-ftp --enable-pdo
--enable-tokenizer --enable-zip &> /dev/null &&
make &> /dev/null &&
make install &> /dev/null &&
rm -rf /tmp/php* &&
yum -y remove gcc gcc-c++ make &> /dev/null &&
yum clean all &> /dev/null
FROM centos:7
EXPOSE 9000
COPY --from=build /usr/local/php /usr/local/php
CMD ["/sbin/php-fpm","-c","etc/php-fpm.conf"]
在下面调用构建好的基础镜像
docker build -t php:4 . ..... docker images REPOSITORY TAG IMAGE ID CREATED SIZE php 4 068279b7a3e3 14 seconds ago 371MB
这个的镜像包,相较于原来的,就是很小了,前第一种跟第二种优化方式,区别不是很大



