赞
踩
为什么在存储如此便宜的今天我们仍然需要对Docker镜像进行优化?
答: 因为docker镜像太大,带来了以下几个问题:
存储开销
部署时间
性能不稳定
小镜像的优点
加速构建/部署。虽然存储资源较为廉价,但是网络IO是有限的,在带宽有限的情况下,部署一个1G的镜像和10M的镜像带来的时间差距可能就是分钟级和秒级的差距。特别是在出现故障,服务被调度到其他节点时,这个时间尤为宝贵。
提高安全性,减少攻击面积。越小的镜像表示无用的程序越少,可以大大的减少被攻击的目标。
减少存储开销。
小镜像的制作原则
本次实验采用部署了nginx的rhel7系统的镜像为基础镜像进行优化
在/root/docker目录下进行实验
准备镜像
mv rhel7.tar docker/
mv nginx-1.20.1.tar.gz docker/
准备软件仓库文件
cp /etc/yum.repos.d/dvd.repo /root/docker
导入rhel7 镜像
docker load -i rhel7.tar
docker images
创建交互式容器,用于测试命令
docker run -it --name demo3 rhel7 bash
用完可以删除
/root/docker目录下创建dockerfile文件
FROM rhel7
EXPOSE 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;"]
生成镜像,如果遇到错误进行修改,不修改中断内容之上的部分,则再次built会在上次基础上运行
docker build -t rhel7:v1 .
创建容器demo
docker run -d --name demo rhel7:v1
查看容器信息,可以看到分配的ip
docker inspect demo
测试:
访问 172.17.0.2,出现 403错误,是由于数据挂载在真实主机路径上,真实路径上没有数据,无法访问到内容
docker ps
curl 172.17.0.2
真实主机路径可在容器信息内查看
在真实主机挂载路径上创建默认发布文件index.html,进行访问,成功获取到发布内容
cd /var/lib/docker/volumes/d2a5343235da301cb0ced6fa9ab6f990f1c5fb2a8f68d15592b139b1bcd34855/_data
ls
echo www.westos.org > index.html
cd
curl 172.17.0.2
由此获取到的镜像可以在任何一台主机上使用,因为已经具备封装好的环境及软件,但是查看镜像历史及列表,会发现该镜像的空间占用较大,达到300MB,较之前扩大一倍有余,不符合轻量化的原则,因此需要进行优化
在脚本中的每一行为一层结构,因此将RUN
命令进行集合,减少层级
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;"]
关闭nginx编译debug模块
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
清除系统缓存及nginx编译目录
rm -rf /mnt/nginx-1.20.1 /var/cache/*
生成rhel7:v2
镜像
docker build -t rhel7:v2 .
查看镜像大小255MB,减小50MB:
通过v2配置参数修改镜像,此时镜像内的环境除了nginx的运行环境还包括为了编译nginx而部署的环境,待nginx部署完毕,将该镜像上的nginx移植到只用运行环境的rhel7
源镜像,从而达到节省空间目的。
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;"]
迁移源镜像
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
生成rhel7:v3
镜像
docker build -t rhel7:v3.
查看镜像大小141MB,说明nginx运行环境及占用1MB空间,极大节省了系统开销
rhel7是基于linux的二次开发产物,本身组件众多,因此更换轻量级源镜像能进一步缩减空间
FROM gcr.io/distroless/base-debian10
查看nginx运行所需函数库,函数库内以上内容用于支持nginx运行,因此仅需将以下函数库及其依赖项汇总至/opt并导入轻量级源镜像。
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 /
脚本内容
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;"]
生成rhel7:v4
镜像
docker build -t rhel7:v4.
查看镜像大小31.6MB,具有显著优化效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。