Docker Compose中Vue+Flask的Socket.IO配置问题:域名解析失败
问题分析
浏览器报错ERR_NAME_NOT_RESOLVED的核心原因是:前端代码里写的flask_app:4000是Docker内部的服务域名,只有容器之间能识别解析,但浏览器运行在宿主机或外部网络,根本找不到这个域名。
换成localhost:4000本地能正常运行,是因为本地浏览器会把localhost指向自己的电脑,而宿主机的4000端口已经映射到Flask容器;但部署到远程服务器后,用户浏览器的localhost指向的是自己的设备,不是远程服务器,自然连接不上Flask服务。
解决方案
核心思路是让前端通过相对路径发起Socket.io请求,利用代理(开发环境用Vite代理,生产环境用Nginx等反向代理)转发到Flask服务,避免硬编码容器域名或localhost。
1. 修改前端Socket连接地址(main.js)
把硬编码的容器地址改成相对路径,让浏览器自动使用当前页面的域名+端口发起请求:
// main.js // 替换原有的 const socket = io('http://flask_app:4000'); const socket = io('/'); // 或直接写io(),默认会使用当前页面的origin
2. 确认Vite代理配置(开发环境)
你的vite.config.js已经配置了正确的代理规则,确保保留以下配置,它会把浏览器发起的/socket.io请求转发到Docker内部的Flask服务:
// vite.config.js server: { host: true, proxy: { '/socket.io': { target: 'http://flask_app:4000', ws: true, changeOrigin: true } } }
容器之间可以正常解析flask_app这个服务名,代理转发不会有问题。
3. 远程服务器部署注意事项
- 开发环境部署:确保远程服务器防火墙开放
5173端口(前端Vite服务端口),外部浏览器通过http://服务器IP:5173访问即可,无需开放4000端口(代理会在容器内部转发请求)。 - 生产环境部署:
- 先打包Vue项目:
npm run build,得到dist目录。 - 用Nginx部署dist目录,同时配置反向代理转发Socket.io请求:
location /socket.io { proxy_pass http://flask_app:4000; # 若Flask在Docker内则用此地址,否则用服务器本地的localhost:4000 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } - 先打包Vue项目:
验证
修改完成后,本地访问http://localhost:5173、远程访问http://服务器IP:5173,都能正常建立Socket.io连接,不会再出现域名解析错误。
内容的提问来源于stack exchange,提问作者Rikib1999
相关产品推荐
相关产品推荐

