Docker Compose 多容器部署:网络与卷配置

在 Docker Compose 中实现多容器协同工作时,网络和卷的配置是关键环节。以下是结构化配置指南:

一、网络配置

容器间通信依赖网络,Compose 提供两种模式:

  1. 默认网络
    不显式声明时,Compose 自动创建名为 {project}_default 的网络,所有容器加入其中,可通过服务名互访:

    services:
      web:
        image: nginx:alpine
      db:
        image: postgres:14
    # web容器可通过`db`主机名访问PostgreSQL
    

  2. 自定义网络
    需显式声明网络并指定子网,适用于复杂拓扑:

    networks:
      app_net:
        driver: bridge
        ipam:
          config:
            - subnet: 172.20.0.0/24
    
    services:
      api:
        networks:
          app_net:
            ipv4_address: 172.20.0.2
      cache:
        networks:
          app_net:
            ipv4_address: 172.20.0.3
    

二、卷配置

数据持久化与共享通过卷实现,主要分三类:

  1. 命名卷(Named Volumes)
    Docker 管理存储位置,适合数据库等有状态服务:

    volumes:
      db_data: {}  # 声明卷
    
    services:
      database:
        image: mysql:8.0
        volumes:
          - db_data:/var/lib/mysql  # 挂载卷
    

  2. 绑定挂载(Bind Mounts)
    直接映射宿主机目录,适合开发环境代码热更新:

    services:
      frontend:
        image: node:18
        volumes:
          - ./src:/app/src  # 宿主机目录:容器目录
    

  3. 多容器共享卷
    同一卷可挂载到多个容器实现数据共享:

    volumes:
      shared_data: {}
    
    services:
      processor:
        volumes:
          - shared_data:/input
      exporter:
        volumes:
          - shared_data:/output
    


完整配置示例

version: '3.8'

# 网络定义
networks:
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.5.0/24

# 卷定义
volumes:
  pg_data: 
  app_logs:

services:
  # 数据库服务
  postgres:
    image: postgres:14
    networks:
      backend:
        ipv4_address: 192.168.5.2
    volumes:
      - pg_data:/var/lib/postgresql/data  # 命名卷持久化

  # 应用服务
  webapp:
    image: my-webapp:latest
    networks:
      - backend
    volumes:
      - ./app:/code                  # 绑定挂载代码
      - app_logs:/var/log            # 共享日志卷
    depends_on:
      - postgres

  # 日志收集器
  logstash:
    image: logstash:7
    volumes:
      - app_logs:/input              # 共享日志卷
    networks:
      - backend

关键配置说明
  1. 网络隔离性

    • 自定义子网(如 192.168.5.0/24)避免 IP 冲突
    • 服务间通过 服务名静态IP 通信
  2. 卷生命周期

    docker compose down -v  # 删除容器时同时移除卷
    

    命名卷需手动删除,绑定挂载随宿主机目录保留

  3. 跨主机扩展
    生产环境中可将 driver 改为 overlay 支持 Swarm 集群

注:实际部署时需根据资源需求配置 deploy.resources 限制 CPU/内存,避免容器资源竞争。

更多推荐