docker镜像的大小优化

Posted 遙遙背影暖暖流星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker镜像的大小优化相关的知识,希望对你有一定的参考价值。

一、优化镜像

原版

FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
#关闭debug日志
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;"]

docker diuld -t docker:v1
docker images

优化一:把不需要的命令丢入/dev/null

FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

优化二:减少RUN构建

FROM centos:7
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \\
yum clean all && \\
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \\
./configure --prefix=/usr/local/nginx &> /dev/null && \\
make &> /dev/null && make install &> /dev/null && \\
rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

优化三:多阶段构建

使用FRON命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建

FROM centos:7 as build
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \\
yum clean all && \\
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \\
./configure --prefix=/usr/local/nginx &> /dev/null && \\
make &> /dev/null && make install &> /dev/null && \\
rm -rf /mnt/nginx-1.12.2
FROM centos:7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

docker build -t nginx .
docker run -itd --name nginx2 -P nginx:v2
docker ps -a

镜像可运行,且镜像体积变小

优化四:使用更为轻量级的linux发行版

debian和alpine

二、关于VOLUME

在窗口一
docker rm -f `docker ps -aq`  #删除所有镜像
docker build -f Dockerfile -t nginx:v1 .   #在dockerfile文件所在目录下新建容器

新开另一个端口
watch -n 1 docker ps -a 

总结:yum 默认执行是/bin/sh -c,且在生成镜像时启动容器,等到镜像生成后容器自动删除

我们在设置镜像的时候VOLUME ["/usr/local/nginx/html"]规定了挂载目录,那么容器中的这个目录具体挂载在宿主机的那个目录下呢?

docker run -itd --name nginx1 -P nginx:v1
#启动容器

docker inspect nginx1
#查看容器详情

[root@docker ~]# cd /var/lib/docker/volumes/3d6f10c923499cbc3734b255d35e7107e19273784252f3633625f5009f56e74f/_data
[root@docker _data]# vim index.html
this is nginx web
# 进入宿主机目录下更改文件内容



[root@docker _data]# docker exec -it nginx1 /bin/bash
[root@5862d63a268d /]#
[root@5862d63a268d /]#
[root@5862d63a268d /]# cd /usr/local/nginx/html/
[root@5862d63a268d html]# cat index.html
this is nginx web
#进去容器中查看挂载目录下的文件

........


出了在dockerfile设置挂载目录,我们也可以在run开启容器时-v进行挂载

docker run -itd -P -v /data/nginx_html:/usr/local/nginx/html  nginx:v1 
#分号前/data/nginx_html,为宿主机目录,:分号后/usr/local/nginx/html为容器内目录

以上是关于docker镜像的大小优化的主要内容,如果未能解决你的问题,请参考以下文章

运维实操——docker容器镜像大小优化

如何优化 node 项目的 docker 镜像(像老板压榨员工一样压榨镜像)

docker-编写dockerfile最佳实践

如何写一个最优的Dockerfile

Docker最佳实践:5个方法精简镜像

用了SpringBoot 2.3.0 这个新特性,从此构建Docker镜像贼快!