docker - Docker/Boot2Docker/Fig + RabbitMQ主机问题;pika.exceptions.AMQPConnectionError: [Errno 2 ] 名称或者服务未知

我刚刚开始学习RabbitMQ和Docker/Fig。我有一个非常简单的例子,有3个 fig 容器,分别用于Rabbit Server,Producer和Consumer。在/etc/hosts中,我将boot2docker ip设置为dockerhost的别名:


/etc/hosts
192.168.59.103 dockerhost

当我fig up -d服务器的时候,一切都正常工作; 我可以打开浏览器,进入dockerhost:PORTNUM,并且访问RabbitMQ 。

在我的RabbitMQ producer中,我将连接主机设置为dockerhost


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

我的配置文件如下所示:


/config.ini
[RabbitMQ]
hostname = dockerhost

但是,在RabbitMQ producer上运行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`

通过将boot2docker ip直接输入RabbitMQ主机名而不是dockerhost别名,我可以让RabbitMQ正常工作:


/config.ini
[RabbitMQ]
hostname = 192.168.59.103

上述变化使一切正常。

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

更新

以下是与dockerhost一起工作的RabbitMQ服务器fig.yml


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

下面是我的RabbitMQ producer 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"]

时间:

当你使用fig时,我建议你通过创建一个独特的fig.yml文件来使用fig,并链接容器让它们进行通信。因此,你可以编辑你当前的RabbitMQ producer 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,那么可以通过以下方式编辑rabbitworker链接:


 links: 
 - rabbit:dockerhost

但是,你必须将dockerhost将解析为你的RabbitMQ服务器容器IP (而不是你的主机ip )。

...