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镜像的大小优化的主要内容,如果未能解决你的问题,请参考以下文章
如何优化 node 项目的 docker 镜像(像老板压榨员工一样压榨镜像)