运维实操——docker容器镜像大小优化

Posted 谁主沉浮lyb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维实操——docker容器镜像大小优化相关的知识,希望对你有一定的参考价值。

docker容器(二)镜像大小优化


前言:本文是在上一篇的基础上攥写,所以yum源已配好

1、部署有nginx的rhel7系统的镜像

docker commit 构建新镜像三部曲:
1运行容器
2修改容器
3将容器保存为新的镜像

提前准备rhel7.tar和nginx-1.20.1.tar.gz安装包

[root@server1 mnt]# mkdir /root/docker        		#创建目录
[root@server1 mnt]# cd /root/docker/
[root@server1 docker]# cat Dockerfile            	#编写Dockerfile文件
FROM rhel7
EXPOSE 80                           				#如果容器中运行应用服务,暴露服务端口为80出去
VOLUME ["/usr/local/nginx/html"]    				#挂载实际目录,数据存在于真实主机
COPY dvd.repo /etc/yum.repos.d/    	 				#拷贝软件仓库文件
ADD  nginx-1.20.1.tar.gz  /mnt      				#解压缩到指定目录
RUN  rpmdb --rebuilddb              				#仓库记录清理
RUN  yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@server1 docker]# docker build -t rhel7:v1 . 	#创建新镜像(执行dockerfile)
[root@server1 docker]# docker run -d --name demo rhel7:v1 #使用rhel7:v1镜像运行容器名为demo
[root@server1 docker]# docker inspect  demo			#查看容器详细信息,可以查看到ip地址

在这里插入图片描述
curl 172.17.0.2测试,会出现 403错误,因为数据挂载在真实主机路径上,真实路径上没有数据,无法访问到内容
在这里插入图片描述

cd /var/lib/docker/volumes/d2a5343235da301cb0ced6fa9ab6f990f1c5fb2a8f68d15592b139b1bcd34855/_data
echo www.westos.org > index.html

再次 curl 172.17.0.2,就可以看到发布页面
在这里插入图片描述
docker images查看镜像,发现rhel7:v1大小是303M,太大了。
在这里插入图片描述

2、镜像优化

下面就来优化镜像的大小。主要有下面几种办法:
1、选择最精简的基础镜像
2、减少镜像的层数
3、清理镜像构建的中间产物
4、注意优化网络请求
5、尽量去用构建缓存
6、使用多阶段构建镜像
接下来,就优化dockerfile这个文件的编写,使其正常部署ngnix并且尽量简短。
首先,几个RUN执行语句可以合并到一起,关闭nginx编译debug模块,清除系统缓存及nginx编译目录

FROM rhel7 
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD  nginx-1.20.1.tar.gz  /mnt
WORKDIR /mnt/nginx-1.20.1
RUN  rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null &&  make &> /dev/null &&  make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

修改完成后,docker build -t rhel7:v2 .生成新的镜像rhel7:v2,此时再次查看大小为255M,有一定的优化,但是还不够。
在这里插入图片描述
接下来,上面不仅产生了我们想要的ngnix还生成了相对应的编译环境,然而我们并不需要这个环境,还占用内存,所以使用多阶段构建镜像,先用基础模块产生ngnix等一系列产物,然后只把这个基础模块中的 /usr/local/nginx目录复制给第二个模块,我们只需要拿第二个模块的东西,这样可以大大缩小size

FROM rhel7 as build
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD  nginx-1.20.1.tar.gz  /mnt
WORKDIR /mnt/nginx-1.20.1
RUN  rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null &&  make &> /dev/null &&  make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

FROM rhel7
COPY --from=build /usr/local/nginx  /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

修改完成后,docker build -t rhel7:v3 .生成新的镜像rhel7:v3,此时再次查看大小为141M,又有一定的优化,但是还不够极致。
在这里插入图片描述
为了进一步压缩,考虑到rhel7中组件过多,很多东西用不上,还占空间,所以想要更换轻量级源镜像,但是不能光图轻量级,我们还需要给他安装nignx所需要的函数库,如下
在这里插入图片描述
继续修改dockerfile文件,给ngnix最基本的函数库,使用最基本的镜像base-debian10

FROM nginx:latest as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
RUN mkdir -p /opt/var/cache/nginx && \\
    cp -a --parents /usr/lib/nginx /opt && \\
    cp -a --parents /usr/share/nginx /opt && \\
    cp -a --parents /var/log/nginx /opt && \\
    cp -aL --parents /var/run /opt && \\
    cp -a --parents /etc/nginx /opt && \\
    cp -a --parents /etc/passwd /opt && \\
    cp -a --parents /etc/group /opt && \\
    cp -a --parents /usr/sbin/nginx /opt && \\
    cp -a --parents /usr/sbin/nginx-debug /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \\
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \\
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \\
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \\
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

修改完成后,docker build -t rhel7:v4 .生成新的镜像rhel7:v4,此时再次查看大小为31M,对比最开始,镜像大小缩小了很多。
在这里插入图片描述

以上是关于运维实操——docker容器镜像大小优化的主要内容,如果未能解决你的问题,请参考以下文章

运维实操——docker容器安全

图数据库驱动的基础设施运维实操

运维实操——日志分析系统ELK(上)之elasticsearch

运维实操——kubernetes调度nodeNamenodeSelector亲和性污点容忍删除节点

运维实战 容器部分 Docker镜像

运维实操——日志分析系统ELK(下)之kibana数据可视化xpack安全验证metricbeat控制台