13.1 RabbitMQ
RabbitMQ是一个支持Advanced Message Queuing Protocol(AMQP)的开源消息队列实现,由Erlang编写,因以高性能、高可用以及可伸缩性出名。它支持多种客户端,如:Java、Python、PHP、.NET、Ruby、JavaScript等。它主要用于在分布式系统中存储和转发消息,方便组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP架构中有两个主要组件:Exchange和Queue,两者都在服务端,又称Broker,由RabbitMQ实现的。客户端通常有Producer和Consumer两种类型,如图13-1所示。
在使用RabbitMQ过程中需要注意的是,它将数据存储在Node中,默认情况为hostname。因此在使用docker run指令运行容器的时候,应该通过-h/—hostname参数指定每一个rabbitmq daemon运行的主机名。这样就可以轻松地管理和维护数据了:
- $ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3
- 3f28f6290e05375363ee661151170d37fbc89ada004c3235f02997b711b4cb2b

图13-1 AMQP架构
用户使用rabbitmqctl工具进行远程管理,或跨容器管理的时候,会需要设置持久化的cookie。如果需要了解关于Erlang Cookie的信息,可以参见RabbitMQ官网的集群指南。
这里可以使用RABBITMQ_ERLANG_COOKIE参数进行设置:
- $ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_ERLANG_
- COOKIE='secret cookie here' rabbitmq:3
使用cookie连接至一个独立的实例:
- $ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE=
- 'secret cookie here' rabbitmq:3 bash
- root@f2a2d3d27c75:/# rabbitmqctl -n rabbit@my-rabbit list_users
- Listing users ...
- guest [administrator]
同样,用户也可以使用RABBITMQ_NODENAME简化指令:
- $ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE=
- 'secret cookie here' -e RABBITMQ_NODENAME=rabbit@my-rabbit rabbitmq:3 bash
- root@f2a2d3d27c75:/# rabbitmqctl list_users
- Listing users ...
- guest [administrator]
默认情况下,rabbitmq会安装并启动一些管控插件,如rabbitmq:3-management。通常可以通过默认用户名密码以及标准管控端口15672访问这些插件:
- $ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3-management
用户可以通过浏览器访问http://container-ip:15672,如果需要从宿主机外访问,则使用8080端口:
- $ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:
- 3-management
如果需要修改默认用户名与密码(guest:guest),则可以使用RABBITMQ_DEFAULT_USER和RABBITMQ_DEFAULT_PASS环境变量:
- $ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_
- USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management
如果需要修改默认vhost,可以修改RABBITMQ_DEFAULT_VHOST环境变量:
- $ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_
- VHOST=my_vhost rabbitmq:3-management
然后连接至daemon:
- $ docker run --name some-app --link some-rabbit:rabbit -d application-that-uses-
- rabbitmq
用户也可以访问官方镜像仓库,并对Dockerfile进行更多定制。
