Docker Compose中Nginx+React无法连接Gunicorn+Flask后端的求助
你遇到的核心问题是Docker容器间的网络通信误区——你的Nginx容器里配置的localhost:5000指向的是Nginx容器自身,而你的Flask服务运行在另一个独立的ner容器里,自然会出现连接拒绝的错误。下面是具体的修复方案:
1. 修改Nginx配置文件
把Nginx配置中的localhost替换为Docker Compose中Flask服务的名称ner即可。因为Compose默认会为所有服务创建一个共享网络,服务名可以直接作为域名解析到对应容器的IP地址:
server { listen 80; location / { index index.html; root /usr/share/nginx/html; } location /api/v1 { proxy_pass http://ner:5000/api/v1; } location /api/v2 { proxy_pass http://ner:5000/api/v2; } }
2. 调整前端proxy配置(适配生产环境)
你package.json里的"proxy": "http://localhost:5000"只在本地开发环境(用npm start启动)生效,当前端打包部署到Nginx容器后,这个配置不会起作用。需要确保前端代码里的API请求用相对路径(比如/api/v2而不是硬编码http://localhost:5000/api/v2),这样Nginx的location规则才能捕获请求并转发到后端。
如果前端已经用了相对路径,这一步可以直接跳过;如果有硬编码的地址,建议改成相对路径,或者在构建时通过环境变量注入后端服务地址。
3. 确认Docker Compose配置的合理性
你的docker-compose.yml配置基本没问题:
ner服务用expose: -5000暴露了端口,且Gunicorn绑定了0.0.0.0:5000(允许容器外部访问)frontend设置了depends_on: - ner,确保Flask服务优先启动
如果想更清晰,也可以给ner服务显式指定容器名(可选),不过默认的服务名解析已经足够用。
验证修复效果
修改完配置后,重新构建并启动服务:
docker-compose down docker-compose up --build
此时你可以直接访问http://localhost/api/v2?query=xxx测试后端接口,也可以通过前端页面发起请求,查看日志应该不会再出现连接拒绝的错误了。
内容的提问来源于stack exchange,提问作者Minh Triet

