Docker Compose 网络:自定义网络与容器通信

在 Docker Compose 中,自定义网络是实现容器间高效通信的核心机制。默认情况下,Compose 会自动创建一个名为 default 的网络,但自定义网络能提供更精细的控制(如隔离性、IP 地址管理)。以下是关键概念与操作步骤:


1. 自定义网络的优势
  • 隔离性:不同项目的容器互不干扰
  • DNS 自动解析:容器可通过服务名直接通信(无需 IP)
  • 网络配置灵活性:支持定义子网、网关、驱动类型(如 bridge, overlay

2. 配置自定义网络

docker-compose.yml 中定义网络:

version: '3.8'

# 定义自定义网络
networks:
  my-custom-network:
    driver: bridge        # 网络驱动类型
    ipam:
      config:
        - subnet: 172.28.0.0/16  # 指定子网

# 服务配置
services:
  webapp:
    image: nginx:alpine
    networks:
      - my-custom-network  # 加入自定义网络

  database:
    image: postgres:14
    networks:
      - my-custom-network


3. 容器间通信规则
  • 通过服务名访问
    webapp 容器可直接用 database 主机名访问数据库(例如 ping database)。

  • 跨网络通信
    若需访问其他自定义网络,需显式声明:

    services:
      webapp:
        networks:
          - my-custom-network
          - another-network  # 加入其他网络
    

  • 端口映射限制
    容器间通信无需暴露端口到主机(如 ports 配置),仅需确保在同一网络。


4. 验证通信

进入容器测试连通性:

# 进入 webapp 容器
docker-compose exec webapp sh

# 测试连接数据库
ping database  # 应返回数据库容器的 IP
curl http://database:5432  # 测试服务端口


5. 常见问题解决
  • DNS 解析失败
    检查容器是否加入同一网络,并确保服务名拼写正确。
  • 网络驱动不兼容
    overlay 驱动需 Swarm 集群支持,单机环境使用 bridge
  • IP 冲突
    通过 ipam.config.subnet 显式指定子网避免冲突。

最佳实践:始终为生产环境配置自定义网络,避免使用默认的 default 网络,以提升安全性和可维护性。

更多推荐