Apr April 2015

用Docker镜像来学习RabbitMQ和Python客户端使用例子

介绍

这篇博客介绍如何使用官方的docker镜像来学习RabbitMQ和Python客户端的使用,中间碰到问题也比较容易寻求帮助和定位,非常方便。

我的环境是Windows 7下的boot2docker 1.5版本。

RabbitMQ 服务器

启动RabbitMQ docker容器,这里使用rabbitmq:3-management,如果用rabbitmq:3就没有管理界面(15672端口),不适合初学者。

docker run -d -e RABBITMQ_NODENAME=rabbit --name rabbit -p 8080:15672 rabbitmq:3-management    

打开浏览器,查看界面

rabbitmq-1

RabbitMQ Python客户端

例子都来自rabbit python的入门,这里不讲解了。

启动Python docker容器,同docker的name/link方式,访问rabbit容器通信

docker run -v $PWD:/code -w /code --link=rabbit:rabbit -it python:2 bash

发送端

安装 pika库,和运行send.py的例子(源程序在我的docker主机上编辑,共享进去)。

root@7848479ed0d2:/code# pip install pika
root@7848479ed0d2:/code# ./send.py
 [x] Sent 'Hello World!'

你可以在管理界面上看到消息已收到。

源程序来自rabbit python的入门,RabbitMQ主机名从localhost改为rabbit

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='rabbit'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()

接受端

你可以用docker exec命令进入发送端的python容器,也可以再启动一个。

运行receive.py,前面的消息就收到了。

root@7848479ed0d2:/code# ./receive.py
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received 'Hello World!'

源程序来自rabbit python的入门

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='rabbit'))
channel = connection.channel()

channel.queue_declare(queue='hello')

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

def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

channel.start_consuming()

碰到的问题

收不到消息

一开始receive.py程序运行后,收不到消息(但连接正常 accepting AMQP connection ...)。

$ docker logs -f rabbit

=INFO REPORT==== 31-Mar-2015::16:59:38 ===
Server startup complete; 0 plugins started.

=INFO REPORT==== 31-Mar-2015::17:00:57 ===
accepting AMQP connection <0.311.0> (172.17.0.17:35606 -> 172.17.0.16:5672)

以为这个程序错了,后来启动admin管理界面,在界面上发送消息后,立马就收到了。

发送不了消息

send.py程序运行后,正常退出,一开始以为是发送成功了,后来发现接受正确后,继续研究。

突然发现界面上面有红色的,提示空间不够

rabbitmq-2

再检查,果然是boot2docker虚拟机中的空间又不够了,而且也发现在rabbit python的入门中最后提到了这一点

rabbitmq-3

总结

用docker特别方便学东西,容易架设。而且很容易重现,当我发现其他人运行正确后,我能确保不是docker镜像和网络通信的问题。

参考

  • https://www.rabbitmq.com/tutorials/tutorial-one-python.html
  • https://registry.hub.docker.com/_/rabbitmq/
blog comments powered by Disqus
comments powered by Disqus