高效编写Dockerfile的几条准则指的是什么

发布时间:2021-12-01 16:07:55 作者:柒染
来源:亿速云 阅读:115

这期内容当中小编将会给大家带来有关高效编写Dockerfile的几条准则指的是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

概述

然而写 Dockerfile 也像写代码一样,一份精心设计、Clean Code 的 Dockerfile 能在提高可读性的同时也大大提升Docker的使用效率

因此下面就结合实践来讲几条 Dockerfile 的实践心得!



基础镜像的选择有讲究

在我的文章 《利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)》 中,我们是基于某个Linux基础镜像作为底包,然后打包进我需要的功能从而形成自己的镜像。

这里选择基础镜像时是有讲究的:

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

Ubuntu > CentOS > Debian

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



多使用标签Tag 有好处

docker build -t=“centos:wordpress" .

例如上面的这个centos镜像是用来做wordpress用的,所以已经集成了wordpress功能,这一看就很清晰明了

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。此时的默认命令组成中:

举个例子:

FROM debian:latest

MAINTAINER codesheep@163.com

ENTRYPOINT [ "ls", "-l"]
CMD ["-a"]

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

高效编写Dockerfile的几条准则指的是什么

docker run 中增加参数 -t

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

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

高效编写Dockerfile的几条准则指的是什么

因此推荐的使用方式是:



不推荐在 Dockerfile中 做端口映射

Dockerfile 可以通过 EXPOSE指令 将容器端口映射到主机端口上,但这样会导致镜像在一台主机上仅能启动一个容器!

所以应该在 docker run 命令中来用 -p 参数来指定端口映射,而不要将该工作置于 Dockerfile 之中:

#尽量避免这种方式
EXPOSE 8080:8899

#选择仅仅暴露端口即可,端口映射的任务交给 docker run 去做
EXPOSE 8080


使用 Dockerfile 来共享镜像

推荐通过共享 Dockerfile 的方式来共享镜像,优点多多:

上述就是小编为大家分享的高效编写Dockerfile的几条准则指的是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 如何编写Dockerfile脚本
  2. 编写 Dockerfile 最佳实践

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

dockerfile

上一篇:LINQ to SQL存储过程是怎样的

下一篇:LINQ表达式指定目标数据的方法有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》