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

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实例入站规则

EC2实例入站规则


问题原因及解决方法

核心问题是前端请求的目标地址配置错误:

  1. 前端代码里如果把后端地址写死成localhost:8080,这个localhost在前端容器/用户浏览器环境里指向的是前端自身,而非EC2实例或后端容器,自然会连接失败。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:27:27