Docker Compose 完全指南:从入门到生产实践

#王者杯·14天创作挑战营·第1期#

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

优先级规则

  1. environment 显式定义
  2. env_file 文件定义
  3. 容器内已有环境变量

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. 完整示例分析

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:

架构特点

  1. 前端服务暴露 3000 端口
  2. API 服务连接数据库
  3. 数据库使用独立内部网络
  4. 数据持久化存储
  5. 健康检查确保依赖顺序

9. 总结与进阶建议

9.1 核心要点回顾

  1. 编排能力:Compose 简化了多容器应用的管理
  2. 声明式配置:YAML 文件定义完整应用栈
  3. 环境一致性:实现开发-测试-生产环境一致
  4. 资源控制:精确管理服务资源分配
  5. 服务发现:内置 DNS 解析简化服务通信

9.2 进阶学习建议

  1. 与 Swarm/K8s 集成

    docker stack deploy -c compose.yml myapp
    
  2. 使用扩展字段

    x-logging: &default-logging
      options:
        max-size: "10m"
        max-file: "3"
    
  3. 性能调优

    • 合理设置 ulimits
    • 优化卷驱动选择
    • 配置 OOM 杀手策略
  4. 监控方案

    services:
      prometheus:
        image: prom/prometheus
        ports:
          - "9090:9090"
    

通过掌握 Docker Compose,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值