在 Docker 中,bridge、host 和 none(你看到的 null 实际对应 none)是三种内置网络驱动(network drivers),它们决定了容器如何与外部网络、其他容器以及宿主机通信。
下面详细解释它们的区别和适用场景:
1. bridge(默认网络)
- 作用:为容器创建一个私有内部网络,容器之间可通过 IP 或容器名(在用户自定义 bridge 网络中)通信,但与宿主机网络隔离。
- 特点:
- 容器获得独立的 IP(如
172.17.0.x)。 - 容器访问外网需通过 NAT(网络地址转换)。
- 外部访问容器需显式映射端口(
-p 8080:80)。 - 用户自定义 bridge 网络(如你的
bookstack-net,monitoring)支持自动 DNS 解析(可用容器名通信),而默认bridge网络不行。
- 容器获得独立的 IP(如
- 适用场景:
- 大多数应用(如 Web 服务、数据库)。
- 需要容器间隔离但又能通信的场景。
- 示例:
docker run -d --network bookstack-net --name app nginx
2. host
- 作用:容器直接使用宿主机的网络命名空间,无网络隔离。
- 特点:
- 容器没有自己的 IP,直接绑定到宿主机的 IP 和端口。
- 性能最好(无 NAT 开销)。
- 端口冲突风险高:如果宿主机已占用 80 端口,容器无法再用。
- 不支持端口映射(
-p无效)。
- 适用场景:
- 对网络性能要求极高的服务(如高性能代理、监控 agent)。
- 需要监听大量端口的服务(避免端口映射繁琐)。
- 示例:
docker run -d --network host nginx # 直接占用宿主机 80 端口
3. none(你看到的 null 是其内部名称)
- 作用:容器完全无网络(只有 loopback 接口
lo)。 - 特点:
- 容器无法访问外网,也无法被外部访问。
- 适用于纯离线计算任务(如数据处理、批处理作业)。
- 适用场景:
- 安全敏感型任务(禁止任何网络通信)。
- 只需文件系统交互的任务(通过 volume 共享数据)。
- 示例:
docker run -it --network none alpine ip addr # 只能看到 lo 接口
🆚 对比总结
| 特性 | bridge | host | none |
|---|---|---|---|
| 网络隔离 | ✅ 完全隔离 | ❌ 无隔离(共享宿主机网络) | ✅ 完全隔离 |
| 容器 IP | 有(私有 IP) | 无(直接用宿主机 IP) | 无(仅 127.0.0.1) |
| 访问外网 | ✅(通过 NAT) | ✅(直接访问) | ❌ |
| 外部访问容器 | 需 -p 映射端口 | 直接访问宿主机端口 | ❌ |
| 容器间通信 | ✅(同网络内) | ✅(通过宿主机 localhost) | ❌ |
| 性能开销 | 中(NAT 转换) | 无 | 无 |
| 典型用途 | Web 应用、微服务 | 高性能服务、监控 | 离线计算、安全任务 |
🔍 关于你的输出说明
bridge:Docker 默认的 bridge 网络(不推荐直接使用,建议用自定义 bridge)。host:宿主机网络模式。none:在docker network ls中显示为null(这是 Docker 内部标识,实际使用时仍叫none)。
💡 最佳实践建议
-
优先使用自定义
bridge网络(如你的bookstack-net):docker network create my-net docker run --network my-net ...- 支持容器名 DNS 解析(如
ping mysql-container)。 - 避免端口冲突(不同网络可复用相同端口)。
- 支持容器名 DNS 解析(如
-
慎用
host模式:- 仅在明确需要高性能且能管理端口冲突时使用。
-
none用于特殊场景:- 如运行加密计算任务,确保无网络泄露风险。
如果有具体应用场景(比如部署 BookStack 或 OpenStack),可以进一步讨论网络配置方案! 😊