前言
在前面构建自己的镜像时,我们是利用了commit命令,在初始容器中做一些改动变成新的容器后,再commit到本地的镜像仓库中。
除了上述的方法,还可以使用dockerfile
来完成自定义镜像的操作。可以简单认为dockerfile
就是这个容器的来由记录,即这个容器的是从哪个初始容器来,又是经历了哪些变化,这些信息在dockerfile中都被记录着。
Dockerfile 初探
dockerfile就是由一组命令构成的一个文本,例如以下。下面来慢慢讲解具体每个命令的含义。
1 | # 1、第一行必须指定 基础镜像信息 |
这里我将dockerfile的命令分成三组,容器基本信息
、容器配置操作
、容器构建完毕
。
容器基本信息
这组命令是用来给容器打上标签、写明维护者信息、以及初始容器的来源等信息。
FROM
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。而 FROM 就是指定基础镜像,因此一个 Dockerfile中 FROM 是必备的指令,并且必须是第一条指令。基本用法:
1 | FROM ubuntu:latest |
表示以Ubuntu:latest为基础镜像进行自定义的构建。
MAINTAINER
(最新版本的Docker已经将MAINTAINER 取消。维护者的信息可以使用LABEL进行标注)
指定维护者信息。基本用法:
1 | MAINTAINER jintx@qq.com |
LABEL
功能是为镜像指定标签。一个Dockerfile种可以有多个LABEL。( 如太长需要换行的话则使用\符号 )如下:
1 | LABEL version="1.0" |
可以使用docker inspect可查看镜像的标签信息。
容器配置操作
容器配置,即在基础镜像中,使用具体操作指令,构建自定义容器。我这里简单介绍三个常用的命令,还有许多的命令,后续再添加上去。
RUN
RUN 执行命令并创建新的镜像层,常用于安装软件包。
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层。多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。RUN书写时的换行符是\
具体用法:
1 | RUN pip install numpy |
表示在某个基础镜像上,添加了numpy模块包。
ENV
功能为设置环境变量。用法如下:
1 | ENV <key> <value> |
具体用法:
1 | ENV filepath /myapp |
这个和函数体中的宏一样。通常是为了通过命名来理解值的含义。
ADD/COPY
将本地文件复制到容器中。比如这里有一个Tomcat需要的war,本地要拷过去,这个时候就需要使用copy 命令。(Add会解压开、COPY不会解压)
1 | ADD/COPY <src>... <dest> |
容器构建完毕
下面这组命名是在启动容器时,执行的命令。也就是说这组命令对容器的构造是没有影响的。下面的两个命令,再了解完exec以及shell的两种执行方式之后,会有更好的理解。可以参考Dockerfile 中命令的两种书写方式的区别或者下一篇的的解析。
CMD
容器构建完成后,指定容器启动时执行的命令。
1 | CMD ["executable","param1","param2"] |
ENTRYPOINT
容器构建完成后,指定容器启动时执行的命令。
1 | ENTRYPOINT ["executable", "param1", "param2"] |
Build Dockerfile
上面只是简单的介绍了几种命令,详细的命令可以在网上查阅。对于编辑完成的dockerfile,可以使用docker build
命令,进行镜像的构建了。格式如下:
1 | docker build [OPTIONS] PATH | URL | - |
具体用法( . 表示使用当前文件夹下的dockerfile):1
docker build -t python:12 .
下图为镜像构建过程。