Docker网络模式详解,bridge host
Docker 默认会给容器分配网络,但 bridge、host、none 三种模式的行为完全不同。
bridge 是默认的隔离网络,host 让容器直接使用宿主机网络栈,none 则关闭网络功能。
选错模式会导致端口不通、服务无法访问或安全暴露,下面从零开始讲清区别和配置方法。
先搞清楚三种模式到底在做什么
bridge 模式是 Docker 安装后的默认网络。
Docker 会在宿主机上创建一个名为 docker0 的虚拟网桥,每个容器分配一个独立 IP,通过 NAT 转发访问外网。
容器之间可以用 IP 或自定义网络中的容器名互访。
host 模式下容器不再拥有独立网络命名空间,直接共享宿主机的 IP 和端口。
容器里监听 80 端口,宿主机就在 80 端口,不需要 -p 映射。
none 模式只给容器一个 loopback 接口,没有 IP、没有路由、不能联网。
适合只需要本地计算、不需要网络交互的任务。
一个可独立引用的判断:需要端口映射和网络隔离选 bridge,追求网络性能或需要监听宿主机全部端口选 host,完全不需要网络选 none。
动手验证三种模式的网络差异
查看当前网络列表
docker network ls
默认会看到 bridge、host、none 三个网络。bridge 是默认网络,host 和 none 由 Docker 内置管理。
启动 bridge 模式容器并检查 IP
docker run -d --name web-bridge -p 8080:80 nginx
docker exec web-bridge ip addr show eth0
你会看到容器有一个类似 172.17.0.2 的独立 IP。
访问 http://宿主机IP:8080 能打开 Nginx 页面,说明端口映射生效。
启动 host 模式容器
docker run -d --name web-host --network host nginx
此时容器直接监听宿主机 80 端口。
执行 docker exec web-host ip addr 看到的网卡和宿主机一致。
如果宿主机 80 端口已被占用,容器会启动失败,这是 host 模式最常见的冲突现象。
启动 none 模式容器
docker run -d --name isolated --network none nginx
docker exec isolated ip addr
输出只显示 lo 回环接口,没有 eth0。
容器内无法 ping 通外网,也无法被外部访问。
自定义 bridge 网络解决容器互访
默认 bridge 网络下容器只能用 IP 互访,重启后 IP 可能变化。
生产环境建议创建自定义 bridge 网络,支持用容器名做 DNS 解析。
docker network create --driver bridge my-net
docker run -d --name app1 --network my-net nginx
docker run -d --name app2 --network my-net nginx
docker exec app2 ping -c 2 app1
能 ping 通说明自定义网络内的 DNS 生效。
验证完成后,docker network rm my-net 可删除网络,但需要先停止并移除使用该网络的容器。
选型和避坑要点
- 端口冲突:host 模式下容器端口和宿主机完全重合,启动前用
ss -tlnp | grep 端口确认占用情况。 - 安全暴露:host 模式会让容器服务直接暴露在宿主机所有网卡上,防火墙规则需要按宿主机维度配置,不能只依赖 Docker 的端口映射策略。
- bridge 性能:默认 bridge 经过 NAT 转发,高并发场景下可能成为瓶颈;对网络延迟敏感的服务可以评估 host 模式或 macvlan。
- none 模式误区:none 不是“安全模式”,只是没有网络。如果容器需要后续手动配置网络,可以用
docker network connect动态接入。 - 生产环境建议:多容器互访优先使用自定义 bridge 网络,避免依赖默认 bridge 和 IP 直连。
常见问题
容器之间 ping 不通怎么办? 先确认是否在同一自定义网络内,默认 bridge 下需要用 --link 或 IP 互访。
执行 docker network inspect 网络名 查看容器是否已加入。
host 模式还需要 -p 吗? 不需要,写了也会被忽略。
host 模式直接使用宿主机端口,端口映射参数无效。
怎么查看容器用了哪个网络? 执行 docker inspect 容器名 | grep NetworkMode,
或 docker network inspect bridge 查看该网络下的容器列表。
none 模式容器能临时联网吗? 可以,用 docker network connect bridge 容器名 把运行中的容器接入 bridge 网络,无需重启。
掌握这三种模式后,遇到端口不通或容器互访失败时,先确认网络模式,再用 docker inspect 和 docker network inspect 定位,大部分问题都能快速解决。