Docker Compose 完全指南:从入门到生产实践
1. Docker Compose 简介与核心价值
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务。
核心优势:
- 简化多容器管理:通过单一文件管理多个关联容器
- 开发环境标准化:团队共享相同的环境配置
- 快速环境搭建:一条命令启动复杂应用栈
- 服务依赖管理:自动处理服务间的依赖关系
- 配置即代码:版本控制环境配置
典型应用场景:
- 开发环境搭建
- 自动化测试环境
- 单主机部署
- 微服务应用演示
2. Compose 文件结构与版本
2.1 基本文件结构
version: "3.8" # 指定Compose文件格式版本services: # 容器服务定义webapp:image: nginx:alpineports:- "80:80"database:image: postgres:13environment:POSTGRES_PASSWORD: examplevolumes: # 持久化卷定义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: ./dirdockerfile: Dockerfile.devargs:NODE_ENV: developmentimage: 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/logsvolumes:db-data:driver: local
挂载类型对比:
- 命名卷:docker 管理,适合生产数据
- 主机路径:开发调试方便
- 临时卷:内存存储,高性能临时数据
4. 网络配置策略
4.1 默认网络行为
services:web:networks:- frontendapi:networks:- frontend- backendnetworks:frontend:backend:driver: bridge
自动生成规则:
- 默认创建
项目名_default
网络 - 相同网络内的服务可通过服务名互访
- 隔离不同项目的网络环境
4.2 自定义网络配置
networks:app-net:driver: bridgeipam:config:- subnet: 172.20.0.0/24gateway: 172.20.0.1attachable: true
高级选项:
internal: true
创建隔离网络enable_ipv6: true
启用 IPv6labels
添加元数据
5. 服务依赖与健康检查
5.1 依赖控制
services:web:depends_on:db:condition: service_healthyredis:condition: service_starteddb:healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 3sretries: 5
依赖条件类型:
service_started
:服务容器启动service_healthy
:通过健康检查service_completed_successfully
:一次性任务成功
5.2 健康检查配置
healthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 10sretries: 3start_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: truetmpfs: /runsecurity_opt:- no-new-privileges:trueuser: "1000:1000"
安全建议:
- 避免使用 root 用户
- 限制内存和 CPU
- 设置只读文件系统
- 禁用特权升级
7.2 资源约束
services:worker:deploy:resources:limits:cpus: '0.5'memory: 512Mreservations:memory: 256Mrestart_policy:condition: on-failuremax_attempts: 3
关键配置:
- CPU 限制 (cpus)
- 内存限制 (memory)
- 重启策略
- 容器更新顺序
7.3 多环境配置
base.yml:
services:app:image: my-appenv_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: ./frontendports:- "3000:3000"depends_on:- apinetworks:- app-netapi:build: ./backendenvironment:DB_URL: postgres://user:pass@db:5432/appvolumes:- ./backend:/appnetworks:- app-net- db-netdb:image: postgres:13environment:POSTGRES_PASSWORD: passPOSTGRES_USER: userPOSTGRES_DB: appvolumes:- db-data:/var/lib/postgresql/datanetworks:- db-nethealthcheck:test: ["CMD-SHELL", "pg_isready -U user -d app"]interval: 5snetworks:app-net:db-net:internal: truevolumes:db-data:
架构特点:
- 前端服务暴露 3000 端口
- API 服务连接数据库
- 数据库使用独立内部网络
- 数据持久化存储
- 健康检查确保依赖顺序
9. 总结与进阶建议
9.1 核心要点回顾
- 编排能力:Compose 简化了多容器应用的管理
- 声明式配置:YAML 文件定义完整应用栈
- 环境一致性:实现开发-测试-生产环境一致
- 资源控制:精确管理服务资源分配
- 服务发现:内置 DNS 解析简化服务通信
9.2 进阶学习建议
-
与 Swarm/K8s 集成:
docker stack deploy -c compose.yml myapp
-
使用扩展字段:
x-logging: &default-loggingoptions:max-size: "10m"max-file: "3"
-
性能调优:
- 合理设置 ulimits
- 优化卷驱动选择
- 配置 OOM 杀手策略
-
监控方案:
services:prometheus:image: prom/prometheusports:- "9090:9090"
通过掌握 Docker Compose,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。