Docker环境下自定义服务连接容器化RabbitMQ失败求助
问题根因排查
1. 网络隔离问题
你当前配置中my_app显式加入了自定义sandbox网络,但rabbitmq服务未配置任何网络,默认会加入Docker Compose自动生成的项目默认网络,两个服务不在同一网络下,无法通过rabbitmq主机名互相通信,这是最核心的报错原因。
2. 服务启动时序问题
depends_on仅控制容器的启动顺序,不保证RabbitMQ服务内部完全初始化完成、对外开放5672端口后再启动my_app,RabbitMQ启动过程通常需要3-10秒,提前启动的应用会直接连接失败。
3. 默认用户访问限制
RabbitMQ 3.3及以上版本默认限制guest用户仅能通过localhost访问,跨容器访问默认会被拒绝。
修复方案
第一步:修正docker-compose.yaml配置
version: "3.9" services: rabbitmq: hostname: "rabbitmq" image: "rabbitmq:3-management" container_name: "rabbitmq" ports: - "5672:5672" - "15672:15672" stdin_open: true tty: true # 新增:和my_app加入同一网络 networks: - sandbox # 新增:健康检查,确认RabbitMQ完全就绪 healthcheck: test: ["CMD", "rabbitmqctl", "status"] interval: 5s timeout: 10s retries: 5 # 新增:放开guest用户跨主机访问限制 environment: RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: '-rabbit loopback_users "none"' my_app: image: 'my-app' container_name: 'my-app' build: ./my_app ports: - "8000:8000" volumes: - ./my_app:/src command: python manage.py runserver 0.0.0.0:8000 env_file: ./common.env stdin_open: true tty: true # 修改:等待rabbitmq健康检查通过再启动 depends_on: rabbitmq: condition: service_healthy networks: - sandbox networks: sandbox: name: sandbox_network
第二步:可选校验
修复后如果仍有问题,可以进入my_app容器执行以下命令校验连通性:
- 执行
ping rabbitmq,确认能正常解析到RabbitMQ容器IP - 执行
nc -zv rabbitmq 5672,确认5672端口可正常访问
额外说明
你当前代码中声明的队列名为croudie_creation,但发送消息时指定的路由键是hello,默认直连交换机会匹配和路由键同名的队列,这会导致消息无法路由到你声明的队列,连接问题修复后可以同步调整路由键为croudie_creation即可正常消费。
内容的提问来源于stack exchange,提问作者zigzagzoom
相关产品推荐
相关产品推荐

