Dockerfile
🧩 一、Dockerfile 是什么?
Dockerfile 是一个纯文本文件,
里面写着 “如何从零构建出一个镜像” 的一系列指令。
一句话理解:
🧱 Dockerfile = 镜像配方
🍱 镜像(Image) = 根据 Dockerfile 做出来的系统模板
▶️ 容器(Container) = 镜像运行起来的实例
🧱 二、Dockerfile 的基本语法结构
| 指令 | 含义 | 示例 |
|---|---|---|
FROM |
指定基础镜像 | FROM python:3.12-slim |
WORKDIR |
设置工作目录(类似 cd) | WORKDIR /app |
COPY |
复制文件到镜像中 | COPY . . |
RUN |
执行命令(构建时) | RUN pip install -r requirements.txt |
EXPOSE |
声明容器暴露端口 | EXPOSE 8080 |
ENV |
设置环境变量 | ENV TZ=Asia/Shanghai |
CMD |
启动命令(容器启动时执行) | CMD ["python", "app.py"] |
ENTRYPOINT |
启动入口点(比 CMD 优先) | ENTRYPOINT ["python"] |
⚠️ 区分:
RUN 是构建时执行的命令(生成镜像层)
CMD 是容器启动时执行的命令(镜像运行时)
🧰 三、一个最小的 Dockerfile 示例(Python 应用)
# 1️⃣ 指定基础镜像
FROM python:3.12-slim
# 2️⃣ 设置容器内工作目录
WORKDIR /app
# 3️⃣ 复制当前目录下所有文件到容器 /app
COPY . .
# 4️⃣ 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 5️⃣ 暴露端口
EXPOSE 5000
# 6️⃣ 设置容器启动命令
CMD ["python", "app.py"]
✅ 配合的文件结构示例
project/
├─ app.py
├─ requirements.txt
└─ Dockerfile
四、Dockerfile 示例 2(Node.js 应用)
# 使用官方 Node 镜像作为基础
FROM node:20-alpine
# 创建工作目录
WORKDIR /app
# 复制依赖清单
COPY package*.json ./
# 安装依赖
RUN npm install --production
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3001
# 启动命令
CMD ["npm", "start"]
🧱 五、Dockerfile 示例 3(多阶段构建,适合生产)
# ====== 阶段1:构建阶段 ======
FROM node:20-alpine as builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# ====== 阶段2:运行阶段 ======
FROM nginx:1.27-alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
🧭 六、Dockerfile 与 docker-compose.yml 的配合
docker-compose.yml 可以直接引用 Dockerfile 自动构建镜像 👇
version: "3.8"
services:
web:
build: . # 自动使用当前目录的 Dockerfile
ports:
- "8080:5000"
运行:
docker compose up -d
会自动:
1️⃣ 根据 Dockerfile 构建镜像
2️⃣ 启动容器并映射端口
🧾 七、一个 .dockerignore 示例
__pycache__/
*.pyc
*.log
.git
.env
node_modules
📦 功能:避免无关文件被复制进镜像,提高构建速度。