当前位置:首页>python>Python学习【12】:虚拟机IP老是变?一次搞定静态IP,顺便理清Nginx在物理机与Docker下的配置差异

Python学习【12】:虚拟机IP老是变?一次搞定静态IP,顺便理清Nginx在物理机与Docker下的配置差异

  • 2026-09-12 11:44:08
Python学习【12】:虚拟机IP老是变?一次搞定静态IP,顺便理清Nginx在物理机与Docker下的配置差异
一、学前花絮
你有没有遇到过这样的场景:昨天还好好的项目,今天打开浏览器却是一片空白或502错误。检查了半天,代码没动、配置没改、服务也在运行——最后发现,只是虚拟机的IP地址变了。
我就刚刚经历了这样一次“血案”。
在VirtualBox中运行Ubuntu虚拟机,网络采用桥接模式,IP由路由器DHCP动态分配。昨天是192.168.1.6,今天重启后变成了192.168.1.5。看起来只是数字变了一位,但整个GDP动态条形图项目就瘫痪了——因为Nginx配置里的proxy_pass还死死指向旧地址。
这个问题让我意识到两个核心痛点:
  • IP不固定,每次重启都要改配置
  • 配置改了要同步到Docker容器,稍有不慎就遗漏
本文就围绕这两个问题,记录完整的排查与解决过程,希望能帮到有类似困扰的开发者。
二、虚拟机IP动态改为静态
2.1 问题重现:IP变了,服务挂了
1.现象
浏览器访问http://192.168.1.6:8080正常,但虚拟机重启后IP变成192.168.1.5,访问新地址却出现502 Bad Gateway。
后端FastAPI明明在运行:

直接访问后端没问题:

但通过Nginx代理访问就报错:

2.根因
Nginx配置中的proxy_pass还在指向旧的IP地址:

浏览器访问8080端口时,Nginx尝试将请求转发给192.168.1.6:8000,但该地址已不存在,于是返回502。
这就引出两个必须解决的问题:
如何让虚拟机IP永久固定?
如何在Nginx配置变更后,确保Docker容器内的配置同步更新?
2.3 固定虚拟机IP(根治)
查看当前网络信息:

修改Netplan配置
Ubuntu使用Netplan管理网络,配置文件在/etc/netplan/目录下:

配置内容(注意YAML缩进):

应用配置

验证

2.4 Nginx配置同步(物理机 vs Docker)
IP固定后,需要将Nginx配置中的旧IP全部替换为新IP。
场景一:Nginx安装在物理机(宿主机)
如果Nginx直接安装在Ubuntu上,修改配置非常简单:

场景二:Nginx运行在Docker容器中
这是本次踩坑最多的地方。Docker容器是一个隔离环境,配置文件在容器内部,物理机修改不会自动同步(除非用挂载卷)。
错误做法:只改宿主机文件,忘记同步到容器。

更优雅的方式:使用挂载卷(Volume)
每次修改都要docker cp确实麻烦。更好的做法是在启动容器时挂载配置文件目录,宿主机修改即同步到容器。
启动命令:

挂载后,宿主机文件与容器文件是“同一个”,修改宿主机文件,容器内立即生效,只需重载即可:

三、小结
本文从一个“IP变了导致服务502”的实际问题出发,梳理了两个核心问题的解决方案。以下是重点:
  • IP固定是第一道防线,避免每次重启都要改配置
  • Docker容器内外的配置是隔离的,修改后必须同步
  • 重载配置前先测试语法(nginx -t),避免因语法错误导致服务中断
  • 后端服务监听0.0.0.0,确保Docker容器能正常访问
让我们保持学习的热情,2026年一马当先、马到成功!

最新文章

随机文章