Docker Compose网络配置完全指南

文章目录

  • Docker Compose网络配置完全指南
    • 一、基础网络架构
      • 1.1 默认网络行为
      • 1.2 网络查看命令
    • 二、自定义网络配置
      • 2.1 显式定义网络
      • 2.2 多网络接入实战
    • 三、典型场景配置
      • 3.1 微服务间通信
      • 3.2 数据库隔离
    • 四、高级网络技巧
      • 4.1 静态IP分配
      • 4.2 跨项目通信
      • 4.3 网络别名
    • 五、调试与诊断
      • 5.1 网络测试容器
      • 5.2 常用诊断命令
    • 六、最佳实践
    • 七、完整实战案例
    • 八、常见问题解决方案
      • Q1:服务间无法解析主机名
      • Q2:端口冲突
      • Q3:网络性能瓶颈

Docker Compose网络配置完全指南

一、基础网络架构

1.1 默认网络行为

每个docker-compose.yml文件会自动创建:

  • 1个专属bridge网络(默认驱动)
  • 所有service自动加入该网络
  • 服务间通过服务名称直接通信
# docker-compose.yml示例
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
  
  redis:
    image: redis:alpine

1.2 网络查看命令

# 查看项目网络
docker network ls | grep <project_name>

# 查看容器网络详情
docker-compose run web curl redis:6379

二、自定义网络配置

2.1 显式定义网络

version: '3.8'

networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
  backend:
    driver: bridge

services:
  web:
    networks:
      - frontend
      - backend

  db:
    networks:
      - backend

2.2 多网络接入实战

services:
  app:
    networks:
      - payment_network
      - notification_network

networks:
  payment_network:
    driver: bridge
  notification_network:
    driver: bridge

三、典型场景配置

3.1 微服务间通信

services:
  order-service:
    networks:
      - ecommerce
    environment:
      - CART_SERVICE_URL=http://cart-service:8000

  cart-service:
    networks:
      - ecommerce

networks:
  ecommerce:
    driver: bridge

3.2 数据库隔离

services:
  mysql:
    networks:
      - db_internal
    configs:
      - source: mysql_conf
        target: /etc/mysql.cnf

  api:
    networks:
      - app_network
      - db_internal

networks:
  db_internal:
    internal: true  # 禁止外部访问
  app_network:
    driver: bridge

四、高级网络技巧

4.1 静态IP分配

services:
  monitor:
    networks:
      monitoring_net:
        ipv4_address: 172.22.0.100

networks:
  monitoring_net:
    ipam:
      config:
        - subnet: 172.22.0.0/24

4.2 跨项目通信

# 项目A的compose文件
networks:
  shared_net:
    name: cross_project_net

# 项目B的compose文件
networks:
  shared_net:
    external: true
    name: cross_project_net

4.3 网络别名

services:
  database:
    networks:
      main_network:
        aliases:
          - primary-db
          - mysql.prod

networks:
  main_network:

五、调试与诊断

5.1 网络测试容器

services:
  tester:
    image: nicolaka/netshoot
    command: sleep infinity
    networks:
      - app_network

5.2 常用诊断命令

# 查看容器网络配置
docker-compose exec web ifconfig

# 测试服务间连通性
docker-compose run tester curl -v api:3000

# 查看DNS解析
docker-compose run tester dig web

六、最佳实践

  1. 命名规范

    • 项目名称使用小写+下划线
    • 网络名称明确表达用途(如:payment_gateway)
  2. 环境隔离

    networks:
      staging:
        driver: bridge
      production:
        driver: bridge
    
  3. 安全配置

    networks:
      sensitive_data:
        driver: bridge
        internal: true
        enable_ipv6: false
    
  4. 性能优化

    networks:
      high_perf:
        driver: bridge
        options:
          com.docker.network.bridge.name: br-highperf
          com.docker.network.driver.mtu: 9000
    

七、完整实战案例

version: '3.8'

networks:
  front:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/24
  back:
    internal: true

services:
  webapp:
    build: .
    networks:
      - front
      - back
    ports:
      - "80:8000"
    depends_on:
      - cache

  cache:
    image: redis:6
    networks:
      - back
    volumes:
      - redis_data:/data

  db:
    image: postgres:13
    networks:
      - back
    environment:
      POSTGRES_PASSWORD: example

volumes:
  redis_data:

关键配置解读:

  1. 前端服务暴露80端口
  2. 数据库和缓存使用内部网络
  3. Web应用同时连接前后端网络
  4. 明确的子网规划(10.5.0.0/24)
  5. 数据卷独立于网络配置

八、常见问题解决方案

Q1:服务间无法解析主机名

  • 检查是否使用相同网络
  • 确认服务名称拼写正确
  • 尝试使用完整域名:.

Q2:端口冲突

ports:
  - "127.0.0.1:8080:80"  # 限制本地访问
  - "8000-8010:8000-8010" # 端口范围映射

Q3:网络性能瓶颈

  • 尝试host网络模式(需要删除端口映射)
  • 调整MTU值
  • 使用macvlan驱动
networks:
  perf_net:
    driver: macvlan
    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1

期待您能关注公众号原宏Cloud运维栈每天带你进步一点。

你可能感兴趣的:(docker,网络,容器)