Docker Compose¶
Compose 用 compose.yaml 定义和运行一组服务、网络和数据卷。
services:
web:
image: nginx:alpine
ports:
- "127.0.0.1:8080:80"
depends_on:
api:
condition: service_healthy
api:
image: example/api:1.0.0
environment:
APP_ENV: production
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8000/health"]
interval: 30s
timeout: 5s
retries: 3
docker compose config
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down
docker compose down --volumes 会删除 Compose 创建的数据卷,执行前确认数据是否需要保留。Compose 默认会为同一项目创建网络,服务可用服务名互相访问。Docker Compose 官方说明
一份完整的单机部署骨架¶
name: order
services:
api:
image: registry.example.com/order-api:1.4.0
restart: unless-stopped
env_file:
- .env
environment:
DB_HOST: db
depends_on:
db:
condition: service_healthy
networks: [frontend, backend]
volumes:
- ./config/application.yaml:/app/config/application.yaml:ro
ports:
- "127.0.0.1:8080:8080"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8080/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s
deploy:
resources:
limits:
cpus: "2"
memory: 1G
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_DB: order
POSTGRES_USER: order
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets: [db_password]
volumes:
- db-data:/var/lib/postgresql/data
networks: [backend]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U order"]
interval: 10s
timeout: 3s
retries: 10
networks:
frontend:
backend:
internal: true
volumes:
db-data:
secrets:
db_password:
file: ./secrets/db_password.txt
数据库没有发布主机端口,只在 backend 网络访问。示例文件型 Secret 仍需设置主机权限并避免进入 Git;更高安全需求应使用外部密钥系统。
配置合并与环境变量¶
docker compose --env-file .env.production config
docker compose -f compose.yaml -f compose.production.yaml config
先用 config 查看插值和多文件合并后的最终模型,避免变量为空、端口和 Volume 被意外覆盖。.env 参与 Compose 插值,不等同于自动注入所有容器环境变量。
生命周期命令¶
docker compose pull
docker compose up -d --remove-orphans
docker compose ps
docker compose logs --tail 200 -f api
docker compose exec api sh
docker compose restart api
docker compose stop
docker compose down
restart 不会采用变更后的 image、environment、port 或 volume 配置;使用 up -d 重建。down 删除容器和默认网络,默认保留 Named Volume;带 -v 才会删除 Compose Volume。
depends_on 的边界¶
depends_on 控制启动顺序;配合 service_healthy 能等待健康状态,但不能保证依赖永远可用。应用仍需实现连接超时、有限重试和运行期重连。数据库启动完成也不表示迁移任务已经执行。
更新与回滚¶
Compose 没有 Kubernetes 式滚动发布控制器。单实例重建通常有中断,需要反向代理 + 双实例/蓝绿、维护窗口或迁移到编排平台。数据库变更必须向后兼容,回滚镜像不会回滚数据。
生产检查¶
- 镜像固定版本或 Digest,不在服务器现场 build。
- 只有入口端口对外发布,数据库和管理端口保持内部。
- 配置只读、数据持久化、日志轮转、资源限制和 Healthcheck 完整。
- 明确项目名,避免不同目录生成不同资源名。
- Compose 文件、环境模板和操作步骤进入 Git,真实 Secret 排除。
- 配置宿主机开机启动策略、备份、监控和升级窗口。