Dockerfile
Dockerfile 介绍
Dockerfile 是一个用来构建镜像的文本文件。
Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由多条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译成真正的 Linux 命令。
Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了 Dockerfile,当有定制额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成镜像。
创建镜像的三种方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于 Dockerfile 创建。
基于已有镜像创建
基于现有镜像创建主要使用 docker commit 命令,即把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
命令格式:
docker commit [选项] 容器ID/名称 仓库名称:[标签]
- -m:说明信息
- -a:作者信息
- -p:生成过程中停止容器的运行
首先,启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像。需要记住该容器的 ID 号,之后,可以使用 docker commit 命令创建一个新的镜像,创建完成后,会返回新创建镜像的 ID 信息。查看本地镜像列表时,可以看到新创建的镜像信息。
example:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aea2cc2ab1e6 centos:7.6.1810 "/bin/bash" 6 days ago Up 22 seconds centos
docker commit -m "new centos" -a "qingshan" aea2 centos:7.6
sha256:53fd43b0fc4f9ce2caaa784949ca8b60706370684a65a7a9c7a20bf34fa3c499
docker images | grep "centos"
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.6 53fd43b0fc4f 28 seconds ago 202MB
centos 7.6.1810 f1cb7c7d58b7 2 years ago 202MB
基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载。下载地址为:link
下面是使用 docker 导入命令将下载的 debian 模板压缩包导入为本地镜像的例子。
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new_test
sha256:f4856d1c424695f6f9565958673b7f2d7d6b12483185785dab280b7025f4a5b7
导入完成后,会返回生成镜像的 ID 信息。查看本地镜像列表时,可以看到新创建的镜像信息。
docker images | grep debian
REPOSITORY TAG IMAGE ID CREATED SIZE
debian new_test f4856d1c4246 43 seconds ago 215MB
基于 Dockerfile 创建
Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。
Dockerfile 结构大致分为四个部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令。
Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持使用以 “#“ 号开头的注释,Dockerfile 有十几条命令可用于构建镜像。
常用的 Dockerfile 操作指令如下所示:
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为 FROM 指令,每创建一个镜像就需要一条 FROM 指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD [“要运行的程序”,“参数 1”,“参数 2”] 令。 | 启动容器时要运行的命令或者脚本,Dockerfile 只能有一条CMD 命令。如果指定多条命令,只执行最后一条命令 |
EXPOSE 端口号 | 指定新镜像加载到 Docker 时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的 RUN 使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与 Dockerfile 在相同的目录中 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的 RUN、CMD、ENTRYPOINT 指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |