Docker 网络:bridge、host、macvlan 该怎么选
容器网络问题占了 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 | 不需要 | 需要被局域网直接访问 |

几个容易踩的坑
下面这些是最常见的错误做法:
- 用默认 bridge:不支持容器名解析,只能靠 link(已废弃)
- host 模式下还写 -p:端口映射无效
- macvlan 配错网段:容器通但宿主机不通
- 忽略防火墙:映射了端口但被 firewalld 拦掉
最后补两句
网络问题的排查顺序固定:确认网络 → 确认 DNS → 确认路由 → 抓包。跳步就会来回改配置。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论