【问题标题】:pika.exceptions.ConnectionClosed: Connection to 172.18.0.3:5672 failed: [Errno 111] Connection refusedpika.exceptions.ConnectionClosed:连接到 172.18.0.3:5672 失败:[Errno 111] 连接被拒绝
【发布时间】:2018-02-23 11:26:24
【问题描述】:

我正在尝试将 Pika 客户端与 RabbitMQ 服务器连接。它们都在不同的 docker 镜像上,并且它们在同一个 docker 网络上。 我将我的网络设置为

docker network create my_first_net

我正在运行 RabbitMQ 映像 rabbitmq

docker run -d --network my_first_net --hostname rabbitmqhost  -p 35672:15672 -p 45672:5672 rabbitmq

我正在运行 Pika 图像 ms2-1 as

docker run --network my_first_net --hostname rabbitmq ms2-1

这里是 pika-client ms2.py 的代码:

import pika

exchange = 'gateway_exchange'

myName = 'microservice2'

myKey = '#.ms2.#'
gwKey = 'gw'

credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters('rabbitmq', 5672, '/', credentials)

def send(key, message):
    send_conn = pika.BlockingConnection(parameters)
    send_ch = send_conn.channel()

    send_ch.exchange_declare(exchange=exchange,
                             exchange_type='topic')

    send_ch.basic_publish(exchange=exchange,
                          routing_key=key,
                          body=message)
    print(" [x] Sent %r:%r" % (key, message))
    send_conn.close()

def receive():
    connection = pika.BlockingConnection(parameters)
    channel = connection.channel()
    channel.exchange_declare(exchange=exchange,
                             exchange_type='topic')

    result = channel.queue_declare(exclusive=True)
    queue_name = result.method.queue

    binding_key = myKey
    channel.queue_bind(exchange=exchange,
                       queue=queue_name,
                       routing_key=binding_key)

    print(' [*] Waiting for messages. To exit press CTRL+C')

    def callback(ch, method, properties, body):
        print(" [x] Received %r:%r" % (method.routing_key, body))
        send('Response-from-' + myName + '-to-.' + gwKey, body)

    channel.basic_consume(callback,
                          queue=queue_name,
                          no_ack=True)
    channel.start_consuming()

if __name__ == "__main__":
    receive()

当我尝试运行 pika 图像时出现以下错误

  Traceback (most recent call last):
  File "ms2.py", line 61, in <module>
    receive()
  File "ms2.py", line 36, in receive
    connection = pika.BlockingConnection(parameters)
  File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 374, in __init__
    self._process_io_for_connection_setup()
  File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 414, in _process_io_for_connection_setup
    self._open_error_result.is_ready)
  File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 468, in _flush_output
    raise exceptions.ConnectionClosed(maybe_exception)
pika.exceptions.ConnectionClosed: Connection to 172.18.0.3:5672 failed: [Errno 111] Connection refused

当我做docker inspect时,RabbitMQ容器的IP地址是172.18.0.2,当我在容器内做curl ifconfig.me时,它是68.50.13.82。 我确认容器正在使用 `netstat -ap tcp | 监听端口 5672。 grep -i "听"

我认为 Errno 111 与身份验证错误有关,但我无法从我的机器连接到任何一个 IP 地址。

解决此问题的下一步应该是什么?

编辑:我意识到在运行 RabbitMQ 服务器时我没有添加 --name 标志,所以我删除了该容器并启动了一个新容器:

docker run -d --network my_first_net --hostname rabbitmqhost --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq

但现在我得到了错误:

Traceback (most recent call last):
  File "ms2.py", line 61, in <module>
    receive()
  File "ms2.py", line 36, in receive
    connection = pika.BlockingConnection(parameters)
  File "/usr/local/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 374, in __init__
    self._process_io_for_connection_setup()
  File "/usr/local/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 414, in _process_io_for_connection_setup
    self._open_error_result.is_ready)
  File "/usr/local/lib/python2.7/site-packages/pika/adapters/blocking_connection.py", line 466, in _flush_output
    raise maybe_exception
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

【问题讨论】:

    标签: docker rabbitmq pika


    【解决方案1】:

    我遇到了同样的问题。 通过调整参数“socket_timeout”我能够摆脱这个问题。参数说明为here

    这里是sn-p的代码,将socket_timeout设置为15秒:

    connection=pika.BlockingConnection(pika.ConnectionParameters(host='xx.xx.xx.xx',socket_timeout=15,credentials=credentials))

    xx.xx.xx.xx : 放置你的主机 IP。

    【讨论】:

      【解决方案2】:

      出现问题是因为您在运行 pika 容器时重复使用了相同的主机名

      docker run --network my_first_net --hostname rabbitmq ms2-1
      

      您不应设置与您的 rabbitmq 容器名称相同的主机名。我运行了相同的步骤并且能够连接

      【讨论】:

        猜你喜欢
        • 2018-10-24
        • 2020-06-07
        • 2017-11-26
        • 2019-05-11
        • 2019-12-13
        • 2020-11-22
        • 2014-09-14
        • 2021-06-08
        相关资源
        最近更新 更多