Vite本地运行无法通过Docker网络host.docker.internal访问问题
问题描述
两台Ubuntu机器(台式机正常、笔记本异常)的开发环境架构:
- 前端:本地运行Vite,配置如下:
server: { host: "0.0.0.0", port: 3000, }, - API:Docker容器部署,Vite可正常与之通信
- Worker:独立Docker容器(运行Puppeteer),需访问本地Vite实例生成PDF
Docker Compose已配置:
extra_hosts: - "host.docker.internal:host-gateway"
异常表现:
- 笔记本上Vite仅暴露localhost、以太网IP,未绑定docker0的172.*网段;台式机正常绑定所有网络
- Worker容器可ping通
host.docker.internal,但无法访问http://host.docker.internal:3000 - 已尝试重建Docker镜像、升级Vite,问题未解决
排查与解决方案
1. 确认Vite实际监听地址
执行以下命令检查Vite是否真的绑定了0.0.0.0:
ss -tulpn | grep :3000
如果输出中监听地址是127.0.0.1或特定IP,说明配置被覆盖:
- 检查
.env文件是否存在VITE_SERVER_HOST变量,该变量会覆盖配置文件的server.host - 确认Vite启动命令是否带了
--host参数(如vite --host 127.0.0.1),手动参数优先级高于配置文件
2. 检查docker0网络与本地访问性
- 查看docker0网卡IP:
通常输出为ip addr show docker0172.17.0.1/16 - 在宿主机测试访问该IP的3000端口:
若访问失败,说明Vite未监听docker0网段,需回到步骤1排查配置;若能访问,问题出在容器到宿主机的流量拦截curl http://172.17.0.1:3000
3. 排查防火墙规则
Ubuntu默认防火墙ufw可能阻止了docker0网段的流量:
- 查看防火墙状态:
sudo ufw status - 允许docker0网段访问3000端口:
sudo ufw allow in from 172.17.0.0/16 to any port 3000 - 临时关闭ufw测试(验证是否为防火墙问题):
sudo ufw disable
4. 修正host.docker.internal映射
容器内host.docker.internal默认映射宿主机的以太网IP,若笔记本以太网接口防火墙拦截,可手动映射到docker0的IP:
修改Docker Compose的extra_hosts:
extra_hosts: - "host.docker.internal:172.17.0.1"
重启容器后再次测试访问
5. 检查宿主机路由表
执行以下命令确认docker0路由规则正常:
route -n
若存在阻止容器到宿主机的路由条目,需清理对应规则
内容的提问来源于stack exchange,提问作者patrickiom
相关产品推荐
相关产品推荐

