多Docker Compose文件容器通信异常求助:连接被拒绝
跨Docker Compose容器连接拒绝问题排查方案
问题概述
两个独立Docker Compose项目中的b-applicationgateway与b-middleware容器已加入同一外部网络int-net,但前者向后者发送HTTP请求时出现Connection refused错误,内部网络通信正常。
排查与解决步骤
1. 确认服务监听端口的绑定范围
进入b-middleware容器,执行以下命令检查服务监听地址:
docker exec -it asynccontroller-b-middleware-1 ss -tulpn
确保服务监听的是0.0.0.0:9096而非127.0.0.1:9096。如果是Spring Boot应用,需在配置文件中设置server.address=0.0.0.0,否则仅允许容器内部访问端口。
2. 使用Docker服务名而非IP通信
Docker网络支持通过服务名直接解析通信,无需依赖固定IP。修改b-applicationgateway的请求地址为:
http://b-middleware:9096
避免使用日志中显示的172.27.0.2这类动态IP,容器重启后IP可能变化。
3. 验证网络连通性
进入b-applicationgateway容器,执行以下命令验证连通性:
- 解析服务名:
docker exec -it webplatform-b-applicationgateway-1 ping b-middleware - 测试端口开放:
docker exec -it webplatform-b-applicationgateway-1 nc -zv b-middleware 9096
如果ping通但端口无法访问,说明服务未正常监听端口。
4. 处理服务启动就绪问题
depends_on仅保证容器启动顺序,不保证服务完全就绪:
- 给
b-middleware添加健康检查(修改asyncController的docker-compose.yaml):services: b-middleware: # 原有配置... healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9096/actuator/health"] # 替换为你的健康检查端点 interval: 10s timeout: 5s retries: 5 - 在
b-applicationgateway中添加请求重试逻辑(比如Spring WebClient的重试过滤器),避免在服务未就绪时发起请求。
5. 检查外部网络配置
再次确认网络成员与配置:
docker network inspect int-net
确保两个容器的IPv4Address属于同一子网,且Aliases字段包含各自的服务名(b-applicationgateway、b-middleware)。
6. 查看容器启动日志
检查b-middleware的启动日志,确认服务是否正常初始化:
docker logs asynccontroller-b-middleware-1
排查是否有端口绑定失败、服务启动异常等报错信息。
内容的提问来源于stack exchange,提问作者Daniele00
相关产品推荐
相关产品推荐

