求助:无法从容器外部调用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
相关产品推荐
相关产品推荐

