Docker Compose环境下Pika连接RabbitMQ被拒绝问题求助
搞定Docker Compose里容器连RabbitMQ的坑
嘿,我一眼就瞅到你这个问题的核心了——你在listener容器里用localhost连RabbitMQ,可容器里的localhost指的是它自己啊!RabbitMQ明明在另一个容器里,自然连不上,这就是为啥会报连接拒绝的错。而且Pika还瞎尝试IPv6,雪上加霜,咱一步步解决:
第一步:把localhost换成Docker服务名
在Docker Compose的默认网络里,各个服务能直接用服务名互相访问。你的RabbitMQ服务叫rabbitMQ,所以把连接代码改成这样就行:
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitMQ'))
这样Docker内部的DNS会自动把rabbitMQ解析成对应的容器IP,不用你管具体地址。
第二步:强制Pika用IPv4(万一还有问题)
如果改了地址还是遇到IPv6的报错,那就直接给Pika加个参数,让它老老实实走IPv4:
先导入socket模块:
import socket
然后修改连接参数:
params = pika.ConnectionParameters( host='rabbitMQ', socket_options=( (socket.IPPROTO_TCP, socket.TCP_NODELAY, 1), (socket.IPPROTO_IP, socket.IPV6_V6ONLY, 0) # 关掉纯IPv6模式,优先用IPv4 ) ) self.connection = pika.BlockingConnection(params)
额外小检查
从你的日志看,RabbitMQ已经监听了[::]:5672,这个是兼容IPv4的,所以只要容器间网络通,用服务名肯定能连上。另外你docker-compose里的端口映射是给宿主机用的,容器之间通信根本不需要,直接用5672默认端口就行。
要是改完还不行,你可以进listener容器里,用ping rabbitMQ或者telnet rabbitMQ 5672测测,看看能不能通,先排除网络问题。
内容的提问来源于stack exchange,提问作者user2130951
相关产品推荐
相关产品推荐

