使用 Dockerfile 定制镜像

  • 前面我们介绍过镜像的使用,除了引用制作好的镜像,我们也可以基于现有镜像定制新的镜像。定制所用的脚本文件就是 Dockerfile。

  • Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction) ,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

我们新建一个空白文件,命名为 dockerfile,再文件中写入如下内容:

  1. FROM redis
  2. RUN mkdir redis
  3. WORKDIR redis
  4. COPY ./redis.conf /etc/
  5. CMD ["redis-server", "/etc/redis.conf"]

我们依次解释上面每一行:

  • FROM 就是指定 基础镜像 ,一个 DockerfileFROM 是必备的指令,并且必须是第一条指令。如果不以任何镜像为基础,那应该用FROM scratch作为起始指令。
  • RUN 是Dockerfile的核心指令,用于执行一条命令,由于Dockerfile 每一条指令都会新建一层,所以应该尽量将执行的内容写在一行(多行内容可以通过在末尾加\以表示未结束),它有两种写法:

    • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。
    • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。
  • 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进行构建:

  1. docker build -t redis_test:v0.1 .
  2. # 会有类似如下输出:
  3. Sending build context to Docker daemon 2.048 kB
  4. Step 1 : FROM redis
  5. ...
  6. ...
  7. Removing intermediate container 9cdc27646c7b
  8. Successfully built 44aa4490ce2c

docker build的用法为:

  1. docker build [选项] <上下文路径/URL/->

最后,可以使用docker push将你自己构建的镜像上传到仓库中,详细用法见官方文档 push