docker network 创建 host 和 none 网络模式与创建普通的 bridge 网络略有不同,因为它们的机制比较特殊。
以下是具体的命令和注意事项:
1. 创建 Host 模式网络
核心概念 :
host 模式并不是创建一个虚拟的"网桥",而是让容器直接使用宿主机的网络栈。容器没有独立的 IP,它共享宿主机的 IP 和端口。
命令:
bash
docker network create -d host my-host-net
-d host:指定驱动为 host。my-host-net:网络名称(你可以随便起,但通常没必要,因为 host 模式行为是固定的)。
⚠️ 重要限制:
- 端口映射无效 :在
host模式下,-p 8080:80这种参数完全失效。如果容器监听 80 端口,宿主机必须确保 80 端口未被占用。 - 隔离性差: 容器看到的网络接口就是宿主机的接口。
- 通常不需要显式创建 :Docker 默认内置了一个名为
host的网络。你通常可以直接在运行容器时使用--network host a,而不需要手动create。手动创建的主要目的是为了在某些编排工具中统一引用名称。
使用示例:
bash
# 直接运行一个使用 host网络的容器
docker run -d --network host nginx
# 此时访问宿主机的 IP + 80端口即可看到 Nginx
2. 创建 None 模式网络
核心概念 :
none 模式表示容器没有任何网络连接 。它只有一个本地回环接口 (lo),无法访问外部网络,其他容器也无法访问它。适用于高安全需求或批处理任务。
命令:
bash
docker network create -d none my-none-net
-d none:指定驱动为 none。
⚠️ 重要限制:
- 完全隔离 :容器内无法
ping通百度,也无法apt-get install。 - 通常不需要显式创建 :Docker 默认内置了一个名为
none的网络。
使用示例:
bash
# 运行一个完全断网的容器
docker run -d --network none alpine sleep 3600
3. 为什么通常不建议手动 create host/none?
Docker 在安装时会自动创建三个默认网络:
bridge(默认)hostnone
你可以随时通过 docker network ls 看到它们。
手动创建 host 或 none 网络的唯一场景是:
你在使用 Docker Compose 或 Kubernetes 等编排工具,并且希望给这个特殊的网络起一个自定义的名字 以便在配置文件中引用,或者为了保持配置的一致性(所有网络都通过 create 生成)。
对于绝大多数日常使用:
- 如果想用 Host 模式:直接
docker run --network host ... - 如果想用 None 模式:直接
docker run --network none ... - 如果想用自定义 Bridge 模式(最常用):才需要
docker network create -d bridge ...
4. 总结对比表
| 特性 | Bridge (默认/自定义) | Host | None |
|---|---|---|---|
| 创建命令 | docker network create -d bridge mynet |
docker network create -d host mynet |
docker network create -d none mynet |
| IP 地址 | 有独立内部 IP (如 172.18.0.2) | 无,共用宿主机 IP | 无,仅 lo (127.0.0.1) |
| 端口映射 (-p) | ✅ 支持 | ❌ 不支持 (直接占用宿主机端口) | ❌ 无意义 |
| 网络隔离 | 中等 (与其他容器隔离) | 无 (与宿主机完全共享) | 最高 (完全断网) |
| 典型用途 | 微服务通信、Web应用 | 高性能网络需求、监控代理 | 离线计算、高安全沙箱 |