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

📦 功能:避免无关文件被复制进镜像,提高构建速度。