docker 常见问题之网络
一、Docker服务启动但是页面无法访问是什么原因:
Docker 网络漂了 = Docker 认为端口已经绑定,但内核真实转发链路断了
具体表现你已经完整命中了:
现象 真实含义
docker ps 显示 0.0.0.0:8080->8080 Docker 元数据还在
netstat 有 docker-proxy 进程在
宿主机 curl 127.0.0.1:8080 reset 链路断了
容器内访问正常 服务本身没问题
restart docker 后恢复 NAT / bridge 被重建
这不是 Jenkins 的问题,是 Docker 网络层状态不一致
二、Docker 端口访问的“真实路径”(非常关键)
你服务器访问:
curl http://10.0.8.21:8080
真实路径是:
用户请求
↓
宿主机网卡 ens33
↓
iptables PREROUTING (DNAT)
↓
docker0 bridge
↓
vethXXXX
↓
容器 eth0
↓
Jenkins (8080)
⚠️ 任何一环断了,外部就访问不了
三、Docker 网络是“怎么漂”的(核心原因)
1️⃣ iptables 不是 Docker 独占的(这是根因)
Docker 并不拥有 iptables,它只是:
“启动时往 iptables 里插几条规则”
如果下面任意事情发生 👇
Docker 并不会自动感知并修复
2️⃣ 最常见的 7 种“漂移触发源”(你环境命中 4 条)
✅ ① 网络服务重启
systemctl restart NetworkManager
ifdown/ifup
👉 会清空 conntrack / NAT 状态
✅ ② VPN / 虚拟网卡(高危)
OpenVPN
WireGuard
公司内网 VPN
它们会:
插 NAT
改默认路由
改 FORWARD 策略
👉 Docker 不会重算规则
✅ ③ 宿主机网卡抖动(虚拟机常见)
你的是:
ens33(VMware / KVM 常见)
虚拟机网络一抖:
bridge 还在
veth 在
NAT 断了
✅ ④ 防火墙程序“碰过 iptables”
比如:
ufw(即使 inactive)
firewalld
安全加固脚本
运维一键优化脚本(⚠️你之前用过)
✅ ⑤ Docker daemon 长时间不重启
你这个 5 周 uptime 是经典案例
iptables 状态不是为长期运行设计的
✅ ⑥ 内核 conntrack 表异常
表满
状态不一致
半连接残留
✅ ⑦ docker-proxy 异常但进程还在
进程在 ≠ 能转发
socket 可能已死
四、为什么“Docker 不会自动修?”
这是设计决定,不是 bug:
iptables 是全局资源
Docker 不敢“重写”用户规则
只能在 daemon 启动 / 容器启动 时插规则
👉 所以:
Docker 网络天生“脆”,但可控
五、漂了怎么办(实战处理顺序)
✅ 方案 1(你已经验证):重启 Docker
systemctl restart docker
✔️ 90% 情况立刻好
❌ 会重启所有容器
✅ 方案 2:只重建网络(业务友好)
docker network ls
docker network inspect bridge
docker network disconnect bridge jenkins
docker network connect bridge jenkins
或者更稳一点:
docker network rm bridge
systemctl restart docker
✅ 方案 3:强制 docker-proxy 兜底(推荐)
/etc/docker/daemon.json
{
"userland-proxy": true
}
👉 不用完全依赖 iptables
✅ 方案 4:干脆绕开 Docker 网络(最稳)
用 nginx 代理到容器 IP:
location / {
proxy_pass http://172.17.0.2:8080;
}
👉 大厂 Jenkins 基本都这样
六、怎么“根治”这种漂(你该怎么做)
✅ 1️⃣ Jenkins 永远不要直接裸跑 Docker 端口(你现在已经进阶了)
用户 → Nginx → Docker
✅ 2️⃣ Docker daemon 级别配置(非常关键)
{
"iptables": true,
"userland-proxy": true,
"bridge": "docker0"
}
✅ 3️⃣ 定期 Docker 网络巡检(可脚本化)
curl -s http://127.0.0.1:80 || systemctl restart docker
✅ 4️⃣ 如果是“政务 / 内网环境”——这是最佳实践
Jenkins 不直连外网
插件离线
前面一层 nginx
Docker 网络只走内网
浙公网安备 33010602011771号