使用Docker Compose时出现RabbitMQ IP连接错误的原因排查
问题:Docker Compose部署服务无法连接RabbitMQ网络,单独运行容器则正常
我尝试用Docker Compose部署项目服务,但通过Compose部署时无法连接到RabbitMQ网络;单独运行各容器时连接却能成功。
docker-compose.yml配置
version: '3' services: notification: image: jyarac/notification_ms container_name: notification-microservice ports: - "3000:3000" networks: - rabbit_mq_nf gps: image: jyarac/gps container_name: gps-microservice ports: - "3001:3001" networks: - rabbit_mq_nf mq_ms: image: jyarac/mq_ms container_name: rabbit-microservice ports: - "3005:3005" networks: - rabbit_mq_nf rabbit_ms: image: rabbitmq:3-management container_name: rabbitmq ports: - "15672:15672" - "5672:5672" networks: - rabbit_mq_nf networks: rabbit_mq_nf: driver: bridge
报错信息
Error: connect ECONNREFUSED 172.25.0.5:5672 2023-10-02 19:18:04 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16) { 2023-10-02 19:18:04 errno: -111, 2023-10-02 19:18:04 code: 'ECONNREFUSED', 2023-10-02 19:18:04 syscall: 'connect', 2023-10-02 19:18:04 address: '172.25.0.5', 2023-10-02 19:18:04 port: 5672 2023-10-02 19:18:04 }
解决方案
用服务名替代IP连接RabbitMQ
Docker Compose会为每个服务分配固定的DNS别名,直接使用rabbit_ms(compose中RabbitMQ服务的名称)作为连接地址,不要用容器IP——IP在Compose重启后可能变化,而服务名始终有效。添加启动依赖与健康检查
RabbitMQ启动需要时间,其他服务可能在它未就绪时就发起连接。修改compose配置,给RabbitMQ添加健康检查,让其他服务等待它完全启动后再运行:rabbit_ms: image: rabbitmq:3-management container_name: rabbitmq ports: - "15672:15672" - "5672:5672" networks: - rabbit_mq_nf healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 5s timeout: 5s retries: 5 notification: image: jyarac/notification_ms container_name: notification-microservice ports: - "3000:3000" networks: - rabbit_mq_nf depends_on: rabbit_ms: condition: service_healthy # gps、mq_ms服务同样添加上述depends_on配置检查RabbitMQ启动日志
执行命令查看RabbitMQ容器日志,确认服务正常启动:docker logs rabbitmq正常启动会出现
Server startup complete相关日志。验证应用连接配置
检查微服务中的RabbitMQ连接参数:确保使用内部端口5672(不是宿主机映射端口),用户名密码与RabbitMQ默认的guest/guest一致,或者已在compose中配置了正确的环境变量。
内容的提问来源于stack exchange,提问作者Johhan
相关产品推荐
相关产品推荐

