本文已得到原做者 CodeSheep 受权。docker
docker build
命令来自动化地从 Dockerfile 所描述的步骤来构建自定义的 Docker镜像,这比咱们去命令行一条条指令执行的方式构建高效得多。然而写 Dockerfile 也像写代码同样,一份精心设计、Clean Code 的 Dockerfile 能在提升可读性的同时也大大提高 Docker 的使用效率centos
所以下面就结合实践来说几条 Dockerfile 的实践心得!缓存
在个人文章 《利用K8S技术栈打造我的私有云(连载之:基础镜像制做与实验)》中,咱们是基于某个 Linux 基础镜像做为底包,而后打包进我须要的功能从而造成本身的镜像。运维
这里选择基础镜像时是有讲究的:wordpress
就典型的 Linux 基础镜像来讲,大小关系以下:工具
Ubuntu > CentOS > Debian
所以相比 Ubuntu,其实更推荐使用最轻量级的 Debian 镜像,并且它也是一个完整的 Release 版,能够放心使用post
docker build -t=“centos:wordpress" .
例如上面的这个 centos 镜像是用来作 wordpress 用的,因此已经集成了 wordpress 功能,这一看就很清晰明了ui
FROM debian:codesheep
什么是镜像缓存?spa
由 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 文件中不一样的部分###### ......
虽然二者均可以添加文件到镜像中,但在通常用法中,仍是推荐以 COPY 指令为首选,缘由在于 ADD 指令并无 COPY 指令来的纯粹,ADD 会添加一些额外功能,典型的以下 ADD 一个压缩包时,其不只会复制,还会自动解压,而有时咱们并不须要这种额外的功能。
ADD codesheep.tar.gz /path
除此以外,在须要添加多个文件到镜像中的时候,不要一次性集中添加,而是选择 按需在必要时 逐个添加便可,由于这样有利于利用镜像缓存
虽然上面一条原则说推荐经过 COPY 命令来向镜像中添加多个文件,然而实际状况中,若文件 大而多的时候仍是应该优先用 docker -v
命令来挂载文件,而不是依赖于 ADD 或者 COPY
Dockerfile 制做镜像时,会组合 CMD 和 ENTRYPOINT 指令来做为容器运行时的默认命令:即 CMD + ENTRYPOINT。此时的默认命令组成中:
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 原参数被覆盖了:
所以推荐的使用方式是:
Dockerfile 能够经过 EXPOSE 指令 将容器端口映射到主机端口上,但这样会致使镜像在一台主机上仅能启动一个容器!
因此应该在 docker run
命令中来用 -p
参数来指定端口映射,而不要将该工做置于 Dockerfile 之中:
#尽可能避免这种方式 EXPOSE 8080:8899 #选择仅仅暴露端口便可,端口映射的任务交给 docker run 去作 EXPOSE 8080
推荐经过共享 Dockerfile 的方式来共享镜像,优势多多:
做者:CodeSheep
连接:https://juejin.im/post/5b4615b0f265...
来源:掘金
更多相关文章:
使用 Dockerfile 定制镜像
用 Dockerfile 打造你的自动化构建工具
Docker 底层技术
若是你还想了解更多,想和技术同僚分享切磋,可扫下方二维码,回复 yw,加入掘金运维技术交流群