如何从物理主机访问VirtualBox虚拟机中的Django开发服务器?
解决虚拟机Django应用无法被物理主机访问的问题
我来帮你一步步排查解决这个问题,这种虚拟机和主机之间的网络访问问题很常见,咱们慢慢来:
1. 先解决「绑定虚拟机IP提示无法分配」的问题
你执行python manage.py runserver 192.0.2.15:8000报错,大概率是这个IP不是虚拟机当前实际使用的有效IP。先确认虚拟机的真实IP:
在Ubuntu虚拟机里打开终端,执行命令:
ip addr show找到类似
enp0s3(或者其他网卡名)的条目,查看inet后面的地址,比如192.168.56.101,这才是你虚拟机的真实IP。另外,更简单的方式是直接让Django监听所有可用网络接口,而不是指定某个IP,执行:
python manage.py runserver 0.0.0.0:8000这个命令会让Django绑定虚拟机的所有网卡,不管虚拟机用哪个IP,都能接收到请求,这是测试阶段最方便的做法。
2. 配置VirtualBox的网络模式,确保主机和虚拟机网络互通
VirtualBox的网络模式决定了主机能不能直接访问虚拟机,分两种常用情况:
情况A:使用「桥接适配器」模式(推荐测试用)
- 关闭虚拟机,打开VirtualBox的「设置」->「网络」->「网络适配器1」,选择「桥接适配器」,下拉菜单选你物理主机正在用的网卡(比如WiFi或者以太网)。
- 启动虚拟机,再次确认虚拟机IP(用
ip addr),此时虚拟机和物理主机应该在同一网段(比如主机是192.168.1.10,虚拟机是192.168.1.20)。 - 现在在物理主机的Chrome里直接访问
虚拟机IP:8000(比如192.168.1.20:8000),应该就能打开Django应用了。
情况B:使用「NAT」模式(默认模式)
NAT模式下虚拟机的IP是VirtualBox内部的,主机不能直接访问,需要设置端口转发:
- 关闭虚拟机,打开「设置」->「网络」->「网络适配器1」->「高级」->「端口转发」。
- 点击「+」添加一条规则:
- 主机端口:
8000 - 子系统端口:
8000 - IP和子系统IP留空即可(或者子系统IP填虚拟机的真实IP)
- 主机端口:
- 启动虚拟机,执行
python manage.py runserver 0.0.0.0:8000。 - 现在物理主机访问
localhost:8000或者物理主机IP:8000就能打开应用了。
3. 检查ALLOWED_HOSTS和防火墙设置
- ALLOWED_HOSTS配置:在
settings.py里,确保添加了允许访问的主机IP或者用*(仅测试环境用,生产环境别这么做):# 测试用,允许所有主机访问 ALLOWED_HOSTS = ['*'] # 或者指定具体的主机IP和虚拟机IP ALLOWED_HOSTS = ['192.168.1.10', '192.168.1.20', 'localhost', '127.0.0.1'] - Ubuntu防火墙检查:如果虚拟机开启了ufw防火墙,需要开放8000端口:
或者临时关闭防火墙测试:sudo ufw allow 8000sudo ufw disable
最后验证步骤
- 虚拟机里执行
python manage.py runserver 0.0.0.0:8000 - 物理主机ping一下虚拟机的IP,确认网络通不通
- 打开Chrome访问对应的地址(桥接模式用虚拟机IP,NAT模式用localhost:8000)
这样应该就能解决你的问题了!
内容的提问来源于stack exchange,提问作者Prabina
相关产品推荐
相关产品推荐

