必看的dockerfile禁忌与建议!

简介: 必看的dockerfile禁忌与建议!

直接上对照组(看第三个run)



test1

FROM centos
MAINTAINER **
RUN yum -y update
RUN yum -y install wget
RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz" -O /tmp/jdk8_x64.tar.gz && gunzip /tmp/jdk8_x64.tar.gz && tar -C /opt -xf /tmp/jdk8_x64.tar && ln -s /opt/jdk1.8.0_121 /opt/jdk && yum clean all && rm -fr /tmp/*


test2

FROM centos
MAINTAINER **
RUN yum -y update
RUN yum -y install wget
RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz" -O /tmp/jdk8_x64.tar.gz && gunzip /tmp/jdk8_x64.tar.gz && tar -C /opt -xf /tmp/jdk8_x64.tar && ln -s /opt/jdk1.8.0_121 /opt/jdk 
RUN yum clean all 
RUN rm -fr /tmp/*


一样的命令我们分开不同来写会有什么区别呢?

alex@ubuntu:~/workspace/docker_project$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test2               latest              a65c6cced43b        13 minutes ago      1.1 GB
test1               latest              67897397b053        14 minutes ago 


看到区别了么?


禁忌一(不分层或者瞎分层):

同一业务或功能操作分在一个层(一个run就是一个层哦!)!


禁忌二(切记画蛇添足):

绝对也千万别运行yum update,docker的目的就是用最小的资源运行程序。所以一律做减法,没用的不做,可用不可不用的不做,切记画蛇添足!


禁忌三(镜像好不好,就看小不小!):

别用docker commit制作镜像,这样的镜像都是没根的镜像,今天你知道咋回事。明天你可能就忘了,不好追溯其结构和顺序!而且这样的镜像通常都非常大!

禁忌四(容器的记忆比金鱼还短):


不要在docker中写入数据,如果有数据产生,必须存储在volume中


禁忌五(一个容器一个进程):

不多说了奥,容器不是虚拟机,一个容器干一个活就OK拉!


禁忌六(只安装,不删除):

用完的包要立即删除。


推荐及建议:



一、使用Alpine

 

Alpine是一个高度精简又包含了基本工具的轻量级Linux发行版,基础镜像只有4.41M,各开发语言和框架都有基于Alpine制作的基础镜像,所以推荐使用Alpine做基础镜像


yb@localhost ~/s> docker images
REPOSITORY         TAG             IMAGE ID            CREATED             SIZE
ubuntu             latest        74f8760a2a8b        8 days ago          82.4MB
alpine             latest        11cd0b38bc3c        2 weeks ago         4.41MB
centos               7           49f7960eb7e4        7 weeks ago         200MB
debian             latest        3bbb526d2608        8 days ago          101MB
yb@localhost ~/s>

看到他们差多少了吗?


二、使用scratch镜像构建其他镜像:


scratch是一个空镜像,只能用于构建其他镜像,比如你要运行一个包含所有依赖的二进制文件,如Golang程序,可以直接使用scratch作为基础镜像。还记得我们k8s里面的 pause镜像嘛?来看看它的Dockerfile:


FROM scratch
ARG ARCH
ADD bin/pause-${ARCH} /pause
ENTRYPOINT ["/pause"]


pause镜像使用了scratch作为基础镜像,这个镜像本身是不占空间的,使用它构建的镜像大小几乎和二进制文件本身一样大,所以镜像非常小。当然在我们的Golang程序中也会使用。对于一些Golang/C程序,可能会依赖一些动态库,你可以使用自动提取动态库工具,比如ldd、linuxdeployqt等提取所有动态库,然后将二进制文件和依赖动态库一起打包到镜像中。


三、 busybox镜像(安卓核心哦!)


scratch是个空镜像,如果希望镜像里可以包含一些常用的Linux工具,busybox镜像是个不错选择,镜像本身只有1.16M,非常便于构建小镜像。


四、其他优化:


(1)在执行apt-get install -y 时增加选项— no-install-recommends ,可以不用安装建议性(非必须)的依赖,也可以在执行apk add 时添加选项--no-cache 达到同样效果;

(2)执行yum install -y 时候, 可以同时安装多个工具,比如yum install -y gcc gcc-c++ make …。将所有yum install 任务放在一条RUN命令上执行,从而减少镜像层的数量;


(3)组件的安装和清理要串联在一条指令里面,如 apk --update add php7 && rm -rf /var/cache/apk/* ,因为Dockerfile的每条指令都会产生一个文件层,如果将apk add … 和 rm -rf … 命令分开,清理无法减小apk命令产生的文件层的大小。 Ubuntu或Debian可以使用 rm -rf /var/lib/apt/lists/* 清理镜像中缓存文件;CentOS等系统使用yum clean all 命令清理。

相关文章
|
7月前
|
Docker 容器
压缩docker层数的新思路
压缩docker层数的新思路
29 0
|
2月前
|
监控 Linux 虚拟化
【经典问题】Docker是怎么工作的?
【1月更文挑战第26天】【经典问题】Docker是怎么工作的?
|
2月前
|
Shell C++ Docker
dockerfile 几组易混命令找茬
dockerfile 几组易混命令找茬
|
10月前
|
Java Linux 虚拟化
为什么要学习Docker?有什么用处呢?看完你就想学了
为什么要学习Docker?有什么用处呢?看完你就想学了
115 0
为什么要学习Docker?有什么用处呢?看完你就想学了
|
存储 运维 Java
不认识docker,怎么好意思说自己是干IT的
不认识docker,怎么好意思说自己是干IT的
85 0
|
存储 Ubuntu Linux
让我们重新认识一下docker 的全局观
让我们重新认识一下docker 的全局观
让我们重新认识一下docker 的全局观
|
Kubernetes Cloud Native Linux
Docker发家史,诠释我要打十个
微软曾经以天价收购 Docker,接受微软的天价收购,在大多数人看来都是一个非常明智和实际的选择。可是 Solomon Hykes 却多少带有一些理想主义的影子,不甘于“寄人篱下”,选择带领 Docker 公司对抗整个产业的压力。
124 0
|
Java Linux Shell
docker-compose下的java应用启动顺序两部曲之二:实战
实战java应用的改造,使之在docker-compose下可以按照业务需求的顺序来启动
211 1
docker-compose下的java应用启动顺序两部曲之二:实战
|
NoSQL Java Linux
docker-compose下的java应用启动顺序两部曲之一:问题分析
在docker-compose编排多个容器时,需要按实际情况控制各容器的启动顺序,本文分析启动顺序的重要性,以及启动顺序有问题时会有什么样的影响,再给出临时解决的和官方推荐的两种解决方案,为下一篇的实战做好铺垫
274 0
docker-compose下的java应用启动顺序两部曲之一:问题分析
|
Prometheus Cloud Native Shell
宇宙最全实用高超的docker命令技巧
宇宙最全实用高超的docker命令技巧

热门文章

最新文章