我的踩坑实录:给带公网IP的VPS配置Docker网络那些事儿
大家好,我是33blog的运维小哥。上周在给新买的VPS部署Docker时,被网络配置折腾得够呛。今天就把这些实战经验(和血泪教训)整理出来,希望能帮到同样遇到问题的朋友。
1. 为什么需要特殊配置?
刚开始我以为,在VPS上装Docker和本地开发机没什么区别。直到部署完第一个容器,发现公网根本访问不了,才意识到问题:
- 云厂商的VPS通常有安全组/防火墙
- Docker默认创建的网桥是私有网络
- NAT转发规则需要手动配置
特别是当我用docker run -p 80:80 nginx
启动服务后,本地curl 127.0.0.1
能通,但用公网IP访问就是超时,这个现象让我debug了整整两小时…
2. 必须检查的三层配置
经过反复测试,总结出这三个关键检查点:
2.1 云平台安全组
# 以阿里云为例,需要放行入方向端口
# 规则示例:
协议类型: TCP
端口范围: 80/80
授权对象: 0.0.0.0/0
2.2 系统防火墙
Ubuntu默认的ufw会阻止Docker端口,建议:
sudo ufw allow 80/tcp
# 或者更暴力的方式(生产环境慎用)
sudo ufw disable
2.3 Docker网络模式
这是我踩的最大的坑!默认的bridge模式会导致:
- 容器绑定到172.17.0.0/16网段
- 端口映射实际发生在docker0网卡
解决方案是用host
网络模式:
docker run --network=host -d nginx
注意:这样容器会直接使用主机网络栈,安全性要考虑清楚
3. 我的终极解决方案
经过多次尝试,最终采用的方案是:
- 保持默认bridge网络
- 在安全组开放所需端口
- 配置iptables转发规则:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
sudo iptables -t nat -A POSTROUTING -p tcp -d 172.17.0.2 --dport 80 -j SNAT --to-source [VPS内网IP]
记得把172.17.0.2换成你的容器实际IP,可以用docker inspect
查看。
4. 验证技巧和小贴士
分享几个调试时超有用的命令:
# 查看端口监听情况
netstat -tulnp | grep 80
# 测试外部连通性(用另一台服务器)
telnet 你的公网IP 80
# 查看Docker网络详情
docker network inspect bridge
最后提醒:如果用了宝塔面板,记得去软件商店里把防火墙也检查一遍!我就被这个隐藏关卡坑过一次…
希望这篇记录能帮到你。如果遇到其他网络问题,欢迎在评论区交流~
太实用了!刚好遇到同样的问题,按照步骤操作终于解决了 👍
我也是被安全组卡了半天,楼主总结得很到位
建议新手用host模式确实省事,不过安全性要注意,楼主建议很中肯
docker网络这块确实坑多,感谢分享经验 🤔