容器出网失败是什么
容器访问不了外网,通常不是玄学:按『容器到宿主再到网关』逐层验证即可收敛到根因。常见原因有四类:宿主内核转发未开启、地址转换规则缺失、宿主防火墙拦截了转发链、云侧安全组限制了出方向。用同一宿主上的另一个容器做对照实验,能很快判断问题是全局的还是仅限某个容器,这一步能把排查范围直接砍掉一半。
基本信息
| 第一步 | 在容器内访问网关与外网地址,区分完全不通与只有解析不正常 |
|---|---|
| 宿主转发 | 需要开启内核转发,容器出网依赖宿主的转发能力 |
| 地址转换 | 转发链上应存在地址伪装规则,缺失时出网请求直接被丢弃 |
| 宿主防火墙 | 默认策略可能拦截转发链,导致容器流量被拦 |
| 云侧安全组 | 出方向被限制时,表现与本地规则缺失完全一致 |
典型使用场景
- 容器拉取镜像或安装依赖失败,怀疑是网络出口问题
- 容器内调用第三方接口超时,而宿主上同样的请求正常
- 调整宿主防火墙或内核参数之后,容器集体出现出网异常
- 集群中只有部分节点上的容器无法出网,需要判断差异点
- 排查时用同一宿主上的其他容器做对照,快速界定影响范围
逐层验证
逐层验证
docker exec myapp ip route # 先看容器默认路由是否指向宿主网桥
docker exec myapp curl -sS -m 5 https://www.example.com -o /dev/null -w '%{http_code}\n'
sysctl net.ipv4.ip_forward # 期望值为 1
iptables -t nat -S POSTROUTING | grep -i masq # 检查是否存在地址转换规则
# 区分场景:能解析但连不上属链路问题;连解析都失败,先修 DNS分层排查表
| 层级 | 检查项 | 典型症状 |
|---|---|---|
| 容器内 | 路由与 DNS 配置 | 无法解析域名,或根本没有默认路由 |
| 容器内 | 到网关的连通性 | 连网关都不通,问题在容器网络配置 |
| 宿主 | 内核转发是否开启 | 转发关闭时同宿主所有容器一起失败 |
| 宿主 | 地址转换与转发链规则 | 规则缺失导致出网请求被直接丢弃 |
| 云侧 | 安全组出方向策略 | 本地全部正常但依然不通 |
用临时工具容器做对照实验很高效:同一宿主上其他容器能出网而某个容器不能,问题通常在该容器的网络配置,而不是宿主环境本身。
关闭内核转发或手工删除转发规则,会让该宿主上所有容器、乃至运行在同机的集群组件一起失去网络能力:动手前先确认影响范围,并准备好回退步骤。