Docker Compose 完全指南:从入门到生产实践
1. Docker Compose 简介与核心价值
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务。
核心优势:
- 简化多容器管理:通过单一文件管理多个关联容器
- 开发环境标准化:团队共享相同的环境配置
- 快速环境搭建:一条命令启动复杂应用栈
- 服务依赖管理:自动处理服务间的依赖关系
- 配置即代码:版本控制环境配置
典型应用场景:
- 开发环境搭建
- 自动化测试环境
- 单主机部署
- 微服务应用演示
2. Compose 文件结构与版本
2.1 基本文件结构
version: "3.8" # 指定Compose文件格式版本
services: # 容器服务定义
webapp:
image: nginx:alpine
ports:
- "80:80"
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes: # 持久化卷定义
db-data:
版本选择建议:
- 新项目使用 3.8+ 版本
- 需要 swarm 部署时使用 3.x 版本
- 旧系统兼容考虑 2.4 版本
2.2 版本演进对比
特性 | 2.x 系列 | 3.x 系列 |
---|---|---|
Swarm 模式支持 | 有限支持 | 完整支持 |
GPU 支持 | 不支持 | 3.7+ 支持 |
扩展字段 | 不支持 | 3.4+ 支持 |
服务依赖 | depends_on 基本 | 增强的健康检查依赖 |
3. 核心服务配置详解
3.1 镜像与构建
使用现有镜像:
services:
redis:
image: redis:6.2-alpine
基于 Dockerfile 构建:
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile.dev
args:
NODE_ENV: development
image: my-webapp:1.0
参数说明:
context
:构建上下文路径dockerfile
:指定 Dockerfile 文件名args
:构建时变量传递
3.2 端口映射
services:
web:
ports:
- "80:80" # 主机端口:容器端口
- "443:443/tcp" # 指定协议
- "3000-3005:3000-3005" # 端口范围
- "9090" # 仅暴露容器端口
最佳实践:
- 开发环境使用明确端口映射
- 生产环境谨慎暴露端口
- 考虑使用反向代理管理入口
3.3 环境变量配置
.env 文件:
DB_USER=admin
DB_PASS=secret
Compose 文件引用:
services:
db:
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
env_file:
- ./db.env
优先级规则:
environment
显式定义env_file
文件定义- 容器内已有环境变量
3.4 数据持久化
services:
database:
volumes:
- db-data:/var/lib/postgresql/data
- ./logs:/app/logs
volumes:
db-data:
driver: local
挂载类型对比:
- 命名卷:docker 管理,适合生产数据
- 主机路径:开发调试方便
- 临时卷:内存存储,高性能临时数据
4. 网络配置策略
4.1 默认网络行为
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
networks:
frontend:
backend:
driver: bridge
自动生成规则:
- 默认创建
项目名_default
网络 - 相同网络内的服务可通过服务名互访
- 隔离不同项目的网络环境
4.2 自定义网络配置
networks:
app-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1
attachable: true
高级选项:
internal: true
创建隔离网络enable_ipv6: true
启用 IPv6labels
添加元数据
5. 服务依赖与健康检查
5.1 依赖控制
services:
web:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
依赖条件类型:
service_started
:服务容器启动service_healthy
:通过健康检查service_completed_successfully
:一次性任务成功
5.2 健康检查配置
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
检查方式:
- CMD:直接执行命令
- CMD-SHELL:通过 shell 执行
- 禁用:
disable: true
6. 常用命令实战
6.1 基础命令
# 启动所有服务(后台模式)
docker-compose up -d
# 查看运行状态
docker-compose ps
# 停止服务
docker-compose stop
# 停止并删除容器
docker-compose down
# 重建服务
docker-compose up -d --build
6.2 调试命令
# 查看服务日志
docker-compose logs -f web
# 执行一次性命令
docker-compose run --rm web python manage.py migrate
# 进入运行中容器
docker-compose exec db psql -U postgres
6.3 扩展操作
# 水平扩展服务实例
docker-compose up -d --scale web=3
# 查看服务资源使用
docker-compose top
# 验证配置文件
docker-compose config
7. 生产环境最佳实践
7.1 安全配置
services:
db:
read_only: true
tmpfs: /run
security_opt:
- no-new-privileges:true
user: "1000:1000"
安全建议:
- 避免使用 root 用户
- 限制内存和 CPU
- 设置只读文件系统
- 禁用特权升级
7.2 资源约束
services:
worker:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
memory: 256M
restart_policy:
condition: on-failure
max_attempts: 3
关键配置:
- CPU 限制 (cpus)
- 内存限制 (memory)
- 重启策略
- 容器更新顺序
7.3 多环境配置
base.yml:
services:
app:
image: my-app
env_file: .env
override.yml:
services:
app:
environment:
DEBUG: "true"
ports:
- "8080:80"
启动命令:
docker-compose -f base.yml -f override.yml up
8. 完整示例分析
8.1 微服务应用示例
version: "3.8"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- api
networks:
- app-net
api:
build: ./backend
environment:
DB_URL: postgres://user:pass@db:5432/app
volumes:
- ./backend:/app
networks:
- app-net
- db-net
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: pass
POSTGRES_USER: user
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 5s
networks:
app-net:
db-net:
internal: true
volumes:
db-data:
架构特点:
- 前端服务暴露 3000 端口
- API 服务连接数据库
- 数据库使用独立内部网络
- 数据持久化存储
- 健康检查确保依赖顺序
9. 总结与进阶建议
9.1 核心要点回顾
- 编排能力:Compose 简化了多容器应用的管理
- 声明式配置:YAML 文件定义完整应用栈
- 环境一致性:实现开发-测试-生产环境一致
- 资源控制:精确管理服务资源分配
- 服务发现:内置 DNS 解析简化服务通信
9.2 进阶学习建议
-
与 Swarm/K8s 集成:
docker stack deploy -c compose.yml myapp
-
使用扩展字段:
x-logging: &default-logging options: max-size: "10m" max-file: "3"
-
性能调优:
- 合理设置 ulimits
- 优化卷驱动选择
- 配置 OOM 杀手策略
-
监控方案:
services: prometheus: image: prom/prometheus ports: - "9090:9090"
通过掌握 Docker Compose,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。