Docker 网络的核心是 Linux 网络命名空间。每个容器默认拥有独立的网络命名空间,里面包含自己的网卡、IP 地址、路由表和防火墙规则。bridge 网络通过虚拟网桥和 NAT 让容器共享宿主机的物理网络,但会引入一定的性能损耗和端口映射复杂度。host 网络和 none 网络跳过了 bridge 的抽象层,分别走向完全共享和完全隔离两个方向。理解这两种模式的工作机制,才能在部署时避免端口冲突、安全漏洞和网络故障。

host 网络模式:直接使用宿主机网络栈
使用 --network host 参数启动容器时,Docker 不会为容器创建新的网络命名空间,而是让容器进程直接运行在宿主机的网络命名空间中。容器内执行 ip addr 会看到宿主机的所有物理网卡、虚拟网卡以及 docker0 等接口,容器获得的 IP 地址就是宿主机 IP。此时容器内的 localhost 与宿主机 localhost 完全一致,容器监听 8080 端口等同于宿主机监听 8080 端口,不需要再使用 -p 参数进行端口映射。
host 模式的最大优势是网络性能。因为没有 NAT 转换、端口映射代理和 bridge 转发,数据包从容器到达物理网卡的路径更短,吞吐量和延迟都更接近宿主机原生性能。对于高并发代理、实时音视频传输这类场景,性能提升明显。但代价是端口冲突,如果宿主机已经运行了占用 80 端口的进程,再启动一个监听 80 端口的 host 模式容器就会失败。而且容器内的网络配置变更会直接影响宿主机,误操作可能导致宿主机断网。
适合 host 模式的典型场景包括:反向代理或负载均衡器,例如 nginx、haproxy 需要直接绑定宿主机 IP 和端口;网络监控与抓包工具,例如 tcpdump 需要访问宿主机的原始网络设备;运行高性能数据库或消息队列,希望避免 bridge 网络带来的额外开销;以及需要动态监听大量端口的 P2P 或音视频应用。在这些场景中,host 模式可以简化端口管理并降低延迟。
# 以 host 模式启动 nginx
docker run -d --name proxy --network host nginx
# 查看容器看到的宿主机网卡
docker run --rm --network host alpine ip addr show eth0
# 确认容器的网络模式
docker inspect proxy --format '{{.HostConfig.NetworkMode}}'none 网络模式:完全隔离的网络环境
--network none 会让 Docker 为容器创建一个网络命名空间,但不在其中放置任何网络接口,只保留 loopback 接口 lo。容器启动后没有 eth0、没有 IP 地址、没有路由规则,无法访问外部网络,其他容器和宿主机也无法通过网络访问该容器。这种状态相当于把一个进程关进了一间没有网线的房间,它仍然可以运行计算任务,但所有网络调用都会失败。
none 模式提供了最小的网络攻击面。没有 IP 地址意味着外部无法扫描或连接容器,容器也无法主动外联,这非常适合运行不可信代码、安全扫描工具或离线数据处理任务。如果业务逻辑不需要网络,使用 none 模式可以减少容器被横向渗透后作为跳板的风险。但需要注意,很多程序启动时会尝试解析 DNS 或连接外部服务,如果没有网络可能直接崩溃,因此并非所有应用都适合 none 模式。
none 模式常用于 CI/CD 流水线中的构建容器,可以在编译阶段保持离线,只在需要推送镜像时通过 docker network connect 命令临时接入网络。比如一个用于代码格式检查的容器不需要网络,就可以用 none 模式启动;如果需要下载依赖,则用下面的命令将其连接到 bridge 网络。此外,安全沙箱、离线批处理、日志解析等任务也适合 none 模式。
# 以 none 模式启动容器并查看网络接口
docker run --rm --network none busybox ip addr
# 启动一个离线任务容器
docker run -d --name offline-job --network none my-job:latest
# 临时将离线容器接入 bridge 网络
docker network connect bridge offline-job
# 查看容器当前网络模式
docker inspect offline-job --format '{{.HostConfig.NetworkMode}}'host 与 none 的选择对比与组合实践
下面从几个关键维度对 host 网络和 none 网络进行对比,以便快速判断应用适合哪种模式。
| 对比维度 | host 网络 | none 网络 |
|---|---|---|
| 网络命名空间 | 与宿主机共享 | 独立但无网卡 |
| IP 地址 | 使用宿主机 IP | 仅 loopback |
| 端口映射 | 无需映射,直接绑定宿主机端口 | 无端口概念 |
| 性能 | 接近原生,延迟低 | 无网络开销 |
| 安全隔离 | 弱,容器可影响宿主机网络 | 强,网络完全隔离 |
| 典型场景 | 代理、监控、高性能服务 | 离线任务、安全沙箱 |
判断一个应用是否适合 host 模式,重点看它是否需要高性能网络、是否监听固定少量端口、是否可以接受与宿主机共享网络配置。如果答案是肯定的,host 模式往往比 bridge 更简单高效。判断是否适合 none 模式,则看应用是否完全不依赖网络,或者是否需要在启动后自定义网络编排。如果应用需要网络但你又想先隔离,可以先使用 none 启动,再通过 docker network connect 动态加入指定网络。
在 docker-compose 中可以给不同服务设置不同的 network_mode。例如监控服务使用 host 模式采集宿主机指标,离线分析服务使用 none 模式避免意外外联。需要注意的是,host 模式在 Linux 上表现稳定,但在 Docker Desktop for Mac 和 Windows 上,由于虚拟化层的限制,host 模式的行为可能与预期不同,通常容器只能访问到虚拟机内部的主机网络,而不是物理宿主机的所有接口。none 模式则不受平台影响,行为完全一致。
services:
monitor:
image: netdata/netdata
network_mode: host
analyzer:
image: my-analyzer:latest
network_mode: none实际使用中,host 网络常用于需要直接暴露大量端口或追求极致网络性能的组件,例如 CNI 插件、服务网格数据面、网络监控探针等。none 网络则适合一切不依赖网络的批处理任务,以及需要严格控制网络访问的安全环境。不要把 host 模式当成默认选择,因为它会牺牲容器间的网络隔离;也不要滥用 none 模式,因为很多应用在无网络状态下无法正常启动。根据业务特性选择合适的网络模式,才能让容器在性能、安全和可维护性之间取得平衡。
Docker容器网络host网络none网络修改时间:2026-08-19 18:49:50