【问题标题】:Docker/Boot2Docker/Fig + RabbitMQ host issue; pika.exceptions.AMQPConnectionError: [Errno -2] Name or service not knownDocker/Boot2Docker/Fig + RabbitMQ 主机问题; pika.exceptions.AMQPConnectionError: [Errno -2] 名称或服务未知
【发布时间】:2015-03-26 16:57:29
【问题描述】:

我刚开始学习 RabbitMQ 和 Docker/Fig。我有一个非常简单的示例,其中包含 3 个无花果容器,每个用于 Rabbit 服务器、生产者和消费者。在/etc/hosts 中,我将boot2docker ip 设置为dockerhost 的别名:

/etc/hosts
192.168.59.103    dockerhost

当我fig up -d RabbitMQ 服务器时,一切正常;我可以打开浏览器并转到 dockerhost:PORTNUM 并访问 RabbitMQ 控制面板。

在我的 RabbitMQ 生产者中,我已将连接主机设置为 dockerhost

/producer.py
connection = pika.BlockingConnection(pika.ConnectionParameters(
    host=config['RabbitMQ']['hostname'],
    ...
    ))

我的配置文件如下所示:

/config.ini
[RabbitMQ]
hostname    = dockerhost

但是,当我在 RabbitMQ 生产者上运行 fig up -d 时,我收到一个连接错误:

rabbitworker_1 |   File "/usr/local/lib/python3.4/site-packages/pika/adapters/blocking_connection.py", line 301, in _adapter_connect
rabbitworker_1 |     raise exceptions.AMQPConnectionError(error)
rabbitworker_1 | pika.exceptions.AMQPConnectionError: [Errno -2] Name or service not known`

我可以通过在 RabbitMQ 主机名中直接输入 boot2docker ip 而不是 dockerhost 别名来让 RabbitMQ 生产者正常工作:

/config.ini
[RabbitMQ]
hostname    = 192.168.59.103

上述更改使一切正常运行。

我的问题是如何通过使用hostname = dockerhost 而不是输入实际 IP 地址来让 RabbitMQ 生产者工作?

更新

这是我的 RabbitMQ 服务器 fig.ymldockerhost 一起使用:

rabbit:
    image: mikaelhg/docker-rabbitmq
    ports:
     - "5672:5672"
     - "15672:15672"

这是我的 RabbitMQ 生产者 fig.ymlDockerfile 不适用于 dockerhost

/fig.yml
rabbitworker:
    build: .
    volumes:
     - .:/opt/worker
     - ./log:/var/log
    command: supervisord -n

/Dockerfile
FROM python3-rabbit-producer

COPY . /opt/worker
WORKDIR /opt/worker

RUN pip3.4 install -r requirements.txt

CMD ["supervisord", "-n"]

【问题讨论】:

  • 正常情况下它不适用于dockerhost,因为您的容器无权访问您的主机文件。请提供您的fig.yml 文件好吗?
  • @CélineAussourd 我已经用与dockerhost 一起使用的RabbitMQ 服务器的fig.yml 以及不适用于@987654349 的RabbitMQ 生产者的fig.ymlDockerhost 更新了我的问题@。如果用dockerhost不工作是正常的,为什么RabbitMQ服务器容器可以和dockerhost一起工作?
  • 它在您的浏览器中运行,对吧?如果您进入您的容器并尝试访问 dockerhost:PORTNUM 我预计它将无法工作,因为容器无法解析dockerhost
  • 顺便说一句,如果你使用卷为/opt/worker,那么你不需要在你的Dockerfile中复制/opt/worker(除非我错过了什么)

标签: docker rabbitmq boot2docker fig


【解决方案1】:

当您使用 fig 时,我建议您通过创建 1 个唯一的 fig.yml 文件并链接容器以便它们进行通信来使用 fig 的真正力量。所以你可以编辑你当前的 RabbitMQ 生产者fig.yml,这样你会得到:

rabbit:
    image: mikaelhg/docker-rabbitmq
    ports:
     - "5672:5672"
     - "15672:15672”

rabbitworker:
    build: .
    volumes:
     - .:/opt/worker
     - ./log:/var/log
    links: 
       - rabbit
    command: supervisord -n

然后编辑你的配置文件得到:

/config.ini
[RabbitMQ]
hostname    = rabbit

如果你真的想保持你的配置文件原样并使用dockerhost,那么你可以通过这种方式编辑fig.yml中的rabbitworker链接:

    links: 
       - rabbit:dockerhost

但您必须注意dockerhost 将解析为您的 RabbitMQ 服务器容器 IP(而不是您的主机 IP)。

【讨论】:

  • 谢谢席琳。您的回答提供了一些明确性。小问题:有没有办法设置容器的主机文件?比如我可以通过boot2docker ssh进入boot2docker shell。然后我可以sudo vi /etc/hosts 打开容器的主机文件。我想我可以添加:192.168.59.103 dockerhost,这也可以解决我的问题,但这不起作用,你知道为什么这种方法不起作用吗?
  • 如果在/etc/hosts文件中添加该行并且不退出容器,我不知道为什么这不起作用。显然,您可以在运行容器时使用选项--add-host/etc/hosts 添加一行:docs.docker.com/reference/run/#network-settings
猜你喜欢
  • 2013-12-14
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2021-11-05
  • 2013-07-01
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多