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

求助:无法从容器外部调用AWS EC2 RHEL7上的容器化Spring Boot REST API

问题分析与解决方案

核心现象梳理

  • Spring Boot Hello World应用本地运行正常,提供/hello接口
  • 在AWS EC2 RHEL 7实例的RHEL 7容器中启动无异常,但外部调用报错:

    curl: (28) Failed to connect to port 80 after 21003 ms: Couldn't connect to server.

  • 使用docker run --network host ...启动时,EC2实例内部调用接口正常
  • 使用docker run -p 8080:8080 ...启动时,外部调用失败

排查与解决步骤

1. 修正访问端口(最易忽略的错误)

你的容器端口映射是8080:8080,但报错显示你在访问EC2的80端口,属于端口混淆问题。外部访问必须使用8080端口,正确调用命令:

curl http://<EC2_IP>:8080/hello

2. 开放EC2安全组8080端口入站规则

当前安全组仅开放了22、80、443端口,端口映射后外部流量需先到达EC2的8080端口再转发到容器,需添加安全组规则:

  • 协议:TCP
  • 端口范围:8080
  • 来源:0.0.0.0/0(或指定允许的IP范围)

3. 开放EC2实例本地防火墙(firewalld)8080端口

RHEL 7默认开启firewalld,即使安全组放行,本地防火墙也会拦截未开放的端口:

# 临时开放8080端口(重启后失效)
firewall-cmd --add-port=8080/tcp
# 永久开放8080端口
firewall-cmd --add-port=8080/tcp --permanent
# 重启防火墙使规则生效
firewall-cmd --reload
# 验证端口是否开放
firewall-cmd --list-ports

4. 确认Spring Boot应用监听地址

如果应用仅绑定127.0.0.1,即使端口映射正确,外部也无法访问。检查应用配置文件(application.properties/application.yml):

# 确保监听所有网卡地址,默认值即为0.0.0.0,若手动配置过需确认
server.address=0.0.0.0

5. 验证容器端口映射有效性

在EC2实例内执行docker ps,查看容器端口映射列,确认显示:

0.0.0.0:8080->8080/tcp

此状态说明端口映射已正确绑定到EC2的所有网卡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:32:02