You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端口(代理会在容器内部转发请求)。
  • 生产环境部署:
    1. 先打包Vue项目:npm run build,得到dist目录。
    2. 用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;
    }
    
验证

修改完成后,本地访问http://localhost:5173、远程访问http://服务器IP:5173,都能正常建立Socket.io连接,不会再出现域名解析错误。

内容的提问来源于stack exchange,提问作者Rikib1999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:40:03