Docker-(4)docker镜像的优化

使用Dockerfile构建一个镜像用来安装nginx:

vim Dockerfile 

FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
RUN sed -i.bak '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;"]

其中还需要repo文件:

[root@server1 ~]# cd docker/
[root@server1 ~]# vim dvd.repo
[root@server1 docker]# cat dvd.repo 
[dvd]
name=rhel7
baseurl=http://172.25.254.1/rhel7.6
gpgcheck=0

之后build:

[root@server1 docker]# docker build -t nginx:v1 .

查看这个镜像构建历史:

[root@server1 docker]# docker history nginx:v1

在这里插入图片描述
运行这个镜像:

[root@server1 docker]# docker run -d --name web nginx:v1
088df7d425bf47182746753dd68d5a99f1de767afd6f53e264b09da3edc3b638
[root@server1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
088df7d425bf        nginx:v1            "/usr/local/nginx/sb…"   33 seconds ago      Up 12 seconds                           web

查看容器的信息:

docker inspect nginx:v1

可以看到容器的ip为172.17.0.2,之后访问这个ip:

curl 172.17.0.2

在这里插入图片描述此时可以查看该镜像的大小:

[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
nginx                             v1                  dbff0bd7b93a        9 minutes ago       289MB

为289M,我们可以优化镜像的构建过程以使镜像的大小缩小:

镜像的优化

可以从以下几个方面来优化镜像:
在这里插入图片描述选择最精简的基础镜像我们在最后实验,这一步可以大大减少镜像的大小,我们先从减少镜像的层数开始:

减少镜像的层数

更改Dockerfile文件将多个RUN层合并为一层:

[root@server1 docker]# vim Dockerfile 

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

之后build:

[root@server1 docker]# docker build -t nginx:v2 .

成功后查看镜像大小发现变成了283M:

[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
nginx                             v2                  77a1177f2c37        45 seconds ago      283MB
nginx                             v1                  dbff0bd7b93a        20 minutes ago      289MB

说明减少中间层数可以优化镜像

清理镜像构建的中间产物

更改Dockerfile文件:

[root@server1 docker]# vim Dockerfile 

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

之后build:

[root@server1 docker]# docker build -t nginx:v3 .

成功后查看镜像大小发现变成了255M:

[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
nginx                             v3                  24bf8bf50b43        37 seconds ago      255MB
nginx                             v2                  77a1177f2c37        4 minutes ago       283MB
nginx                             v1                  dbff0bd7b93a        24 minutes ago      289MB

说明清理中间产物可以优化镜像

使用多阶段构建

更改Dockerfile文件:

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.16.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.1
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && yum clean all && rm -rf /mnt/nginx-1.16.1

FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

之后build:

[root@server1 docker]# docker build -t nginx:v4 .

成功后查看镜像大小发现变成了141M:

[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
nginx                             v4                  3a092e83aad7        20 seconds ago      141MB
nginx                             v3                  24bf8bf50b43        4 minutes ago       255MB
nginx                             v2                  77a1177f2c37        8 minutes ago       283MB
nginx                             v1                  dbff0bd7b93a        28 minutes ago      289MB

说明多阶段构建可以明显减少镜像的大小。

使用更为精简的基础镜像

我们使用的基础镜像是google提供的base-debian10镜像,它非常小,仅为19.2M,因此可以从源头减小build后镜像的大小

拉取base-debian10基础镜像,由于google官方没有上传因此我们下载其他用户上传的镜像,两个镜像的内部其实是相同的:

docker pull madeforgoods/base-debian10

更改名称为google官方的名称:

docker tag  madeforgoods/base-debian10 gcr.io/distroless/base-debian10

编辑Dockerfile文件:

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM nginx as base

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 /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 /

ENTRYPOINT ["nginx", "-g", "daemon off;"]

注意:以上文件内容可以从github找到,搜索:distroless nginx,网址:https://github.com/evry-ace/nginx-distroless

之后build:

[root@server1 docker]# docker build -t nginx:v5 .

查看镜像大小:

[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
nginx                             v5                  21829713aead        30 seconds ago      31.1MB
<none>                            <none>              fb6d4957e715        31 seconds ago      139MB
nginx                             v4                  3a092e83aad7        8 minutes ago       141MB
nginx                             v3                  24bf8bf50b43        12 minutes ago      255MB
nginx                             v2                  77a1177f2c37        16 minutes ago      283MB
nginx                             v1                  dbff0bd7b93a        36 minutes ago      289MB

发现大小仅为31.1M,说明这种方法可以大幅减小镜像的大小。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值