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.8``ENV 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"]
关键注意事项
- 分层构建 :每个
RUN/COPY/ADD都会生成新镜像层,尽量合并命令(如RUN apt update && apt install -y nginx vim),减少层数; - CMD vs ENTRYPOINT :
CMD可被docker run命令覆盖(如docker run 镜像名 echo "test"会替换 CMD);ENTRYPOINT固定入口,docker run传参会作为其参数(如docker run 镜像名 --server.port=8081);
- 镜像瘦身 :用
alpine版本基础镜像(体积小),构建后清理缓存(如RUN apt clean && rm -rf /var/lib/apt/lists/*)。
总结
- Dockerfile 核心是「分层构建」,
FROM是基础,RUN/COPY构建镜像内容,CMD/ENTRYPOINT定义容器启动行为; - 优先用
COPY而非ADD,WORKDIR替代cd,合并RUN命令减少镜像层数; - 构建镜像命令:
docker build -t 镜像名:版本 Dockerfile所在目录(如docker build -t myapp:1.0 .)。