Docker Compose 速查表 — 多容器编排
Docker Compose 允许你通过一个 YAML 文件定义和运行多容器的 Docker 应用程序。本速查表涵盖 Compose 文件格式、CLI 命令、网络配置、卷挂载、环境变量、健康检查以及生产环境实践。
快速参考
| 场景 | 命令 |
| 启动所有服务(前台) | docker compose up |
| 启动所有服务(后台) | docker compose up -d |
| 停止并移除所有容器 | docker compose down |
| 查看服务日志 | docker compose logs -f |
| 列出服务状态 | docker compose ps |
| 构建或重建镜像 | docker compose build |
| 执行容器内命令 | docker compose exec |
| 查看服务实时指标 | docker compose top |
| 拉取所有服务镜像 | docker compose pull |
| 重启所有服务 | docker compose restart |
docker-compose.yml 核心配置
### 基础结构
``yaml
version: "3.9" # 推荐使用 3.8+,V2 可不指定版本
services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html networks: - frontend
api: build: ./api ports: - "3000:3000" environment: - DB_HOST=db - DB_PORT=5432 depends_on: - db networks: - frontend - backend
db: image: postgres:15-alpine volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: secret networks: - backend
volumes: pgdata:
networks:
frontend:
backend:
`
### 构建配置(build)
`yaml
services:
app:
build:
context: ./app # Dockerfile 所在目录
dockerfile: Dockerfile.prod # 指定 Dockerfile 文件名
args: # 构建参数(仅构建时可用)
NODE_ENV: production
target: prod # 多阶段构建的目标阶段
`
### 端口映射
`yaml
services:
web:
ports:
- "80:80" # 主机端口:容器端口
- "443:443/tcp" # 指定协议(tcp/udp)
- "3000-3005:3000-3005" # 端口范围
- "8080:80" # 自定义主机端口
`
### 环境变量
`yaml
services:
app:
# 方式一:直接指定
environment:
- NODE_ENV=production
- DEBUG=false
- DB_HOST=localhost
# 方式二:从 .env 文件加载 env_file: - ./app/.env - ./app/.env.production # 可指定多个文件,后面覆盖前面
# 方式三:引用宿主机环境变量
environment:
- HOSTNAME # 不加 = 值,直接取宿主机同名变量
- SECRET_KEY=${SECRET_KEY:-default_value} # 带默认值
`
### 卷挂载
`yaml
services:
app:
volumes:
# 命名卷(推荐用于持久化数据)
- data:/var/lib/data
# 绑定挂载(开发时热重载) - ./src:/app/src
# 只读挂载 - ./config:/app/config:ro
# 匿名卷 - /var/lib/logs
# 宿主机上的绝对路径 - /home/user/data:/data
volumes:
data: # 命名卷声明
driver: local
`
### 网络配置
`yaml
services:
web:
networks:
- frontend
- backend
db: networks: - backend aliases: # 网络别名(同一网络内的其他服务可通过别名访问) - database
networks:
frontend:
driver: bridge # bridge(默认)、host、overlay、none
backend:
driver: bridge
ipam: # 自定义 IP 地址池
config:
- subnet: 172.20.0.0/24
`
### 依赖与启动顺序
`yaml
services:
app:
depends_on:
- db
- redis
db: image: postgres:15
redis:
image: redis:7-alpine
`
`yaml
# V2 完整版 — 等待服务健康就绪
services:
app:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db: image: postgres:15 healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d mydb"] interval: 5s timeout: 5s retries: 5 start_period: 10s
redis:
image: redis:7-alpine
`
### 健康检查
`yaml
services:
api:
image: myapp:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s # 每 30 秒检查一次
timeout: 10s # 单次检查超时时间
retries: 3 # 连续失败 3 次标记为 unhealthy
start_period: 40s # 容器启动后等待 40s 才开始检查
`
常用 CLI 命令详解
### 启动与管理
`bash
# 前台启动(终端附着,Ctrl+C 停止)
docker compose up
# 后台启动 docker compose up -d
# 启动指定服务 docker compose up -d web api
# 停止所有服务(不删除容器) docker compose stop
# 停止指定服务 docker compose stop db
# 启动已存在的停止容器 docker compose start
# 重启所有服务 docker compose restart
# 停止并删除容器 + 网络(默认保留卷) docker compose down
# 停止并删除所有(含卷、镜像)
docker compose down -v --rmi all
`
### 查看信息
`bash
# 查看服务状态
docker compose ps
# 查看实时日志 docker compose logs -f
# 查看指定服务日志(最后 50 行) docker compose logs --tail=50 -f api
# 查看服务进程 docker compose top
# 列出镜像
docker compose images
`
### 构建与镜像
`bash
# 构建或重建所有镜像
docker compose build
# 强制重新构建(不使用缓存) docker compose build --no-cache
# 构建指定服务 docker compose build web
# 拉取服务镜像 docker compose pull
# 推送服务镜像到仓库
docker compose push
`
### 调试与执行
`bash
# 在运行中的容器执行命令
docker compose exec web ls -la /app
# 交互式进入容器 docker compose exec -it web bash
# 在新容器中运行一次性命令 docker compose run --rm api npm test
# 指定端口映射运行一次性命令
docker compose run -p 3000:3000 web npm start
`
### 扩展与缩放
`bash
# 将 web 服务扩展到 3 个实例
docker compose up -d --scale web=3
# 限制单个服务使用的资源
docker compose up -d --scale web=2 --scale worker=5
`
高级配置模式
### 资源限制
`yaml
services:
app:
deploy:
resources:
limits:
cpus: "0.5" # 限制使用半个 CPU
memory: 512M # 限制最大内存 512MB
reservations:
cpus: "0.25"
memory: 256M
`
### 日志配置
`yaml
services:
app:
logging:
driver: "json-file" # json-file(默认)、syslog、fluentd、awslogs、gelf
options:
max-size: "10m" # 单个日志文件最大 10MB
max-file: "3" # 最多保留 3 个日志文件
`
### 重启策略
`yaml
services:
app:
restart: unless-stopped # 可选值:
# no — 从不重启(默认)
# always — 总是重启
# on-failure — 退出码非 0 时重启
# unless-stopped — 除非手动停止,否则总是重启
`
### 配置文件注入
`yaml
services:
app:
configs: # Swarm 模式下可用
- source: app_config
target: /etc/app/config.yml
uid: "1000"
gid: "1000"
mode: 0440
configs:
app_config:
file: ./config.yml
`
### secrets 管理
`yaml
services:
app:
secrets:
- db_password
- api_key
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
environment: "API_KEY" # 从环境变量读取
`
多环境配置(多 Compose 文件)
`bash
# 基础配置 + 覆盖配置
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 合并多个文件(后面覆盖前面)
docker compose \
-f docker-compose.yml \
-f docker-compose.override.yml \
-f docker-compose.prod.yml \
up -d
`
示例覆盖文件 docker-compose.prod.yml:
`yaml
services:
web:
ports:
- "80:80"
restart: always
environment:
- NODE_ENV=production
db:
deploy:
resources:
limits:
memory: 1G
`
生产环境最佳实践
| 实践 | 说明 |
| 固定镜像版本 | 使用具体版本标签(如 postgres:15.4)而不是 latest |
| 使用 .env 文件 | 将敏感信息和环境差异放到 .env 文件,不提交到 Git |
| 设置重启策略 | 生产服务使用 restart: unless-stopped 或 restart: always |
| 配置健康检查 | 为每个关键服务配置 healthcheck,配合 depends_on 条件等待 |
| 限制资源使用 | 为每个服务设置 CPU 和内存限制,防止资源争抢 |
| 使用命名卷 | 持久化数据使用命名卷,避免使用绑定挂载的生产风险 |
| 分离 Compose 文件 | 基础配置 + 环境覆盖(dev/staging/prod)多文件组合 |
| 日志管理 | 配置日志轮转(max-size / max-file),防止磁盘写满 |
| 安全扫描 | 使用 docker scout` 扫描镜像漏洞 |
Compose 编排(20)
| 命令 | 难度 | ||
|---|---|---|---|
docker compose up启动所有服务 | 基础 | docker compose up -d | |
docker compose down停止并移除所有服务 | 基础 | docker compose down | |
docker compose logs查看服务日志 | 基础 | docker compose logs -f | |
docker compose ps列出所有服务容器 | 基础 | docker compose ps | |
docker compose build构建或重新构建服务镜像 | 中级 | docker compose build | |
docker compose exec在运行中的容器内执行命令 | 中级 | docker compose exec web bash | |
docker compose restart重启所有服务 | 基础 | docker compose restart | |
docker compose pull拉取服务镜像 | 基础 | docker compose pull | |
docker compose push推送服务镜像到仓库 | 中级 | docker compose push | |
docker compose run运行一次性命令 | 中级 | docker compose run web env | |
docker compose stop停止所有服务而不移除容器 | 基础 | docker compose stop | |
docker compose rm移除已停止的服务容器 | 中级 | docker compose rm -f | |
docker compose top显示正在运行的进程 | 中级 | docker compose top | |
docker compose config验证并查看 Compose 配置 | 中级 | docker compose config | |
docker compose images列出服务使用的镜像 | 基础 | docker compose images | |
docker compose create创建服务容器但不启动 | 中级 | docker compose create | |
docker compose events监控容器的实时事件 | 高级 | docker compose events --json | |
docker compose kill强制终止服务容器 | 中级 | docker compose kill web | |
docker compose port查看服务容器的公共端口映射 | 中级 | docker compose port web 3000 | |
docker compose version显示 Docker Compose 版本信息 | 基础 | docker compose version |