当前位置:   article > 正文

企业项目实战docker篇(二)docker镜像优化_docker镜像包太大了有影响吗

docker镜像包太大了有影响吗

一.镜像优化概述

为什么在存储如此便宜的今天我们仍然需要对Docker镜像进行优化?

答: 因为docker镜像太大,带来了以下几个问题:

  • 存储开销

    • 会导致用户服务器的磁盘空间很紧张
  • 部署时间

    • 这块影响真的很大,交付件zip包太大,导致用户部署该产品时,花费的时间变长,客户现场中反馈部署时间超过1.5小时,这严重影响用户的体验,降低满意度
  • 性能不稳定

    • 如果客户的服务器规格不够(特别是磁盘读写性能不够),会增大部署失败的概率。

小镜像的优点

  • 加速构建/部署。虽然存储资源较为廉价,但是网络IO是有限的,在带宽有限的情况下,部署一个1G的镜像和10M的镜像带来的时间差距可能就是分钟级和秒级的差距。特别是在出现故障,服务被调度到其他节点时,这个时间尤为宝贵。

  • 提高安全性,减少攻击面积。越小的镜像表示无用的程序越少,可以大大的减少被攻击的目标。

  • 减少存储开销。

小镜像的制作原则

  • 选用最小的基础镜像
  • 减少层,去除非必要的文件
  • 在实际制作镜像的过程中,一味的合并层不可取,需要学会充分的利用Docker的缓存机制,提取公共层,加速构建。
  • 依赖文件和实际的代码文件单独分层
  • 团队/公司采用公共的基础镜像等

二.镜像优化流程

本次实验采用部署了nginx的rhel7系统的镜像为基础镜像进行优化

1.基础镜像制作

在/root/docker目录下进行实验

准备镜像

mv rhel7.tar  docker/
mv nginx-1.20.1.tar.gz  docker/
  • 1
  • 2

准备软件仓库文件

cp /etc/yum.repos.d/dvd.repo   /root/docker
  • 1

在这里插入图片描述

导入rhel7 镜像

docker  load -i rhel7.tar 
docker images
  • 1
  • 2

在这里插入图片描述

创建交互式容器,用于测试命令

docker run -it --name demo3 rhel7 bash
  • 1

在这里插入图片描述

用完可以删除

/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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

生成镜像,如果遇到错误进行修改,不修改中断内容之上的部分,则再次built会在上次基础上运行

docker build -t rhel7:v1 .
  • 1

在这里插入图片描述

创建容器demo

docker run -d --name demo rhel7:v1
  • 1

在这里插入图片描述

查看容器信息,可以看到分配的ip

docker inspect  demo
  • 1

在这里插入图片描述

测试:
访问 172.17.0.2,出现 403错误,是由于数据挂载在真实主机路径上,真实路径上没有数据,无法访问到内容

docker ps 
curl 172.17.0.2
  • 1
  • 2

在这里插入图片描述
真实主机路径可在容器信息内查看
在这里插入图片描述

在真实主机挂载路径上创建默认发布文件index.html,进行访问,成功获取到发布内容

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

cd
curl 172.17.0.2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
由此获取到的镜像可以在任何一台主机上使用,因为已经具备封装好的环境及软件,但是查看镜像历史及列表,会发现该镜像的空间占用较大,达到300MB,较之前扩大一倍有余,不符合轻量化的原则,因此需要进行优化
在这里插入图片描述
在这里插入图片描述

2.层级结构优化及空间清理

在脚本中的每一行为一层结构,因此将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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

关闭nginx编译debug模块

sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
  • 1

清除系统缓存及nginx编译目录

rm -rf /mnt/nginx-1.20.1 /var/cache/*
  • 1

生成rhel7:v2镜像

docker build -t rhel7:v2 .
  • 1

查看镜像大小255MB,减小50MB:
在这里插入图片描述

3.迁移源镜像

通过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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

迁移源镜像

FROM rhel7
COPY --from=build /usr/local/nginx  /usr/local/nginx
  • 1
  • 2

生成rhel7:v3镜像

docker build -t rhel7:v3.
  • 1

查看镜像大小141MB,说明nginx运行环境及占用1MB空间,极大节省了系统开销
在这里插入图片描述

4.轻量级源镜像及函数库

rhel7是基于linux的二次开发产物,本身组件众多,因此更换轻量级源镜像能进一步缩减空间

FROM gcr.io/distroless/base-debian10
  • 1

查看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 /
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

脚本内容

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;"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

生成rhel7:v4镜像

docker build -t rhel7:v4.
  • 1

查看镜像大小31.6MB,具有显著优化效果
在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/58025
推荐阅读
相关标签
  

闽ICP备14008679号