搭建公网IP VPS部署Docker后的网络配置

2025.7.9 杂七杂八 844
33BLOG智能摘要
在公网IP VPS上部署Docker后,需注意网络配置。首先检查云厂商安全组及iptables规则,确保端口已放行。端口映射要设置绑定IP、协议类型并避免冲突。多容器互联建议创建自定义bridge网络,可固定IP并提升互联稳定性。高性能场景可使用host模式,但需避免端口冲突。生产环境应按需限制容器权限,使用--cap-add和--sysctl等命令。排查问题时,可用docker network inspect。Docker默认添加MASQUERADE规则,了解iptables规则链有助于深入理解网络问题。
— 此摘要由33BLOG基于AI分析文章内容生成,仅供参考。

从零开始:公网IP VPS上Docker容器的网络调优实战

搭建公网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实战。