Docker 网络模式

Docker 的网络模式有以下几种,每种模式对应不同的通信能力、隔离性和使用场景。这是你构建服务之间通信(比如 Tomcat ↔ Kafka ↔ Redis)时必须理解的基础。


一览表:Docker 网络模式对比

模式 是否隔离 是否可用容器名通信 是否共享宿主机端口 使用场景举例
bridge(默认) ✅ 是 ✅ 支持 ❌ 否 单机部署,容器通信
host ❌ 否 ❌ 不支持 ✅ 是 高性能服务,绑定宿主机网络
container: ❌ 否 ✅ 共享网络命名空间 ✅ 同容器 多个容器共享网络栈
none ✅ 是 ❌ 无网络 ❌ 无法通信 手动配置网络
自定义 bridge 网络 ✅ 是 ✅ 支持 ❌ 否 推荐:容器互通,跨 compose

1. bridge 模式(默认)

  • 每个容器都在独立的网络命名空间。
  • 容器默认不能用容器名访问其他容器,除非显式创建自定义网络。
  • 通过端口映射暴露服务:
docker run -d -p 8080:80 nginx

典型适用:

  • 小型服务;
  • 默认方式;
  • 宿主机访问容器通过端口映射。

2. 自定义 bridge 网络(推荐)

docker network create app_net
docker run --network app_net --name kafka ...
docker run --network app_net --name tomcat ...
  • 所有容器在同一网络 app_net 内;
  • 支持 DNS 解析,可以用容器名访问其他容器。

适用场景:

  • 微服务通信(Kafka、Redis、MySQL、Tomcat、Nginx…);
  • 多个 docker-compose 项目共享网络。

3. host 模式(共享宿主网络)

network_mode: host
  • 容器和宿主机使用同一网络命名空间;
  • 端口不需要映射,容器服务直接暴露在宿主机上;
  • 不支持容器名访问。

适用场景:

  • Kafka 在某些场景下需要 host 网络解决外网消费者访问问题;
  • 高性能场景(UDP 广播监听、Prometheus node_exporter);
  • 简化配置时使用,但损失了隔离性。

限制:

  • 容器名互 ping 不通;
  • 多容器端口容易冲突;
  • docker-compose 中不能使用 networks:host 同时出现。

4. container: 模式

  • 新容器和指定容器共用网络命名空间。
  • 可用于运行副容器(sidecar 模式)。
docker run --network container:nginx alpine

适用场景:

  • 多个容器共享 IP、端口空间;
  • 调试场景、sidecar、与主容器同生死。

5. none 模式(无网络)

docker run --network none ubuntu
  • 容器没有网络;
  • 只能通过挂载 sock 或手动设定网络设备通信。

适用场景:

  • 网络隔离测试;
  • 需要自定义网络配置的极端场景。

实战建议

目标 推荐网络设置
Tomcat ↔ Kafka ↔ Redis 自定义 bridge 网络,如 app_net
Docker 容器 ↔ 宿主机 -p 映射端口或使用 host 网络
docker-compose 文件通信 使用同一个 external 自定义网络

你可能感兴趣的:(Docker 网络模式)