Docker容器网络模式选型bridge/host/
选择 Docker 网络模式时,很多人会被 bridge、host、macvlan 搞晕。
简单说:默认的 bridge 适合绝大多数端口映射场景;
host 让容器共享宿主机网络,追求性能但不隔离;
macvlan 给容器分配局域网独立 IP,适合需要被外部直接访问的场景。
下面按原理、选型、命令和避坑逐一拆解。
先看懂三种模式各自的特点
- bridge(桥接模式):Docker 默认创建 docker0 网桥,容器通过 NAT 访问外网。使用
-p端口映射后,外部请求进宿主机的端口再转发到容器。适合大部分 Web 应用、测试环境。 - host(主机模式):容器不再拥有独立网络栈,直接使用宿主机 IP 和端口。启动参数中
-p不生效,因为端口本身已经暴露在宿主机上。性能损耗最小,适合对延迟敏感或需要监听大量端口的服务。 - macvlan(Macvlan 模式):为容器分配物理局域网内的独立 IP 和 MAC 地址,容器像一台插在交换机上的设备。适合需要从局域网直接访问容器、容器要对接现有 IP 规划的场景。
业务场景应该怎么选
- 常规 Web 服务、API 部署:选 bridge,端口通过
-p或-P暴露,安全隔离好。 - 日志采集、性能监控、DNS 服务:选 host,避免 NAT 转发损耗,且便于容器直接使用宿主机端口探测。
- 家庭服务器、软路由、NAS 应用:选 macvlan,让容器获得固定局域网 IP,手机和电脑直接访问。
- 云服务器上使用 macvlan 要先确认底层虚拟化是否支持,多数 VPC 环境不支持,容易网络不通。
上手操作:创建网络、跑容器
# 查看当前网络
docker network ls
# 创建一个 bridge 自定义网络
docker network create -d bridge my-net
# 使用 bridge 网络运行 nginx,并映射 8080 端口
docker run -d --network my-net -p 8080:80 nginx
# 使用 host 模式运行容器(-p 参数会失效)
docker run -d --network host nginx
# 创建 macvlan 网络(parent 换成实际网卡名)
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
# 使用 macvlan 运行容器并指定局域网 IP
docker run -d --network my-macvlan --ip 192.168.1.100 nginx
注意,host 模式下 -p 不生效,如果访问 80 端口,直接用宿主机 IP:80。
常见坑和排查方法
- bridge 容器互访:同一自定义 bridge 网络内的容器可以直接用容器名互访,但跨宿主机需要额外做路由或使用 overlay 网络。
- host 端口冲突:多个容器都监听相同端口时,启动会直接报错
address already in use。 - macvlan 与宿主机通信:宿主机无法直接 ping 通 macvlan 容器,因为容器 MAC 地址直接暴露在物理网卡上,宿主机网络栈不会处理该 MAC。如果必须从宿主机访问容器,可以再创建一个 macvlan 子接口,或者改用 ipvlan。
- 云服务器限制:阿里云、腾讯云等 VPC 环境通常不允许修改底层网卡为混杂模式,macvlan 容器可能拿到 IP 也 ping 不通,建议先在测试机验证。
验证网络是否真的通了
# 查看网络详情,确认容器 IP 和网关正确
docker network inspect my-macvlan
# 容器内测外网
docker exec <容器名> ping -c 4 8.8.8.8
# 容器内测域名解析
docker exec <容器名> nslookup www.baidu.com
# 查看 bridge 端口映射结果
docker port <容器名>
如果在宿主机本机验证 bridge 端口,直接访问 curl http://localhost:8080。
对于 macvlan,则从局域网另一台设备执行 ping 192.168.1.100 和 curl http://192.168.1.100。
选型时不必追求最复杂,默认 bridge 已覆盖大部分部署需求;
追求性能用 host;
需要局域网直接通信再上 macvlan。
记住每种模式的端口行为、互通规则和宿主机访问限制,在切换模式前做好验证,Docker 网络选型就不会再反复折腾。