从零开始:公网IP VPS上Docker容器的网络调优实战
上周帮朋友部署项目时,发现很多新手在VPS上装完Docker就直接跑服务,结果遇到各种网络连通性问题。今天我就结合自己踩过的坑,聊聊公网VPS部署Docker后的网络配置要点。
1. 基础网络检查:别让防火墙背锅
记得第一次在VPS上跑Docker时,nginx容器明明启动了,但外网就是访问不了。折腾半天才发现是云厂商的安全组规则没放行端口(阿里云叫安全组,AWS叫Security Group)。
# 先确认宿主机端口是否监听
ss -tulnp | grep 80
# 如果是云服务器,务必检查:
1. 控制台安全组规则
2. iptables/nftables规则
3. 容器是否用了host网络模式
建议先用docker run -p 80:80 nginx
这种显式端口映射测试,比复杂的bridge网络更容易排查问题。
2. 端口映射的三大坑点
你以为-p 8080:80
就万事大吉?这几个细节要注意:
- 绑定IP:默认监听0.0.0.0,如果只想内网访问要用
-p 192.168.1.100:8080:80
- 协议类型:UDP服务要显式声明
-p 53:53/udp
- 端口冲突:宿主机已用端口会导致容器启动失败,可用
ss -tulnp
检查
3. 高级玩法:自定义bridge网络
当需要多个容器互联时,默认的bridge网络会有DNS解析问题。我的做法是创建自定义网络:
# 创建带子网的自定义网络
docker network create
--driver=bridge
--subnet=172.28.0.0/16
--gateway=172.28.0.1
my-net
# 运行容器时指定网络
docker run -d --network=my-net --name=web nginx
docker run -d --network=my-net --name=db redis
这样容器间既可以用容器名
互访,又能通过--ip
指定固定IP(适合数据库连接)。
4. 外网访问的终极方案:host模式
对于高性能场景,我通常会直接使用host网络模式:
docker run -d --network=host nginx
优点是没有NAT性能损耗,缺点是端口管理要更小心。有一次我忘了改nginx默认端口,直接和宿主机sshd冲突了…
5. 安全加固:限制容器网络权限
生产环境一定要记得:
- 禁用默认的
--privileged
特权模式 - 按需添加
--cap-add
权限(比如NET_ADMIN) - 用
--sysctl
控制网络参数,例如:net.ipv4.ip_forward=1
最近发现个实用工具docker network inspect
,可以查看容器IP、网关等详细信息,排查问题时特别有用。
最后说个冷知识:Docker默认会创建一条MASQUERADE的iptables规则,这就是为什么容器能访问外网但外网访问不了容器的原因。想深入理解的话,建议用iptables -t nat -L -n -v
看看规则链。
大家有什么Docker网络方面的奇葩问题,欢迎在评论区交流~
非常实用,刚遇到vps docker网络不通的问题,看了立刻排查出是安全组没开端口,感谢分享!
这篇文章来得太及时了,手把手教我配置docker网络。想问下自定义bridge网络可以指定ipv6地址吗?🤔
host模式容易出问题,上次我也忘了改端口导致服务冲突,折腾了一下午,现在看文章才明白原因😅
查安全组真的是第一要点,新手基本都会忽视这件事。看完感觉终于搞懂了docker网络那些坑,期待作者写docker-compose实战。