Docker Compose部署React+Express项目代理请求报ECONNREFUSED错误如何解决
问题原因
Docker 容器内部的 localhost 指向的是容器自身的网络命名空间,和宿主机、其他容器的网络互相隔离。你在前端容器内把代理目标设为 http://localhost:5000,会请求前端容器自身的5000端口,而不是宿主机或者后端容器的5000端口,所以会出现连接拒绝错误。本地直接运行时前后端都在宿主机同一个网络下,localhost 指向一致所以没有问题。另外你当前的 docker-compose.yml 中存在挂载路径写法错误,也可能导致修改的配置没有正常同步到容器内。
修复步骤
- 修正前端
setUpProxy.js代理配置
同一个 Docker Compose 集群下的服务可以直接用服务名作为域名互相访问,将代理目标地址改为后端服务的服务名server,同时添加changeOrigin参数避免跨域相关问题:
const {createProxyMiddleware} = require('http-proxy-middleware') module.exports = function(app) { app.use(createProxyMiddleware('/auth/google', { target: 'http://server:5000', changeOrigin: true })) app.use(createProxyMiddleware('/api/*', { target: 'http://server:5000', changeOrigin: true })) }
- 修正
docker-compose.yml的挂载路径
你当前的挂载配置使用了相对路径./app作为容器内路径,会导致代码挂载位置错误,改为容器内绝对路径/app:
version: '3' services: web: build: ./client/ ports: - "3000:3000" volumes: - /app/node_modules - ./client:/app # 修正为容器内绝对路径 server: build: ./server ports: - "5000:5000" volumes: - /app/node_modules - ./server:/app # 修正为容器内绝对路径
- 重启服务生效
执行以下命令重启集群,确保所有配置更新生效:
docker compose down docker compose up --build
排查验证方法
- 执行
docker compose ps确认web、server两个服务状态均为Up - 执行
docker compose exec web curl http://server:5000/api/current_user,如果返回正常响应说明容器间网络连通正常 - 代理配置可临时添加
logLevel: 'debug'参数,查看容器日志确认代理转发的目标地址是否正确
内容的提问来源于stack exchange,提问作者Luk Aron
相关产品推荐
相关产品推荐

