Docker Compose环境下RabbitMQ客户端与生产者无法收发数据问题排查
问题根因
- 网络配置遗漏:你自定义了
rabbitmq_go_net网桥,但只有RabbitMQ服务加入了该网络,客户端和生产者服务默认使用docker-compose生成的默认网桥,三个服务不在同一网络下,无法互相访问 - RabbitMQ连接地址错误:你代码中使用
localhost作为RabbitMQ主机名,容器内的localhost指向容器自身,既不是宿主机器也不是RabbitMQ服务的容器,因此无法正常连接RabbitMQ - 无用端口配置:客户端和生产者是RabbitMQ的访问端,不需要暴露
5672端口,只有RabbitMQ作为服务端需要监听该端口,你给客户端配置的端口映射完全多余,还可能引发端口冲突
修复方案
1. 修正docker-compose.yml配置
给客户端和生产者服务加上同一网络配置,删除无用的端口映射:
version: '3.4' services: rabbitmq.messageclient: image: ${DOCKER_REGISTRY-}rabbitmqmessageclient build: context: . dockerfile: RabbitMQ.Client/Dockerfile # 加入自定义网桥 networks: - rabbitmq_go_net # 可选:通过环境变量传递RabbitMQ地址,避免硬编码 environment: - RABBITMQ_HOST=rabbitmq rabbitmq.producer: image: ${DOCKER_REGISTRY-}rabbitmqproducer build: context: . dockerfile: RabbitMQ.Producer/Dockerfile # 加入自定义网桥 networks: - rabbitmq_go_net # 可选:通过环境变量传递RabbitMQ地址 environment: - RABBITMQ_HOST=rabbitmq rabbitmq: image: rabbitmq:3-management container_name: 'rabbitmq' ports: - 5672:5672 - 15672:15672 volumes: - ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/mnesia - ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq networks: - rabbitmq_go_net networks: rabbitmq_go_net: driver: bridge
2. 修正代码中的RabbitMQ连接配置
把代码里原来连接RabbitMQ的主机名从localhost改为rabbitmq(docker-compose的自定义网桥自带DNS解析,同网络下的容器可以直接通过服务名互相访问),如果上面配置了环境变量,直接读取RABBITMQ_HOST环境变量即可。
排查步骤
如果修复后还有问题,按以下步骤排查:
- 执行
docker-compose ps查看三个服务是否都正常运行,是否存在异常退出的情况 - 进入客户端/生产者容器,执行
ping rabbitmq确认是否能正常解析到RabbitMQ容器的IP,验证网络连通性 - 进入客户端/生产者容器,执行
telnet rabbitmq 5672验证端口是否可访问 - 宿主端访问RabbitMQ管理后台(地址http://localhost:15672,默认账号密码均为guest),查看是否有客户端连接记录
- 执行
docker logs <容器ID>查看客户端、生产者、RabbitMQ的容器日志,定位具体报错信息
内容的提问来源于stack exchange,提问作者John Nyingi
相关产品推荐
相关产品推荐

