Docker 镜像是一个特殊的分层文件系统,包含应用程序和必要的依赖环境,但并不包含任何的动态信息。构建一个镜像,实际上就是为镜像中的每一层创建相应的配置。因此,可以把构建的命令语句、参数配置等信息都写入一个脚本中,这样,“docker commit”命令的无法重复的问题、镜像臃肿的问题就都被解决了。这个脚本就是 Dockerfile。
一、什么是Docker File?
Dockerfile是一个文本文件,其内包含一条条的指令,每一条指令都用于构建镜像中的一层。Dockerfile可以使用“docker build”命令进行编译。在编译过程中,每一条指令的内容就是描述该层应如何进行构建。当我们需要定制自己额外的需求时,只需要在Dockerfile文件的基础上添加或者修改指令,重新生成新的镜像即可。
视频讲解如下:
二、Docker File示例
下面通过一个简单的示例来演示如何使用Dockerfile。在这个示例中,将基于Nginx的镜像来构建一个新的镜像,并在该镜像中部署一个简单的Web网页。
(1)创建一个文件“Dockerfile”。在该文件中输入以下命令。
FROM nginx RUN echo '<h1>This is a Demo HTML</h1>' > /usr/share/nginx/html/index.html
(2)在Dockerfile所在的目录下执行“docker build”命令构建镜像。构建的过程如下图所示。
提示:“docker build”命令会在当前目录下寻找名为“Dockerfile”的文件,然后对该文件进行编译生成镜像。如果文件名不是Dockerfile,则可以在使用“docker build”命令加上“-f”参数指定文件名称。
(3)查看新生成的镜像,如下图所示。
(4)使用新生成的镜像创建容器。
docker run -d -p 7788:80 mynginx
(5)使用浏览器访问宿主机的7788端口,可以看到如下图所示界面。
三、Docker File文件详解
下图展示了 Docker 镜像、容器和 Dockerfile 三者的关系。可以看出使用 Dockerfile 文件定义镜像,然后运行镜像启动容器。
下表列出了一个完整的Dockerfile 文件的组成部分。
当完成了Dockerfile的编写后,使用“docker build”命令将会根据Dockerfile中上下文的内容构建新Docker镜像。整个构建的过程会被递归处理。因此,如果在Dockerfile中含有子路径或URL等信息,则它们都将被递归进行构建。
提示:在使用“docker build”进程镜像构建时,还可以通过-t参数指定生成镜像的仓库地址和标签等信息。Dockerfile构建镜像的过程请参考下图。
“docker build”命令在使用Dockerfile生成镜像时,会通过Docker的守护进程执行Dockerfile中的每一条指令,并在每一步执行完成后生成一个新镜像。当所有的指令执行完成后,会输出最终镜像的ID。当镜像最终生成后,Docker的守护进程会自动清理Docker的上下文环境,并自动重用已生成的中间镜像,以加速构建的速度。图2-35中方框的部分表明,在构建过程中使用到了Dockerfile的缓存机制。