Docker Compose 如何实现容器间通信网络模式 network_mode 配置

文章导读
大多数场景下不需要手动配置 network_mode,Docker Compose 默认会为项目创建独立网络并自动连接服务,仅在需要共享主机网络或复用特定容器网络栈时才修改此项。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

大多数场景下不需要手动配置 network_mode,Docker Compose 默认会为项目创建独立网络并自动连接服务,仅在需要共享主机网络或复用特定容器网络栈时才修改此项。

先说结论:默认网络通常够用,修改 network_mode 是为了解决特定隔离或共享需求,而非提升性能。

  • 适合:需要容器共享主机网络栈或与外部容器互通的场景
  • 先准备:确认默认桥接网络是否无法满足通信需求
  • 验收:通过 exec 进入容器测试 DNS 解析和端口连通性

命令速用版

在 docker-compose.yml 中指定 network_mode,常见写法如下:

version: '3.8'
services:
  web:
    image: nginx
    network_mode: "host"
  db:
    image: mysql
    # 默认不写,使用 compose 创建的默认网络

为什么会这样

Docker Compose 启动时会自动创建一个项目级别的桥接网络,服务名自动解析为容器 IP。手动配置 network_mode 会覆盖这一行为,例如设为 host 则容器直接使用宿主机网络,失去网络隔离;设为 service:xxx 则与指定服务共享网络命名空间。

分步处理

1. 优先测试默认配置:不写 network_mode,直接启动,看服务间能否通过服务名互通。

2. 确需修改时编辑 YAML:根据需求选择 host、service 或 container 模式。

3. 重启服务:执行 docker compose up -d 使配置生效。

Docker Compose 如何实现容器间通信网络模式 network_mode 配置

怎么验证是否生效

进入容器内部检查网络状态:

docker exec -it <容器名> bash
ip addr show
ping <另一服务名>

若配置了 host 模式,容器内看到的网络接口应与宿主机一致。

常见坑

1. Docker Desktop 限制:在 Mac 或 Windows 上使用 host 模式可能无效,因为 Docker 运行在虚拟机中。

2. 端口冲突:host 模式下容器端口直接占用宿主机端口,易引发冲突。

3. DNS 变化:使用非默认网络时,服务名自动解析功能可能失效,需手动配置 links 或外部 DNS。