Docker 网络模式
Docker 的网络模式有以下几种,每种模式对应不同的通信能力、隔离性和使用场景。这是你构建服务之间通信(比如 Tomcat ↔ Kafka ↔ Redis)时必须理解的基础。
一览表:Docker 网络模式对比
模式 | 是否隔离 | 是否可用容器名通信 | 是否共享宿主机端口 | 使用场景举例 |
---|---|---|---|---|
bridge (默认) | ✅ 是 | ✅ 支持 | ❌ 否 | 单机部署,容器通信 |
host | ❌ 否 | ❌ 不支持 | ✅ 是 | 高性能服务,绑定宿主机网络 |
container:<name> | ❌ 否 | ✅ 共享网络命名空间 | ✅ 同容器 | 多个容器共享网络栈 |
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:<container_name_or_id>
模式
- 新容器和指定容器共用网络命名空间。
- 可用于运行副容器(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 自定义网络 |