第八章 使用Dockerfile创建镜像
Dockerfile是一个文本格式的配置文件, 用户可以使用Dockerfile来快速创建自定义的镜像。
8.1基本结构
Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。
一般而言, Dockerfile主体内容分为四部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。
示例:
首行可以通过注释来指定解析器命令,后续通过注释说明镜像的相关信息。主体部分首 先使用FROM指令指明所基于的镜像名称,接下来一般是使用LABEL指令说明维护者信息。后面则是镜像操作指令,例如RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。 最后是CMD指令,来指定运行容器时的操作命令。
下面是Docker Hub 上两个热门镜像nginx 和 Go的Dockerfile的例子,通过这两个例子。读者可以对Dockerfile结构有个基本的感知。
示例一: debian:j essie基础镜像基础上安装Nginx 环境, 从而创建一个新的 nginx镜像。
示例二: 基于buildpack-deps:jessie-scm基础镜像,安装 Golang相关环境,制作一个 Go语言的运行环境镜像。
下面,将讲解 Dockerfile 中各种指令的应用。
8.2 指令说明
Dockerfile 中指令的一般格式为 INSTRUCTION argumen七s, 包括 “配置指令" (配置 镜像信息)和 “操作指令"(具体执行操作),参见表 8-1。
8.2.1 配置指令
-
ARG
定义创建镜像过程中使用的变量。
在执行 docker build时,可以通过 -build-arg[=] 来为变量赋值。当镜像编译成功后,ARG指定的变量将不再存在 (ENV指定的变量将在镜像中保留)。Docker 内置了一些镜像创建变量,用户可以直接使用而无须声明,包括(不区分大小
写) HTTP_PROXY、 HTTPS_PROXY、 FTP_PROXY、 NO _PROXY。 -
FROM
指定所创建镜像的基础镜像。
任何Dockerfile 中第一条指令必须为FROM指令。 并且, 如果在同一个Dockerfile 中创建多个镜像时, 可以使用多个FROM指令(每个镜像一次)。
为了保证镜像精简, 可以选用体积较小的镜像如Alpine或Debian作为基础镜像。 例如:
-
LABEL
LABEL指令可以为生成的镜像添加元数据标签信息。 这些信息可以用来辅助过滤出特定镜像。
-
EXPOSE
声明镜像内服务监听的端口。
注意该指令只是起到声明作用,并不会自动完成端口映射. 如果要映射端口出来, 在启动容器时可以使用 -P参数 (Docker主机会自动分配一个宿主 机的临时端口)或-p HOST_PORT:CONTAINER_PORT 参数(具体指定所映射的本地端口)。 -
ENV