使用 Dockerfile 定制镜像
前面我们介绍过镜像的使用,除了引用制作好的镜像,我们也可以基于现有镜像定制新的镜像。定制所用的脚本文件就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction) ,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
我们新建一个空白文件,命名为 dockerfile
,再文件中写入如下内容:
FROM redis
RUN mkdir redis
WORKDIR redis
COPY ./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 kB
Step 1 : FROM redis
...
...
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
docker build
的用法为:
docker build [选项] <上下文路径/URL/->
最后,可以使用docker push
将你自己构建的镜像上传到仓库中,详细用法见官方文档 push