【问题标题】:How to communicate two own Docker container by rabbitmq如何通过 rabbitmq 通信两个自己的 Docker 容器
【发布时间】:2020-01-15 21:23:24
【问题描述】:

我正在构建一个非常简单的项目。两个python脚本; producer.pyconsumer.py。生产者发送随机数,消费者打印。它在没有 docker 的情况下工作。

我为消费者和生产者构建了两个 docker 映像,并希望通过 docker-compose “通信”它,当我运行 docker-compose 文件时,我看到了这个:

emit_log_1  | Traceback (most recent call last):
emit_log_1  |   File "emit_log.py", line 7, in <module>
emit_log_1  |     connection = pika.BlockingConnection(
emit_log_1  |   File "/usr/local/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 359, in __init__
emit_log_1  |     self._impl = self._create_connection(parameters, _impl_class)
emit_log_1  |   File "/usr/local/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 450, in _create_connection
emit_log_1  |     raise self._reap_last_connection_workflow_error(error)
emit_log_1  | pika.exceptions.AMQPConnectionError
1_emit_log_1 exited with code 1

和receive完全一样:

Docker-compose.yml:

version: '3'

services:
 rabbitmq:
  image: rabbitmq:3-management
  ports:
   - "5672:5672"
   - "15672:15672"


 emit_log:
  build:
   context: .
   dockerfile: Dockerfile.emit_log
  ports:
   - "8081:8081"
   - "8001:8001"
  links:
   - rabbitmq


 receive:
  build:
   context: .
   dockerfile: Dockerfile.receive
  ports:
   - "8082:8082"
   - "8002:8002"
  links:
   - rabbitmq

【问题讨论】:

  • 当您在本地机器上运行时,您可能会连接到本地主机上的 RMQ,例如amqp://admin:admin@localhost:5672,在 docker 中运行时(并通过您的 docker-compose 脚本运行),生产者、消费者和 RMQ 都在不同的容器中,因此您将无法使用 localhost。如果你执行到生产者或消费者;你能ping通rabbitmq吗?仅供参考,同一个 docker 网络中的 docker 容器可以使用容器名称进行 DNS 解析,例如生产者和消费者中的连接字符串为amqp://admin:admin@rabbitmq:5672

标签: docker docker-compose rabbitmq


【解决方案1】:

我怀疑您可能正在尝试从您的发射服务中连接到“localhost”,这可能指向容器 localhost 本身。默认情况下,Compose 会将容器联网。如果您的连接字符串之前位于 localhost,则需要更新它们以指向所需的容器。

例如,如果您之前从您的生产者或消费者连接到 localhost:5672,并且它们在您的 docker compose 中与您的 rabbitmq 实例联网,您将需要使用 rabbitmq:5672 进行连接

在 Compose 中查看有关网络的详细信息: https://docs.docker.com/compose/networking/

【讨论】:

  • 是的,这是真的。我使用了 pika.ConnectionParameters(host='localhost'))。但我不知道如何正确地做到这一点。
  • 如果您尝试使用 pika.ConnectionParameters(host="localhost") 连接到在单独容器中运行的 RabbitMQ 实例,您需要提供该容器的主机名。由于您使用的是 compose,因此它将是服务的名称。所以,pika.ConnectionParameters(host="rabbitmq"),基于您的撰写文件。 localhost 在容器化之前就已经工作了,因为这三个服务可能都在同一主机上运行。
  • 非常感谢。我明白了。但我仍然无法解决这个问题。我尝试了 host="rabbitmq"、rabbitmq:3-management 等。但我仍然有同样的错误。
猜你喜欢
  • 2019-05-21
  • 2020-10-10
  • 2017-12-04
  • 2021-08-09
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多