Skip to content

快速参考

  • 由……维护
    Docker 社区

  • 何处获取帮助:
    Docker 社区 Slack、服务器故障、Unix & Linux 或 Stack Overflow

支持的标签及相应的 Dockerfile 链接

快速参考(续)

什么是 RabbitMQ?

RabbitMQ 是开源消息代理软件(有时称为面向消息的中间件),它实现了高级消息队列协议(AMQP)。RabbitMQ 服务器是用 Erlang 编程语言编写的,并基于开放电信平台框架构建,用于集群和故障转移。与代理进行交互的客户端库适用于所有主要编程语言。

wikipedia.org/wiki/RabbitMQ

logo

如何使用此图像

运行守护进程

关于 RabbitMQ 需要注意的重要一点是,它根据所谓的“节点名称”存储数据,默认情况下为主机名。这对于在 Docker 中的使用意味着我们应该为每个守护进程明确指定 -h / --hostname ,以便我们不会得到随机主机名,并且可以跟踪我们的数据:

$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3

这将启动一个在默认端口 5672 上监听的 RabbitMQ 容器。如果你给它一分钟,然后执行 docker logs some-rabbit ,你将在输出中看到类似于以下的块:

=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 成为一个卷。

环境变量

有关 RabbitMQ 自身支持的环境变量列表,请参阅 rabbitmq.com/configure 的“环境变量”部分。

警告:自 RabbitMQ 3.9 起,下面列出的所有特定于 Docker 的变量都已弃用且不再使用。请改用配置文件;访问 rabbitmq.com/configure 以了解有关配置文件的更多信息。作为起点,3.8 版本的镜像将打印出它根据提供的环境变量生成的配置文件。

# 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_WATERMARK

设置默认用户和密码

如果您希望更改 guest / guest 的默认用户名和密码,可以使用 RABBITMQ_DEFAULT_USERRABBITMQ_DEFAULT_PASS 环境变量来实现。这些变量之前在特定于 Docker 的入口点 shell 脚本中可用,但现在直接在 RabbitMQ 中可用。

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

然后,您可以在浏览器中访问 http://localhost:8080http://host-ip:8080 ,并使用 user / password 来获得对管理控制台的访问权限

设置默认虚拟主机

如果您希望更改默认虚拟主机,您可以使用 RABBITMQ_DEFAULT_VHOST 环境变量来实现:

$ docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management

内存限制

RabbitMQ 包含明确跟踪和管理内存使用情况的功能,因此需要知晓 cgroup 施加的限制(例如 docker run --memory=.. )。

对此的上游配置设置在 rabbitmq.conf 中的 vm_memory_high_watermark ,并且在文档中的“内存警报”下进行了描述。如果您通过 vm_memory_high_watermark.relative 设置相对限制,那么 RabbitMQ 将根据主机的总内存而不是容器运行时设置的限制来计算其限制。

有关 Cookie 及其必要性的更多信息,请参阅 RabbitMQ“集群指南”。要设置一致的 Cookie(对于集群特别有用,对于通过 rabbitmqctl 进行的远程/跨容器管理也很有用),请提供一个 Cookie 文件( /var/lib/rabbitmq/.erlang.cookie 的默认位置)。

例如,你可以通过文件(例如使用 Docker Secrets)提供 cookie:

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 文档。)

管理插件

随管理插件一起提供且默认安装并启用的有第二组标签,它在标准管理端口 15672 上可用,默认用户名和密码为 guest / guest

$ 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

然后你可以在浏览器中访问 http://localhost:8080http://host-ip:8080

启用插件

创建一个 Dockerfile 将在运行时启用它们。要查看图像上存在的插件的完整列表 rabbitmq-plugins list

FROM rabbitmq:3.8-management
RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp

你也可以在 /etc/rabbitmq/enabled_plugins 挂载一个文件,其内容为以句号结尾的原子的 Erlang 列表。

示例 enabled_plugins

[rabbitmq_federation_management,rabbitmq_management,rabbitmq_mqtt,rabbitmq_stomp].

额外配置

如果需要配置,建议提供一个合适的 /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 之间的空格在环境中翻译时正确地变为逗号。

健康/活性/就绪检查

请参阅“官方镜像”常见问题解答以及关于 docker-library/rabbitmq#174 的讨论(特别是来自 RabbitMQ 上游的 Michael Klishin 的长篇评论),以获取关于此镜像为何没有默认定义的 HEALTHCHECK 的详细解释,以及关于实现您自己的健康/存活/就绪检查的建议。

图像变体

rabbitmq 图像有多种类型,每种都针对特定的用例而设计。

rabbitmq:<version>

这是事实上的镜像。如果你不确定自己的需求是什么,你可能想要使用这个。它被设计既可用作一次性容器(挂载你的源代码并启动容器以启动你的应用程序),也可用作构建其他镜像的基础。

rabbitmq:<version>-alpine

此镜像基于流行的 Alpine Linux 项目,在 alpine 官方镜像中可用。Alpine Linux 比大多数发行版基础镜像小得多(约 5MB),因此通常会生成更精简的镜像。

当尽可能小的最终镜像大小是你主要关心的问题时,这个变体很有用。需要注意的主要警告是,它确实使用 musl libc 而不是 glibc 及其同类,所以软件通常会根据其对 libc 要求/假设的深度而遇到问题。有关可能出现的问题以及使用基于 Alpine 的镜像的一些优缺点比较的更多讨论,请参阅此 Hacker News 评论线程。

为了最小化镜像大小,在基于 Alpine 的镜像中包含额外的相关工具(例如 gitbash )是不常见的。使用此镜像作为基础,在你自己的 Dockerfile 中添加你需要的东西(如果你不熟悉,可查看 alpine 镜像描述以获取如何安装软件包的示例)。

许可证

查看此映像中包含的软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可证信息可能会在 repo-info 存储库的 rabbitmq/ 目录中找到。

对于任何预构建镜像的使用,镜像用户有责任确保对此镜像的任何使用都符合其中包含的所有软件的任何相关许可证。