运维实操——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容器镜像大小优化的主要内容,如果未能解决你的问题,请参考以下文章
运维实操——日志分析系统ELK(上)之elasticsearch