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

Docker容器内Create-React-App的fetch请求无法找到服务器问题排查

问题分析与解决

核心原因是浏览器运行在宿主机网络环境,而非Docker内部网络,所以无法识别Docker Compose定义的api-admin服务域名——只有Docker容器之间才能通过服务名互相访问,浏览器不行。

解决办法

方法1:用Create-React-App的代理配置(开发/生产通用思路)

在项目根目录的package.json中添加代理配置:

"proxy": "http://api-admin:3000/v1"

然后前端代码中改用相对路径发起请求:

const req = new Request(
    '/login', {
    method: 'POST',
    body: formData
})
return fetch(req).then(processResp, processErr);
  • 开发时:CRA会自动将前端请求代理到目标API服务,避开跨域和域名解析问题。
  • 生产部署时:需要用Nginx这类反向代理工具,将前端容器的API请求转发到api-admin:3000/v1(参考方法2)。

方法2:Nginx反向代理(生产部署推荐)

把React打包后的静态文件部署到Nginx容器中,修改Nginx配置文件,添加反向代理规则:

server {
    listen 80;
    root /usr/share/nginx/html;
    index index.html;

    # 匹配API请求,转发到api-admin服务
    location /v1/ {
        proxy_pass http://api-admin:3000/v1/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 处理React路由刷新404问题
    location / {
        try_files $uri $uri/ /index.html;
    }
}

前端代码中使用相对路径/v1/login发起请求,Nginx会自动将请求转发到Docker内部的API服务。

方法3:宿主机端口映射(仅测试用)

在docker-compose.yml中给api-admin服务映射宿主机端口:

services:
  api-admin:
    ports:
      - "3000:3000"

然后前端将apiAdminUrl设置为http://localhost:3000/v1(或宿主机IP+端口)。这种方式适合本地测试,但生产环境不推荐,会暴露服务端口且依赖宿主机网络。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:45:34