Linux运维之docker(三)镜像的优化

Linux运维之docker(三)镜像的优化

  • 在docker中创建nginx

1.下载nginx的镜像并且导入到本地

[root@server1 ~]# ls
anaconda-ks.cfg  docker        nginx-1.15.8.tar.gz  rhel7.tar
busybox.tar      game2048.tar  nginx.tar            ubuntu.tar
[root@server1 ~]# docker load -i nginx.tar 

2.下载nignx的安装包到本地,因为实验中需要用到,并且编写dockfile文件

//在/tmp/docker中添加已经下载的nginx的安装包
[root@server1 ~]# mv nginx-1.15.8.tar.gz /tmp/docker/
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# ls
Dockerfile  dvd.repo  index.html  nginx-1.15.8.tar.gz  website

//编写Dockfile文件
[root@server1 docker]# vim Dockerfile 
文件编辑内容如下:
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD  nginx-1.15.8.tar.gz /mnt
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
EXPOSE 80   端口
VOLUME ["/usr/local/nginx/html"]  挂载点
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

//以dockerfile生成新的镜像
[root@server1 docker]# ls
Dockerfile  dvd.repo(yum源文件之前已经写好)  index.html  nginx-1.15.8.tar.gz(nginx安装包)
[root@server1 docker]# docker build -t nginx:v1 .

//查看生成的镜像

//使用新生成的镜像运行容器
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v1   -d表示打入后台,-f表示添加端口映射

查看生成的镜像及其内存大小为276MB:
Linux运维之docker(三)镜像的优化_第1张图片

  • 镜像的优化

1.减少镜像层数

//编辑dockerfile
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# vim Dockerfile 
文件编写的内容如下:
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD  nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc &&  ./configure  --prefix=/usr/local/nginx && make &&  make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

//运行新的镜像v2并且查看大小,发现比v1少了20MB
[root@server1 docker]# docker build -t nginx:v2 .
[root@server1 docker]# docker images nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  57c313c825dd        22 seconds ago      250MB
nginx               v1                  0f28d8eb67fe        20 minutes ago      276MB

2.清理镜像构建的中间产物并且使用多阶段构建镜像

//编辑dockerfile
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile 
文件
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD  nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && 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 -rf /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;"]

重新以dockerfile创建新的镜像并且查看大小发现变为144MB
Linux运维之docker(三)镜像的优化_第2张图片
3.终极优化从底层优化

//下载distroless镜像并且进行本地导入
[root@server1 docker]# docker load -i distroless.tar

//编写dockerfile
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile 
文件编辑内容如下:
FROM nginx 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

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

//生成新的镜像
[root@server1 docker]# docker build -t busybox:v5  .

查看发现优化后变为20多MB
在这里插入图片描述

你可能感兴趣的:(linux运维,运维,linux,学习)