CentOS 7.9 上把采集程序从 bridge 改成 –network host 启动,参数里的 -p 8080:8080 还在,外面访问 8080 超时,ss 里只有程序自己监听的 127.0.0.1:8080。
一开始怀疑是「改了网络模式但 compose 文件里还有 ports 段,重建时被旧容器复用」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。host 网络下容器直接用宿主机网络栈,-p 参数不生效也不报错,属于被静默忽略。少数情况下是程序配置里绑的是 127.0.0.1,host 模式下就只有本机能访问。
另外,宿主机的 firewalld 只放行了 docker0 网段,回环与外部网卡策略不同。
上来先确认容器实际使用的网络模式
docker inspect web -f '{{.HostConfig.NetworkMode}}'
再往下看端口到底监听在哪个地址上
ss -lntp | grep 8080
然后把程序监听地址改成 0.0.0.0 再重启
docker run -d --network host -e BIND_ADDR=0.0.0.0 app:1.4
剩下的就是放行端口并验证从外部访问
firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload
别只看报错消失,验证要多做一步。ss 显示 0.0.0.0:8080 处于 LISTEN,从另一台机器 curl 返回 200,docker inspect 的网络模式与预期一致。
提醒一点。host 模式换来的是性能和少一层 NAT,代价是端口全暴露且不能重复;能固定端口就别用 host,出问题也不好排查。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
