我们可以把刚才的对容器的所有操作命令都记录到一个文件里,就像写更脚本程序。之后用 docker build 命令以此文件为基础制作一个镜像,并会自动提交到本地仓库。这样的话镜像的构建会变的透明化,对镜像的维护起来也更加简单,只修改这个文件即可。
同时分享也更加简单快捷,因为只要分享这个文件即可。
Dokcerfile 是一个普通的文本文件,文件名一般叫 Dockerfile。
其中包含了一系列的指令(Instruction), 每一条指令都会构建一层,就是描述该层是如何创建的。
小试牛刀
示例:
- 编辑 Dockerfile 文件
[root@localhost ~]# mkdir centos_dockerfile
[root@localhost ~]# cd centos_dockerfile/
[root@localhost centos_dockerfile]# vi Dockerfile
FROM centos:latest
LABEL maintainer="yangge <yangge@qf.com>" description="Install tree vim*"
RUN rpm -qa | grep tree || yum install -y tree vim*
指令介绍:
FORM 定义一个基础镜像LABEL 定义一些元数据信息,比如作者、版本、关于镜像的描述信息RUN 执行命令行的命令
编辑完,保存退出
2.开始构建镜像
命令语法格式:
docker bulid -t 仓库名/镜像名:tag .
docker build [选项] <上下文路径/URL/->
示例:
[root@localhost centos_dockerfile]# docker build -t centos:1.20 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos:latest
---> e934aafc2206
Step 2/3 : LABEL maintainer="shark<dockerhub@163.com>" description="Install tree vim*"
---> Using cache
---> 1207b2848015
Step 3/3 : RUN rpm -qa | grep tree || yum install -y tree vim*
---> Running in 33d321b249d7
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
...略...
Complete!
Removing intermediate container 33d321b249d7
---> adc30981bc84
Successfully built adc30981bc84 # 表示构建成功
Successfully tagged centos:1.20 # TAG 标签
[root@localhost centos_dockerfile]#
构建镜像的上下文(context)
这个 . 表示当前目录,这实际上是在指定上下文的目录是当前目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像。
docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
最佳实战
一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f ../Dockerfile.qf 参数指定某个文件作为 Dockerfile。一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。