1. 基础指令
命令作用示例
FROM指定基础镜像(所有 Dockerfile 必须以 FROM 开头)FROM ubuntu:20.04(基于 Ubuntu 20.04)FROM mysql:5.7(基于 MySQL 5.7)
MAINTAINER(过时)声明镜像维护者(推荐用 LABEL 替代)MAINTAINER gao <gao@example.com>
LABEL添加镜像元数据(如作者、版本、描述),可自定义键值对LABEL author="gao" version="1.0" description="测试镜像"

2. 构建过程指令
命令作用示例
RUN构建镜像时执行的命令(如安装软件、创建目录),分 shell/exec 格式RUN apt update && apt install nginx -y(安装 Nginx)RUN ["mkdir", "/app"](exec 格式,避免 shell 解析)
COPY将宿主机文件 / 目录复制到镜像内(仅支持本地文件,不能访问网络)COPY ./app.jar /usr/local/app/(复制 jar 包到镜像)COPY ./conf /etc/nginx/(复制配置目录)
ADD增强版 COPY(支持解压压缩包、下载网络文件),优先用 COPY(更简洁)ADD https://xxx.tar.gz /tmp/(下载并解压)ADD app.tar.gz /usr/local/(自动解压 tar 包)
WORKDIR设置后续命令的工作目录(相当于 cd,推荐用绝对路径)WORKDIR /usr/local/app(后续命令都在该目录执行)
ENV设置环境变量(构建时和容器运行时都生效)ENV JAVA_HOME=/usr/local/jdk1.8ENV MYSQL_ROOT_PASSWORD=123456

3. 容器运行指令
命令作用示例
CMD容器启动时执行的命令(只能有 1 个生效,被 docker run 命令覆盖)CMD ["nginx", "-g", "daemon off;"](启动 Nginx 前台运行)CMD echo "容器启动成功"
ENTRYPOINT容器启动的「入口命令」(不会被覆盖,可配合 CMD 传参)ENTRYPOINT ["mysql", "-u", "root", "-p"](固定启动命令)CMD ["123456"](作为 ENTRYPOINT 的参数)
EXPOSE声明容器暴露的端口(仅标识,不自动映射,需 docker run -p 映射)EXPOSE 80 3306(声明暴露 80 和 3306 端口)
VOLUME声明容器数据卷(指定挂载目录,运行时自动挂载到宿主机)VOLUME ["/var/lib/mysql"](MySQL 数据目录)VOLUME /app/logs(日志目录)
USER指定容器运行的用户(默认 root,可切换普通用户)USER nginx(以 nginx 用户运行容器)USER 1000(以 UID=1000 的用户运行)
ONBUILD触发指令(当前镜像作为基础镜像时,子镜像构建时执行)ONBUILD COPY ./app /usr/local/app(子镜像构建时自动复制文件)

核心示例:一个完整的 Dockerfile(构建 Java 应用镜像)

# 基础镜像(Java 8)
FROM openjdk:8-jdk-alpine

# 维护者信息
LABEL author="gao" version="1.0"

# 设置工作目录
WORKDIR /usr/local/app

# 复制jar包到镜像
COPY ./demo-0.0.1-SNAPSHOT.jar app.jar

# 暴露端口
EXPOSE 8080

# 容器启动命令
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]

关键注意事项

  1. 分层构建:每个 RUN/COPY/ADD 都会生成新镜像层,尽量合并命令(如 RUN apt update && apt install -y nginx vim),减少层数;
  2. CMD vs ENTRYPOINT
    • CMD 可被 docker run 命令覆盖(如 docker run 镜像名 echo "test" 会替换 CMD);
    • ENTRYPOINT 固定入口,docker run 传参会作为其参数(如 docker run 镜像名 --server.port=8081);
  3. 镜像瘦身:用 alpine 版本基础镜像(体积小),构建后清理缓存(如 RUN apt clean && rm -rf /var/lib/apt/lists/*)。

总结

  1. Dockerfile 核心是「分层构建」,FROM 是基础,RUN/COPY 构建镜像内容,CMD/ENTRYPOINT 定义容器启动行为;
  2. 优先用 COPY 而非 ADDWORKDIR 替代 cd,合并 RUN 命令减少镜像层数;
  3. 构建镜像命令:docker build -t 镜像名:版本 Dockerfile所在目录(如 docker build -t myapp:1.0 .)。

更多推荐