Docker Compose从入门到实践的完全指南
作者:aiweker
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务,下面就跟随小编一起来看看它的具体使用吧
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 启用 IPv6
- labels 添加元数据
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. 完整示例分析
微服务应用示例
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,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。
到此这篇关于Docker Compose从入门到实践的完全指南的文章就介绍到这了,更多相关Docker Compose使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!