docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker Compose网络配置指南

Docker Compose网络配置指南分享

作者:东方、宏

本文详细介绍了Docker网络配置的各个方面,包括基础网络架构、自定义网络配置、典型场景配置、高级网络技巧、调试与诊断以及最佳实践,通过多个实战案例和常见问题解决方案,帮助读者更好地理解和应用Docker网络技术

一、基础网络架构

1.1 默认网络行为

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

# 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:网络性能瓶颈

networks:
  perf_net:
    driver: macvlan
    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文