Docker Compose服务间请求出现ECONNREFUSED错误求助
Docker Compose容器间连接失败排查
环境与问题
我在开发服务器用Docker Compose运行服务,简化后的docker-compose.yml内容如下:
services: webserver: - ports: - "${HOST_PORT}:${CONTAINER_PORT}" redis: - ports: - "${REDIS_PORT}:${REDIS_PORT}" apiserver: - ports: - "8383:8383"
webserver启动BullMQ队列与Redis通信,队列任务需要请求http://apiserver:8383/endpoint,但任务持续失败,Redis中报错信息为:connect ECONNREFUSED 172.25.0.3:8383。本地运行Docker Compose一切正常,仅开发服务器出现该问题。
补充测试结果
在webserver容器内执行wget http://apiserver:8383,输出如下:
wget http://apiserver:8383 --2022-12-24 23:58:28-- http://apiserver:8383/ Resolving apiserver (apiserver)... 172.26.0.4 Connecting to apiserver (apiserver)|172.26.0.4|:8383... failed: Connection refused.
可能的原因
- Apiserver未正常启动:开发服务器上的apiserver容器可能启动失败、进程崩溃,或者启动速度慢于webserver,导致webserver发起请求时服务尚未就绪。可通过
docker-compose logs apiserver查看日志,确认服务是否正常启动并监听8383端口。 - Apiserver监听地址错误:如果apiserver的服务配置为仅监听
127.0.0.1(本地回环地址),则同一Docker网络内的其他容器无法访问。需确认服务监听地址为0.0.0.0,才能接收来自容器网络的请求。 - Docker网络配置差异:本地与开发服务器的Docker网络模式不同,或开发服务器的Docker网络存在冲突,导致DNS解析成功但端口无法连通。可通过
docker network inspect <你的compose网络名称>查看网络配置,确认apiserver端口在网络内正常暴露。 - 服务器资源不足:开发服务器的CPU、内存资源匮乏,导致apiserver无法正常启动或运行,无法监听端口。可查看服务器资源使用情况,以及apiserver容器的资源限制配置。
- 端口冲突:开发服务器上可能有其他进程占用了宿主机8383端口,导致apiserver容器无法绑定端口启动。这种情况通常会在容器启动日志中报错,也可通过
netstat -tulpn | grep 8383检查宿主机端口占用情况。
内容的提问来源于stack exchange,提问作者e-e
相关产品推荐
相关产品推荐

