Appearance
Docker 部署 RabbitMQ
关于 RabbitMQ 需要注意的重要事项之一是,它基于所谓的 “节点名称” 存储数据,该名称默认为主机名。这对于在 Docker 中的使用意味着,我们应当为每个守护进程明确指定 -h/--hostname,这样我们就不会得到一个随机的主机名,以便于跟踪我们的数据:
Bash
$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3这将启动一个在默认端口 5672 上监听的 RabbitMQ 容器。如果你等待一分钟,然后执行 docker logs some-rabbit,你会在输出中看到类似于以下的内容块:
Bash
=INFO REPORT==== 6-Jul-2015::20:47:02 ===
node : rabbit@my-rabbit
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash : UoNOcDhfxW9uoZ92wh6BjA==
log : tty
sasl log : tty
database dir : /var/lib/rabbitmq/mnesia/rabbit@my-rabbit请注意这里的 database dir,特别是它在文件存储的末尾添加了我的 “节点名称”。镜像默认将 /var/lib/rabbitmq 的全部内容作为一个卷。
1. 环境变量
有关 RabbitMQ 自身支持的环境变量列表,请参阅 rabbitmq.com/configure 的环境变量部分。
Tip:从 RabbitMQ 3.9 开始,以下列出的所有特定于 Docker 的变量都已弃用,不再使用。请改用配置文件;访问 rabbitmq.com/configure 以了解更多关于配置文件的信息。作为一个起点,3.8 版本的镜像将打印出它根据所提供的环境变量生成的配置文件。
Properties
# Unavailable in 3.9 and up
RABBITMQ_DEFAULT_PASS_FILE
RABBITMQ_DEFAULT_USER_FILE
RABBITMQ_MANAGEMENT_SSL_CACERTFILE
RABBITMQ_MANAGEMENT_SSL_CERTFILE
RABBITMQ_MANAGEMENT_SSL_DEPTH
RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT
RABBITMQ_MANAGEMENT_SSL_KEYFILE
RABBITMQ_MANAGEMENT_SSL_VERIFY
RABBITMQ_SSL_CACERTFILE
RABBITMQ_SSL_CERTFILE
RABBITMQ_SSL_DEPTH
RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT
RABBITMQ_SSL_KEYFILE
RABBITMQ_SSL_VERIFY
RABBITMQ_VM_MEMORY_HIGH_WATERMARK2. 设置默认用户和密码
如果你希望更改默认的用户名 guest 和密码 guest,可以使用 RABBITMQ_DEFAULT_USER 和 RABBITMQ_DEFAULT_PASS 环境变量。这些变量以前在特定于 Docker 的入口点 shell 脚本中可用,但现在可直接在 RabbitMQ 中使用。
Bash
$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management然后你可以在浏览器中访问 http://localhost:15672 或 http://host-ip:15672,并使用 user/password 来访问管理控制台。
3. 设置默认虚拟主机
如果你希望更改默认的虚拟主机,可以使用 RABBITMQ_DEFAULT_VHOST 环境变量:
Bash
$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management4. 内存限制
RabbitMQ 包含显式跟踪和管理内存使用的功能,因此需要知晓 cgroup 施加的限制(例如,docker run --memory=..)。
此功能的上游配置设置是 rabbitmq.conf 中的 vm_memory_high_watermark,并且在文档的 “内存警报” 部分有相关描述。如果你通过 vm_memory_high_watermark.relative 设置一个相对限制,那么 RabbitMQ 将基于主机的总内存而不是容器运行时设置的限制来计算其限制。
5. Erlang Cookie
有关 Cookie 以及它们为何是必需的更多信息,请参阅 RabbitMQ 的 “集群指南”。为了设置一个一致的 Cookie(对于集群特别有用,对于通过 rabbitmqctl 进行的远程/跨容器管理也很有用),请提供一个 Cookie 文件(默认位置为 /var/lib/rabbitmq/.erlang.cookie)。
例如,你可以通过一个文件提供 Cookie(例如使用 Docker Secrets):
Bash
docker service create ... --secret source=my-erlang-cookie,target=/var/lib/rabbitmq/.erlang.cookie ... rabbitmq(请注意,为了让容器中的 Erlang 能够正确读取 Cookie 文件,可能还需要指定 uid=XXX,gid=XXX,mode=0600。更多详细信息请参阅 Docker 的 --secret 文档。)
6. 管理插件
还有一组默认安装并启用了管理插件的标签,可在标准管理端口 15672 上使用,默认用户名和密码为 guest/guest:
Bash
$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3-management你可以通过在浏览器中访问 http://container-ip:15672 来访问它,或者如果你需要从主机外部访问,可以使用端口 8080:
Bash
$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management然后你可以在浏览器中访问 http://localhost:8080 或 http://host-ip:8080。
7. 启用插件
创建一个 Dockerfile 将在运行时启用它们。要查看镜像 rabbitmq-plugins list 上存在的插件的完整列表:
Dockerfile
FROM rabbitmq:3.8-management
RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp你也可以在 /etc/rabbitmq/enabled_plugins 挂载一个文件,其内容是一个以句号结尾的 Erlang 原子列表。
示例 enabled_plugins:
Text
[rabbitmq_federation_management,rabbitmq_management,rabbitmq_mqtt,rabbitmq_stomp].8. 额外配置
如果需要配置,建议提供一个适当的 /etc/rabbitmq/rabbitmq.conf 文件(更多详细信息请参阅 RabbitMQ 文档的 “配置文件” 部分),例如通过绑定挂载、Docker 配置或一个带有 COPY 指令的简短 Dockerfile。
或者,可以使用 RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 环境变量,其语法在 Erlang OTP 设计原则用户指南的第 7.8 节 —— “配置一个应用程序” 中有描述(-ApplName 的适当值是 -rabbit),这种方法在 rabbitmq.conf 中需要对其等效条目进行略微不同的表示。例如,配置 channel_max 可能看起来像 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit channel_max 4007"。其中变量 channel_max 和其值 4007 之间的空格在环境中会正确地转换为逗号。
9. 健康/存活/就绪检查
有关此镜像为何未附带默认 HEALTHCHECK 的详细解释,以及有关实现自己的健康/存活/就绪检查的建议,请参阅官方镜像常见问题解答和关于 docker-library/rabbitmq#174 的讨论(尤其是来自 RabbitMQ 上游的 Michael Klishin 的大段评论)。
10. 综合示例
Note:记得提前在当前目录下创建
data文件夹和conf/rabbitmq.conf文件。
Bash
docker run \
-d \
--hostname my-rabbit \
--name my-rabbit \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=b8ekRBWp60CsefKvWpcn \
-p 5672:5672 \
-p 15672:15672 \
-v ./data:/var/lib/rabbitmq \
-v ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ./plugins:/plugins \
rabbitmq:3.13.7-management1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12