前言

本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍:容器的优化( Dockerfile优化),提升自己的同时,希望对你也有所帮助。

一、普通优化

1.保持容器的纯粹性

容器内最好只有一个服务,要么只要Tomcat、要么只有nginx

2.合并RUN,彼此之间用&&拼接

1.shell运行方式

RUN rm -fr /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && yum install -y nginx && yum clean all

RUN 命令的结尾,记得添加yum clean all ,缩减资源占用 

2.exec运行方式(官方推荐)

注:建议优先使用下面的格式,两种方式的区别:点击进入(第六章节,第一小节)

RUN ["mkdir","/etc/redis"] && ["cp","redis.conf","/etc/redis/6379.conf"]

3.指定基准镜像的具体版本

FROM centos:7.6.1810

不要省略或者使用Latest版本的镜像,因为它是个变量,隔不久它就有可能会指向另一个新版本,这样镜像就需要重新拉取。

4.能使用COPY就不用ADD

除非需要解压,才使用ADD,否则优先使用COPY

5.COPY文件时,不常变动的放上面,常变动的放下面

可以生成缓存,减少资源的使用

6.entrypoint命令抽离为entrypoint.sh,脚本末尾使用exec 

CMD nginx  #启动nginx

替换为 

COPY entrypoint.sh /entrypoint.sh #注意该行代码建议放在RUN命令的后面(这个文件有可能常被修改,放后面)
ENTRYPOINT entrypoint.sh #启动容器命令

#vim entrypoint.sh 
#chmod +x entrypoint.sh  给脚本添加执行权限

#/bin/bash
set -e #如果出现异常,则立刻退出,而不是一直占用资源
nginx -c /etc/nginx/nginx.conf # 指定配置文件启动nginx
exec "$@" #如果命令被阻断,则不运上一行nginx启动命令,重要的是exec,不是后面的$@或者$*

注:exec执行时会以新的进程替换原来的进程,但是进程的PID保持不变,仅仅是替换了原进程中的上下文内容。 

7.选择基准镜像时,在官网选择alpine版本或者simp版本

精简版的体积一般都非常小,如果你了解怎么查找,参考:Tomcat精简版(第三小节) 为例

8.从GitHub上拉取镜像后,第一件事儿,修改时区

镜像的默认时区,与中国的北京时区,相差8个小时。修改时区后,可以避免一些因为时间问题引发的一些不必要的问题。

方法一:进入容器内部(docker exec -it ),用timedatectl命令修改 

timedatectl set-timezone Asia/Shanghai

方法二:在Dockerfile中的写法

#移除容器中的localtime,从系统时区中取出上海时区,通过ln-s创建软链接方式给容器中的localtime
RUN rm -rf /etc/localtime && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  && yum clean all

二、总结

通过这些优化,可以大大缩减镜像的体积,当然Dockerfile的优化,应该还有其他一些好的方法,等待我们共同去发掘,后期也会同步更新,期待一下吧~~,啦啦啦,啦啦啦~~

尾言

本讲内容是从 Docker入门到进阶里面抽离出来的内容,从而使原文更加有序、重点突出。希望对大家有所帮助。

附注

1、如何获取Docker的最新版本 | 如何获取Tomcat/JDK/Nginx指定版本镜像

2、Docker学习必会的核心命令(pull、run、ps、images、build、exec)

3、配置阿里云镜像加速器,提高镜像下载速度

4、Dockerfile八大核心命令 | Dockerfile构建自己的镜像

5、通过Dockerfile自定义Redis本地容器

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐