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 网络只走内网

posted @ 2025-12-29 17:27  中午吃麻辣烫  阅读(1)  评论(0)    收藏  举报