04 - Docker Compose 多容器编排
什么是 Docker Compose?
当应用由多个容器组成时(Web + DB + Cache),手动一个个 docker run 太麻烦。 Docker Compose 用一个 YAML 文件定义和管理多容器应用。
docker-compose.yml 结构
yaml
# 版本声明(新版 Docker Compose 可以省略)
services:
# 服务名称
web:
build: ./web # 从 Dockerfile 构建
ports:
- "8080:80" # 端口映射
environment: # 环境变量
- DB_HOST=db
depends_on: # 依赖关系
- db
- redis
volumes:
- ./web/src:/app/src # Bind mount(开发用)
restart: unless-stopped # 重启策略
db:
image: postgres:16-alpine # 使用现有镜像
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data # 命名卷
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
# 声明命名卷
volumes:
db-data:
# 声明自定义网络(可选,Compose 默认创建一个)
networks:
app-net:Compose 常用命令
bash
# 启动所有服务(前台)
docker compose up
# 后台启动
docker compose up -d
# 只启动指定服务
docker compose up -d db redis
# 构建/重新构建镜像
docker compose build
docker compose up -d --build # 构建并启动
# 查看运行状态
docker compose ps
# 查看日志
docker compose logs
docker compose logs -f web # 跟踪指定服务
# 执行命令
docker compose exec web sh
# 停止服务
docker compose stop
# 停止并移除容器、网络
docker compose down
# 停止并移除容器、网络、卷(数据也会删除!)
docker compose down -v
# 水平扩展
docker compose up -d --scale web=3实操项目:Flask + PostgreSQL + Redis
项目结构
compose-projects/flask-app/
├── docker-compose.yml
├── web/
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
└── README.mddocker-compose.yml
yaml
services:
web:
build: ./web
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://user:secret@db:5432/myapp
- REDIS_URL=redis://redis:6379/0
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./web:/app
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
volumes:
db-data:
redis-data:关键知识点
- 服务发现:Compose 自动创建网络,服务名即主机名(
db,redis) - depends_on + healthcheck:确保依赖服务就绪后才启动
- 数据持久化:命名卷保证数据不丢失
- 开发热更新:Bind mount 挂载源码,修改即生效
环境变量管理
bash
# 方式1:直接在 yml 中写
environment:
- DB_HOST=db
# 方式2:使用 .env 文件
# .env
DB_HOST=db
DB_PORT=5432
# docker-compose.yml
environment:
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
# 方式3:env_file 指向环境文件
env_file:
- .env
- .env.local重启策略
| 策略 | 说明 |
|---|---|
no | 不自动重启(默认) |
always | 总是重启 |
on-failure | 非零退出码时重启 |
unless-stopped | 除非手动停止,否则重启 |
Compose 到 K8s 的过渡
Docker Compose 是单机编排工具,适合开发和简单部署。 Kubernetes 是集群编排系统,适合生产环境。
| 特性 | Docker Compose | Kubernetes |
|---|---|---|
| 规模 | 单机 | 集群 |
| 自动修复 | 重启策略 | 完整的自愈能力 |
| 扩缩容 | 手动 scale | 自动 HPA |
| 滚动更新 | 不支持 | 原生支持 |
| 服务发现 | 容器名 DNS | Service + DNS |
| 负载均衡 | 无 | Service 内置 |
| 配置管理 | env 文件 | ConfigMap/Secret |
学完 Docker Compose,你就为理解 K8s 打好了基础——很多概念是一脉相承的。
