Docker镜像的优化(以封装nginx镜像为例)

1.优化镜像应该主要有以下几个方面:

  • 选择最精简的基础镜像

  • 减少镜像的层数

  • 清理镜像构建的中间产物

  • 注意优化网络需求

  • 尽量去用构建缓存

  • 使用多阶段构建镜像

    在这里插入图片描述

2.使用Dockerfile封装nginx应用

未优化:
所需环境:docker环境、build context中必须存在nginx包与可用的yum源配置文件、rhel7镜像

(1)Dockerfile如下:

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

在这里插入图片描述
(2) 创建镜像并查看镜像大小

cd /root/docker
docker build -t rhel7:nginx .
docker images

在这里插入图片描述
在这里插入图片描述
未经过优化的生成的镜像276M

3 清理中间缓存并尽量减少镜像层数

[root@server1 docker]# vim Dockerfile 

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

docker build -t rhel7:nginxv1 .
docker images   ##查看大小

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本次缩减镜像到252M

4.使用多阶段构建方法

我们需要的只不过是编译之后的软件包,那么我们就可以在一容器编译安装以后,将编译安装之后的安装包拷贝到另一个容器中,这样就减小了不需要的开销。并且将压缩包删除。

[root@server1 docker]# vim Dockerfile 

FROM rhel7 as build    # 这一阶段只需需要完成nginx的编译
ADD nginx-1.15.8.tar.gz /mnt
COPY toto.repo /etc/yum.repos.d/toto.repo
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8



FROM rhel7    # 创建镜像,将编译好的文件直接拿过来用
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

在这里插入图片描述
创建镜像并查看镜像大小

[root@server1 docker]# docker build -t rhel7:nginxv2 .
[root@server1 docker]# docker images
REPOSITORY                      TAG                        IMAGE ID            CREATED              SIZE
rhel7                           nginxv2                    b76e8a4f1cdc        About a minute ago   141MB
rhel7                           nginxv1                    81151b07a78b        11 minutes ago       252MB
rhel7                           nginx                      5e4ec17f0b69        19 minutes ago       276MB

在这里插入图片描述
在这里插入图片描述
此时发现镜像大小已经为141MB了,但是rhel7的基础镜像大小为140MB。所以我们使用的时候就可以发现基础镜像其实不需要这么多。所以可以添加更小的基础镜像

4、减少底层base的大小

使用一个最基础的系统环境镜像。然后从nginx进行中将运行nginx所需要的依赖库都导入到基础的系统镜像中,就可以满足运行nginx的要求,做到最小化。

docker load -i distroless.tar				##一个基础的系统环境镜像
docker load -i nginx.tar			        ##nginx的进行

vim Dockerfile
FROM nginx:1.16 as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 
ARG Asia/Shanghai
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 /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.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /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
COPY --from=base /opt /
EXPOSE 80
VOLUME ["/usr/share/nginx/html"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

创建镜像并查看镜像大小

[root@server1 docker]# docker build -t nginx:v1 .
[root@server1 docker]# docker images
REPOSITORY                      TAG                        IMAGE ID            CREATED              SIZE
nginx                            v1                        cb475e8f4412        7 seconds ago       23.7MB
rhel7                           nginxv2                    b76e8a4f1cdc        About a minute ago   141MB
rhel7                           nginxv1                    81151b07a78b        11 minutes ago       252MB
rhel7                           nginx                      5e4ec17f0b69        19 minutes ago       276MB
gcr.io/distroless/base          latest                     9a255d5fe262        49 years ago        16.8MB

这次nginx镜像被压缩到23.7M

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值