Amazon EC2中Docker Compose部署的前后端容器连接拒绝问题求助
问题描述
我在AWS EC2实例上通过Docker Compose部署了两个容器,分别对应项目的后端和前端镜像。通过AWS的DNS地址+3000端口可正常访问前端页面,但尝试登录(注册接口也报相同错误)时出现ERR_CONNECTION_REFUSED错误。
我怀疑是端口问题,做了以下测试:
- 通过Postman访问AWS DNS地址+8080端口,后端响应正常;
- 在实例终端通过
curl localhost:8080,后端响应正常; - 但前端无法向同一实例上监听
localhost:8080的后端发送请求。
请问我遗漏了什么配置?
附加信息
Docker Compose文件
version: '3' services: book-portal-back-end: image: "ugurcanerdogan/book-portal-be:v1" container_name: ugurcanerdogan-bookPortal-be ports: - "8080:8080" environment: - SPRING.PROFILES.ACTIVE=default book-portal-front-end: image: "ugurcanerdogan/book-portal-fe:v1" container_name: ugurcanerdogan-bookPortal-fe ports: - "3000:3000" links: - book-portal-back-end
EC2实例入站规则

问题原因及解决方法
核心问题是前端请求的目标地址配置错误:
- 前端代码里如果把后端地址写死成
localhost:8080,这个localhost在前端容器/用户浏览器环境里指向的是前端自身,而非EC2实例或后端容器,自然会连接失败。 - Docker Compose的
links仅能让前端容器内部通过服务名book-portal-back-end访问后端,但前端页面是在用户浏览器中运行的,不在容器网络范围内,无法直接使用这个服务名。
提供两种解决思路:
思路一:修改前端接口地址
直接把前端代码里的后端接口地址改成EC2实例的DNS地址+8080端口(比如http://xxx.awsdns.com:8080/api/login),重新构建前端镜像后部署即可。
思路二:用Nginx反向代理统一路由(推荐)
在Docker Compose中添加Nginx容器作为反向代理,统一处理前端页面和后端接口请求,避免硬写外部地址和跨域问题:
version: '3' services: book-portal-back-end: image: "ugurcanerdogan/book-portal-be:v1" container_name: ugurcanerdogan-bookPortal-be environment: - SPRING.PROFILES.ACTIVE=default # 无需对外暴露8080,仅在容器内网访问 book-portal-front-end: image: "ugurcanerdogan/book-portal-fe:v1" container_name: ugurcanerdogan-bookPortal-fe # 无需对外暴露3000 nginx-proxy: image: nginx:alpine ports: - "80:80" volumes: # 挂载自定义Nginx配置文件,本地路径自行调整 - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - book-portal-back-end - book-portal-front-end
对应的nginx.conf示例:
events {} http { server { listen 80; # 转发前端页面请求 location / { proxy_pass http://book-portal-front-end:3000; } # 转发后端接口请求(假设接口前缀为/api) location /api { proxy_pass http://book-portal-back-end:8080; } } }
配置完成后,用户只需访问EC2的DNS地址(无需加端口),Nginx会自动把请求转发到对应容器;前端代码里的后端接口只需写相对路径(比如/api/login)即可。
补充:你的EC2入站规则已开放8080、3000端口,网络层面无问题,核心是前端请求的目标地址指向错误。
内容的提问来源于stack exchange,提问作者uqi8
相关产品推荐
相关产品推荐

