同一EC2实例中不同容器内Web应用与API的连接问题排查
同一EC2实例上两个容器的连通解决方案
确认容器网络归属
两个容器必须处于同一个Docker网络中才能正常互通。默认的bridge网络虽支持IP访问,但自定义网络更稳定,还能直接通过容器名解析地址。- 执行
docker network ls列出所有Docker网络 - 用
docker inspect <web容器名>和docker inspect <api容器名>查看两者的网络归属 - 若不在同一网络,运行
docker network connect <目标网络名> <容器名>将两个容器加入同一网络,之后Web容器可直接用API容器名+内部端口访问(例如http://api-service:3000)
- 执行
检查API服务的监听地址
很多API服务默认只绑定127.0.0.1,这种情况下仅能在容器内部访问,其他容器无法连通。必须修改为绑定0.0.0.0:- 进入API容器,执行
curl localhost:<内部端口>确认服务本身正常 - 修改API的启动参数或配置文件,将监听地址设为
0.0.0.0后重启服务
- 进入API容器,执行
验证容器间直接连通性
从Web容器内部测试与API容器的连通性:- 进入Web容器:
docker exec -it <web容器名> bash - 用API容器的私有IP+内部端口测试:
curl <api容器IP>:<内部端口> - 若能通,说明问题出在Web应用的配置上;若不通,回到第一步检查网络归属
- 进入Web容器:
排查EC2主机防火墙规则
如果你是通过EC2私有IP+主机端口访问API,需确保:- API容器已完成端口映射(例如
docker run -p 8080:3000 api-image,将容器内部3000端口映射到EC2主机的8080端口) - EC2主机的iptables/firewalld没有阻止容器网络段的流量(默认Docker bridge网络段为172.17.0.0/16,可临时关闭主机防火墙做测试)
- API容器已完成端口映射(例如
检查Web应用配置细节
确认Web配置中的API地址没有低级错误:- 端口号是否与API容器的内部端口(或映射后的主机端口)一致
- 协议是否正确(例如API用http,不要误写为https)
- IP地址或容器名是否存在拼写错误
内容的提问来源于stack exchange,提问作者Murphie
相关产品推荐
相关产品推荐

