Docker 网络:bridge、host、macvlan 该怎么选

Docker · 3 分钟阅读· 234 次阅读

容器网络问题占了 Docker 使用问题的一半:容器里解析不到服务名、端口映射了但访问不了、host 模式端口冲突。

这些现象背后只有两件事:容器在哪个网络里,以及流量怎么进出这个网络。

先说结论

默认用自定义 bridge,需要独立 IP 用 macvlan,性能敏感且能接受端口冲突用 host。

  • 自定义 bridge 提供容器名 DNS 解析
  • host 模式与宿主机共享网络栈,无端口映射
  • macvlan 让容器拿到局域网 IP,适合需要被局域网直连的场景
  • 端口映射是 DNAT,绕过不了宿主机防火墙

先把问题说清楚

Docker 默认给每个 compose 项目建一个 bridge 网络,同网络内容器可以用服务名互相解析。跨项目通信需要显式接入同一网络。

host 模式没有独立网络栈,容器直接使用宿主机端口,性能最好但容易冲突;macvlan 则让容器看起来像局域网里的一台独立设备。

具体怎么做

按顺序执行,每步都验证完再进下一步:

  • 先 docker network ls 确认容器在哪个网络
  • 同项目通信用服务名,跨项目用 external network
  • 需要局域网直连的设备(NAS、监控)考虑 macvlan
  • 排查连通性:docker exec 进容器 curl 目标,再在宿主机 tcpdump
  • 注意 iptables/nftables 与 firewalld 对 DNAT 的影响

参数与成本对照

把关键数值摊开,方便判断该选哪条路:

模式 容器 IP 端口映射 适用
bridge(默认) 172.17.x.x 需要 -p 单机普通服务
自定义 bridge 自定义网段 需要 -p compose 多服务互联
host 与宿主同栈 不需要 性能敏感、端口不冲突
macvlan 局域网 IP 不需要 需要被局域网直接访问

Docker 网络

几个容易踩的坑

下面这些是最常见的错误做法:

  • 用默认 bridge:不支持容器名解析,只能靠 link(已废弃)
  • host 模式下还写 -p:端口映射无效
  • macvlan 配错网段:容器通但宿主机不通
  • 忽略防火墙:映射了端口但被 firewalld 拦掉

最后补两句

网络问题的排查顺序固定:确认网络 → 确认 DNS → 确认路由 → 抓包。跳步就会来回改配置。

工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。

评论 (3)

阿
阿哲

照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。

南
南风

比「一键脚本」有用多了,知道为什么比知道怎么做重要。

K
Kevin

补充一句:不同版本行为会变,动手前先确认自己的版本号。

发表评论

验证码

提交后需站长审核,通过后才会显示。