引言
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。
Dockerfile介绍
通过下图可以看出使用 Dockerfile 定义镜像,运行镜像启动容器:
Docker 镜像是由 Dockerfile 构建而成,Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。最简单的形式是由FROM、ADD、VOLUME、CMD四个部分组成,我们可以写一个最简单的Dockerfile文件:
FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]
FROM ubuntu:16.04
:设置基础镜像,此时会使用基础镜像ubuntu:16.04
的所有镜像层,为简单起见,图中将其作为一个整体展示
ADD run.sh /
:将 Dockerfile 所在目录的文件run.sh
加至镜像的根目录,此时新一层的镜像只有一项内容,即根目录下的run.sh
VOLUME /data
:设定镜像的 VOLUME,此 VOLUME 在容器内部的路径为/data
。需要注意的是,此时并未在新一层的镜像中添加任何文件,但更新了镜像的 json 文件,以便通过此镜像启动容器时获取这方面的信息。
CMD ["./run.sh"]
:设置镜像的默认执行入口,此命令同样不会在新建镜像中添加任何文件,仅仅在上一层镜像 json 文件的基础上更新新建镜像的 json 文件。
然后之后还有别的命令,我们本篇主要构建的是将我们自己的Python代码能够在docker本地上运行成功,并保存成镜像,推送到dockerhub上。
dockerfile书写规范
dockerfile除了上面最基础但又是比较重要的语法构成外,还有一些其它的命令同样能帮助我们完善docker镜像,下面参考Docker(三):Dockerfile 命令详解 对上述命令进行一个整体的概括与整理:
命令 | 说明 | 详解 |
---|---|---|
from | 指定基础镜像 | 必须为第一条非注释指令,多个from可以创建多个镜像,但from前需提交上次镜像ID |
run | 执行特定命令 | 位置没有限制,层级构建docker的命令 |
copy | 复制文件 | copy指令将从构建上下文目录中的文件复制到镜像内的目标路径 |
add | 高级复制命令 | 和copy有一样的功能,多了源路径可以是url的情况 |
env |