频道栏目
首页 > 资讯 > 其他 > 正文

Docker使用学习之Dockerfile编写的八条准则

18-07-12        来源:[db:作者]  
收藏   我要投稿

一、基础镜像

编写Dockerfile文件的时候通常是基于某个Linux基础镜像作为底包,然后打包进需要的功能从而形成自己的镜像。选择基础镜像时是有讲究的:尽量选择官方镜像库里的基础镜像;尽量选择轻量级的镜像做底包。

就典型的Linux基础镜像来说,大小关系如下:

Ubuntu > CentOS > Debian因此相比Ubuntu,其实更推荐使用最轻量级的Debian镜像,而且它也是一个完整的Release版,可以放心使用。

二、标签Tag

构建镜像时,给其打上一个易读的镜像标签有助于帮助了解镜像的功能,比如:

docker build -t=“centos:wordpress"。例如上面的这个centos镜像是用来做wordpress用的,所以已经集成了wordpress功能,这一看就很清晰明了。再者,我们也应该在Dockerfile的FROM指令中明确指明标签Tag,不要再让Docker daemon 去猜,如FROM debian:codesheep

三、镜像缓存

什么是镜像缓存?由Dockerfile最终构建出来的镜像是在基础镜像之上一层层叠加而得,因此在过程中会产生一个个新的镜像层。Docker daemon 在构建镜像的过程中会缓存一系列中间镜像。docker build镜像时,会顺序执行Dockerfile中的指令,并同时比较当前指令和其基础镜像的所有子镜像,若发现有一个子镜像也是由相同的指令生成,则命中缓存,同时可以直接使用该子镜像而避免再去重新生成了。为了有效地使用缓存,需要保证Dockerfile 中指令的连续一致,尽量将相同指令的部分放在前面,而将有差异性的指令放在后面。举例:假如我想用Dockerfile方式基于最基本的CentOS镜像来构建两个不同的镜像时,两个Dockerfile的开头可以相同:

FROM centos:latest

# 下面安装两个常用的工具

RUN yum install -y net-tools.x86_64

RUN yum install lrzsz

######## 上面为两个Dockerfile文件中相同的部分######

######## 下面为两个Dockerfile文件中不同的部分######

......

四、ADD与COPY指令

虽然两者都可以添加文件到镜像中,但在一般用法中,还是推荐以COPY指令为首选,原因在于ADD指令并没有COPY指令来的纯粹,ADD会添加一些额外功能,典型的如下ADD一个压缩包时,其不仅会复制,还会自动解压,而有时我们并不需要这种额外的功能。

ADD codesheep.tar.gz /path

除此之外,在需要添加多个文件到镜像中的时候,不要一次性集中添加,而是选择 按需在必要时逐个添加即可,因为这样有利于利用镜像缓存。

五、使用docker volume

虽然上面一条原则说推荐通过COPY命令来向镜像中添加多个文件,然而实际情况中,若文件大而多的时候还是应该优先用 docker -v 命令来挂载文件,而不是依赖于 ADD或者COPY。

六、CMD和ENTRYPOINT指令

Dockerfile制作镜像时,会组合CMD和ENTRYPOINT指令来作为容器运行时的默认命令:即 CMD + ENTRYPOINT。此时的默认命令组成中:ENTRYPOINT指令部分“一般”固定不变,容器运行时不修改,而 CMD 部分的指令也可以改变,表现在运行容器时,docker run 命令中提供的参数会覆盖CMD的指令内容。

举个例子:

FROM debian:latest

MAINTAINER codesheep@163.com

ENTRYPOINT [ "ls", "-l"]

CMD ["-a"]

若以默认命令运行容器,可以发现,执行的是 ls -a -l 命令:

若 docker run 中增加参数 -t

docker run -it --rm --name test debian:codesheep -t

也可以发现执行的是 ls -l -t,即 Dockerfile 中的 CMD 原参数被覆盖了:

因此推荐的使用方式是:

使用exec格式的 ENTRYPOINT指令 设置固定的默认命令和参数

使用 CMD指令 设置可变的参数

七、不做端口映射

Dockerfile可以通过EXPOSE指令将容器端口映射到主机端口上,但这样会导致镜像在一台主机上仅能启动一个容器!所以应该在docker run命令中来用 -p 参数来指定端口映射,而不要将该工作置于 Dockerfile 之中:

#尽量避免这种方式

EXPOSE 8080:8899

#仅仅暴露端口

EXPOSE 8080

八、通过Dockerfile共享镜像

推荐通过共享Dockerfile的方式来共享镜像,优点多多:通过Dockerfile 构建的镜像用户可以清楚地看到构建的过程就像Jenkinsfile 可以加入版本控制从而追踪CI系统的变迁和步骤的回滚一样,Dockerfile作为一个编排文件同样可以入库做版本控制,这样也可以回溯使用Dockerfile 构建的镜像具有确定性,没有玄学的成分。

相关TAG标签
上一篇:关于在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备的操作教程
下一篇:高通821平台LCD调试实例之LK部分流程讲解
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站