Docker Dockerfile 基本使用指南

作者:技术拾光时间:2026-07-25 09:16:21浏览:266

Dockerfile 本质上是一种自动化构建脚本,由一系列命令和参数组成,层层叠加在基础镜像上,最终生成全新的镜像。整个过程从 FROM 开始,随后进行配置、安装、拷贝等操作,最后输出可直接用于创建容器的成品。Dockerfile 使得镜像构建具备可重复性和可追溯性,显著简化了部署的复杂度。 Doc

Dockerfile 本质上是一种自动化构建脚本,由一系列命令和参数组成,层层叠加在基础镜像上,最终生成全新的镜像。整个过程从 FROM 开始,随后进行配置、安装、拷贝等操作,最后输出可直接用于创建容器的成品。Dockerfile 使得镜像构建具备可重复性和可追溯性,显著简化了部署的复杂度。

Dockerfile 语法

在动手操作之前,先快速了解 Dockerfile 的语法规则,掌握其基本结构。

所谓语法,就是告诉计算机“用什么指令、带什么参数”的一套约定。Dockerfile 的语法设计简洁直观,支持注释,指令自解释,结构清晰。语法错误会导致构建失败,因此规范编写至关重要。

语法示例

Dockerfile 的内容由两部分组成:注释(以 # 开头)和命令(指令+参数)。

一个最简单的示例如下:

# Print "Hello docker!"
RUN echo "Hello docker!"

Dockerfile 命令详解

Dockerfile 提供了十余条命令用于构建镜像,下面逐一介绍最常用的指令。

FROM

FROM 
或
FROM :

该指令指定基础镜像,后续所有操作均基于此镜像。它必须放在 Dockerfile 的第一行。例如 FROM ubuntu,若不指定 tag,默认使用 latest;若镜像不存在,构建将直接失败。

RUN

RUN    # shell 格式,默认用 /bin/sh -c 执行
RUN ["executable", "param1", "param2"]  # exec 格式

RUN 在当前镜像中执行命令,并将结果提交为新的一层。可理解为手动执行 docker run image command 后再执行 docker commit 的合成操作。

注释

以 # 开头,用于解释代码,不参与构建。例如:

# 这是注释
FROM ubuntu
# 更新源
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

MAINTAINER

MAINTAINER 

用于标明维护者的姓名和联系方式,相当于镜像的“作者标签”。例如:

MAINTAINER Guillaume J. Charmes, guillaume@dotcloud.com

ENTRYPOINT

ENTRYPOINT cmd param1 param2        # shell 格式
ENTRYPOINT ["cmd", "param1", "param2"]  # exec 格式

ENTRYPOINT 配置容器启动时要执行的命令。例如:

FROM ubuntu
ENTRYPOINT echo "Welcome!"
# 启动后输出 Welcome!

USER

USER daemon

指定运行后续命令(以及容器启动后的进程)所用的用户。通常配合 ENTRYPOINT 使用,比如让 memcached 以 daemon 用户运行:

ENTRYPOINT ["memcached"]
USER daemon

EXPOSE

EXPOSE  [...]

暴露容器内的端口,方便外部通信。例如 memcached 默认使用 11211 端口:

EXPOSE 11211

下面是一个完整的 Memcached 镜像 Dockerfile 示例:

# Memcached
# VERSION 2.2
FROM ubuntu
MAINTAINER Victor Coisne victor.coisne@dotcloud.com
# 更新源(国内建议换成 163 或 sohu 的源,不然太慢)
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
# 安装 memcached
RUN apt-get install -y memcached
# 设置启动命令
ENTRYPOINT ["memcached"]
# 以 daemon 用户运行
USER daemon
# 暴露端口
EXPOSE 11211

实际构建的过程(以 163 源为例):

docker build -t tankywoo - < Dockerfile
# 输出会显示每一步的提交,最终生成镜像
Step 0 : FROM ubuntu
Step 1 : MAINTAINER Victor Coisne ...
...
Successfully built 666c5d65f396

ENV

ENV  

设置环境变量,后续的 RUN 命令可直接使用。生成的容器中也会保留这些变量,通过 docker inspect 可查看:

"Env": [
    "name=tanky",
    "HOME=/",
    "PATH=/usr/local/sbin:..."
]

也可以在 docker run 时临时覆盖:docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash

ADD

ADD  

将构建上下文中的文件或目录复制到容器的目标路径。src 可以是本地相对路径或远程 URL,dest 必须是容器内的绝对路径。

VOLUME

VOLUME [""]

创建一个挂载点,用于在容器和宿主机之间共享目录。例如 VOLUME ["/data"]。

WORKDIR

WORKDIR /path/to/workdir

设置后续 RUN、CMD、ENTRYPOINT 的执行目录。可多次使用,若为相对路径,则基于上一个 WORKDIR。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 实际在 /a/b/c 下执行 pwd

CMD

CMD ["executable","param1","param2"]   # exec 格式
CMD ["param1","param2"]                # 作为 ENTRYPOINT 的默认参数
CMD command param1 param2              # shell 格式

CMD 提供容器启动时的默认命令。一个 Dockerfile 中只能有一个 CMD,若存在多个,仅最后一个生效。