使用 Dockerfile 定制镜像
前面我们介绍过镜像的使用,除了引用制作好的镜像,我们也可以基于现有镜像定制新的镜像。定制所用的脚本文件就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction) ,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
我们新建一个空白文件,命名为 dockerfile,再文件中写入如下内容:
FROM redisRUN mkdir redisWORKDIR redisCOPY ./redis.conf /etc/CMD ["redis-server", "/etc/redis.conf"]
我们依次解释上面每一行:
- FROM 就是指定 基础镜像 ,一个
Dockerfile中FROM是必备的指令,并且必须是第一条指令。如果不以任何镜像为基础,那应该用FROM scratch作为起始指令。 RUN 是Dockerfile的核心指令,用于执行一条命令,由于Dockerfile 每一条指令都会新建一层,所以应该尽量将执行的内容写在一行(多行内容可以通过在末尾加
\以表示未结束),它有两种写法:- shell 格式:
RUN <命令>,就像直接在命令行中输入的命令一样。 - exec 格式:
RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。
- shell 格式:
- WORKDIR 表示指定当前工作目录,相当于
cd命令。 - COPY 即复制文件到容器中,在这里是把redis.conf文件复制到容器的
/etc目录下。 - CMD 是启动程序的命令,写法和
RUN相同,一般推荐使用exec格式。
常用Docker指令列表如下:
| 指令 | 含义 | 用法 | |
|---|---|---|---|
| FROM | 指定基础镜像 | FROM <基础镜像> |
|
| RUN | 执行指令 | RUN ["可执行文件", "参数1", "参数2"] |
|
| COPY | 复制文件 | COPY ["<源路径1>",... "<目标路径>"] |
|
| ADD | 更高级的复制文件 | ADD "<压缩文件>" |
|
| CMD | 容器启动命令 | CMD ["可执行文件", "参数1", "参数2"...] |
|
| ENTRYPOINT | 入口点 | ENTRYPOINT ["可执行文件", "参数1", "参数2"] |
|
| ENV | 设置环境变量 | ENV <key1>=<value1> <key2>=<value2>... |
|
| ARG | 构建参数 | ARG <参数名>[=<默认值>] |
|
| VOLUME | 定义匿名卷 | VOLUME ["<路径1>", "<路径2>"...] |
|
| EXPOSE | 暴露端口 | EXPOSE <端口1> [<端口2>...] |
|
| WORKDIR | 指定工作目录 | WORKDIR <工作目录路径> |
|
| USER | 指定当前用户 | USER <用户名> |
|
| HEALTHCHECK | 健康检查 | `HEALTHCHECK NONE | [选项] CMD <命令>` |
| ONBUILD | 构建下级镜像 | ONBUILD <其它指令> |
|
| MAINTAINER | 指定作者 | ONBUILD <作者> |
更多指令及用法请参照官方文档
如上,我们完成了一个使用自己配置文件的redis镜像的准备工作,之后依据这个Dockerfile进行构建:
docker build -t redis_test:v0.1 .# 会有类似如下输出:Sending build context to Docker daemon 2.048 kBStep 1 : FROM redis......Removing intermediate container 9cdc27646c7bSuccessfully built 44aa4490ce2c
docker build的用法为:
docker build [选项] <上下文路径/URL/->
最后,可以使用docker push将你自己构建的镜像上传到仓库中,详细用法见官方文档 push
