Docker/Boot2Docker/Fig + RabbitMQ host issue; pika.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
Docker/Boot2Docker/Fig + RabbitMQ host issue; pika.exceptions.AMQPConnectionError: [Errno -2] Name or service not known
我刚刚开始学习 RabbitMQ 和 Docker/Fig。我有一个非常简单的示例,其中包含 3 个无花果容器,分别用于 Rabbit Server、Producer 和 Consumer。在 /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.yml
,它与 dockerhost
:
一起工作
rabbit:
image: mikaelhg/docker-rabbitmq
ports:
- "5672:5672"
- "15672:15672"
这是我的 RabbitMQ 生产者 fig.yml
和 Dockerfile
,它们不适用于 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"]
当您使用 fig 时,我建议您通过创建 1 个独特的 fig.yml
文件和 link 容器来使用 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:
links:
- rabbit:dockerhost
但您必须知道 dockerhost
将解析为您的 RabbitMQ 服务器容器 IP(而不是您的主机 IP)。
我刚刚开始学习 RabbitMQ 和 Docker/Fig。我有一个非常简单的示例,其中包含 3 个无花果容器,分别用于 Rabbit Server、Producer 和 Consumer。在 /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.yml
,它与 dockerhost
:
rabbit:
image: mikaelhg/docker-rabbitmq
ports:
- "5672:5672"
- "15672:15672"
这是我的 RabbitMQ 生产者 fig.yml
和 Dockerfile
,它们不适用于 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"]
当您使用 fig 时,我建议您通过创建 1 个独特的 fig.yml
文件和 link 容器来使用 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:
links:
- rabbit:dockerhost
但您必须知道 dockerhost
将解析为您的 RabbitMQ 服务器容器 IP(而不是您的主机 IP)。