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

时间:2024-03-20 10:30:31

1.优化镜像应该主要有以下几个方面:
选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物
注意优化网络需求
尽量去用构建缓存
使用多阶段构建镜像

使用Dockerfile封装nginx应用
未优化:
所需环境:docker环境、build context中必须存在nginx包与可用的yum源配置文件、rhel7镜像
(1)Dockerfile如下:
vim /docker/Dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER [email protected]
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
Docker镜像的优化(以封装nginx镜像为例)
Docker镜像的优化(以封装nginx镜像为例)
Docker镜像的优化(以封装nginx镜像为例)
创建镜像
Docker镜像的优化(以封装nginx镜像为例)
Docker镜像的优化(以封装nginx镜像为例)
查看镜像大小
docker images
Docker镜像的优化(以封装nginx镜像为例)
未经过优化的生成的镜像301M

清理中间缓存并尽量减少镜像层数
加入yum clean all
FROM rhel7
EXPOSE 80
MAINTAINER [email protected]
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel && yum clean all
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]

Docker镜像的优化(以封装nginx镜像为例)
docker build -t nginx:v2 .
Docker镜像的优化(以封装nginx镜像为例)
docker images
Docker镜像的优化(以封装nginx镜像为例)
生成的镜像276M

清理中间缓存并尽量减少镜像层数
FROM rhel7
EXPOSE 80
MAINTAINER [email protected]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.17.0
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
docker build -t nginx:v3 .
Docker镜像的优化(以封装nginx镜像为例)
docker images
Docker镜像的优化(以封装nginx镜像为例)
本次缩减镜像到257M

使用多阶段构建方法
我们需要的只不过是编译之后的软件包,那么我们就可以在一容器编译安装以后,将编译安装之后的安装包拷贝到另一个容器中,这样就减小了不需要的步骤。并且将压缩包删除。
FROM rhel7 as build
EXPOSE 80
MAINTAINER [email protected]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.17.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.17.0
RUN sed -i ‘s/CFLAGS=“KaTeX parse error: Expected 'EOF', got '#' at position 12: CFLAGS -g"/#̲CFLAGS="CFLAGS -g”/g’ auto/cc/gcc &&rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.17.0

FROM rhel7
EXPOSE 80
MAINTAINER [email protected]
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
docker build -t nginx:v4 .
Docker镜像的优化(以封装nginx镜像为例)
Docker镜像的优化(以封装nginx镜像为例)
此时发现镜像大小已经为141MB了,但是rhel7的基础镜像大小为140MB。所以我们使用的时候就可以发现基础镜像其实不需要这么多。所以可以添加更小的基础镜像
成功的优化301MB-141MB
Docker镜像的优化(以封装nginx镜像为例)
减少底层base的大小

使用一个最基础的系统环境镜像。然后从nginx进行中将运行nginx所需要的依赖库都导入到基础的系统镜像中,就可以满足运行nginx的要求,做到最小化。
docker load -i distroless.tar ##一个基础的系统环境镜像
docker load -i nginx.tar ##nginx的镜像
Docker镜像的优化(以封装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;”]

创建镜像并查看镜像大小
docker build -t nginx:v5 .
Docker镜像的优化(以封装nginx镜像为例)
这次nginx镜像被压缩到24.4M
docker run -d -p 80:80 --name nginx nginx:v5
在浏览器输入172.25.15.1
Docker镜像的优化(以封装nginx镜像为例)