两类外部连接编程失败
driver failed programming external connectivity 有两种常见尾巴:一是地址已被占用,属于端口冲突;二是规则表里找不到对应的链,属于防火墙规则丢失需要重建。两者的处理方向完全不同。
基本信息
| 尾巴一 | 地址已被占用,需要查占用方 |
|---|---|
| 尾巴二 | 规则表找不到链,重启守护进程重建 |
| 注意 | 受影响的是端口发布链路,不一定是应用本身 |
| 排查入口 | 容器状态里的错误信息与规则表 |
| 恢复方式 | 按原因分别处理,不要盲目重启 |
典型使用场景
- 启动容器时报外部连接编程失败时快速分流
- 端口冲突导致容器起不来
- 防火墙规则丢失导致端口映射失败
- 重启守护进程后个别容器没起来时的处理
- 回归验证既有服务的端口可达性
分流排查
分流排查
docker start web # 复现报错
docker inspect -f '{{.State.Error}}' web # 查看容器记录的错误
sudo iptables -t nat -S | grep -i docker | head -5 # 规则是否还在
sudo systemctl restart docker && docker start web # 规则丢失时重建报错尾巴与处理
| 报错尾巴 | 原因 | 处理方向 |
|---|---|---|
| 地址已被占用 | 宿主上已有服务占用端口 | 定位占用方并调整端口 |
| 找不到链 | 防火墙规则被清空 | 重启守护进程重建规则 |
| 映射失败但容器运行 | 规则不完整 | 补齐规则并验证 |
| 重启后容器未起 | 重启策略或依赖问题 | 逐个启动并核对策略 |
看到该报错先分辨是端口问题还是规则问题,盲目重启可能打断其他业务。
重启守护进程后个别容器没起来要逐个启动,并检查重启策略是否符合预期。
宿主防火墙被整体清空时,重建后要回归验证既有服务的端口可达性。
容器自身运行正常但端口不通,说明问题在发布链路而不在应用。
把占用端口的排查命令写进值班手册,能缩短这类问题的处理时间。
同一台宿主上重复出现该报错时,要回溯是谁在改动防火墙规则。