Docker - 设置 RabbitMQ



RabbitMQ 是一款流行的开源消息代理,它可以帮助应用程序的不同组件相互通信。在分布式系统中,当多个服务之间需要异步通信时,它特别有用。

在像登台或生产这样的多种环境中部署 RabbitMQ 时,网络设置、系统设置和依赖项管理可能难以配置。Docker 通过提供易于部署和控制的一致环境来简化此过程。

在本章中,我们将逐步了解如何使用 Docker 将 RabbitMQ 容器化。

RabbitMQ 容器化的先决条件

在使用 Docker 将 RabbitMQ 容器化之前,请确保您具备以下条件:

  • Docker 基础知识 - 如果你熟悉 Docker 镜像、容器和 Docker 文件,那么理解起来会更容易。
  • RabbitMQ 基础知识 - 建议您对消息代理以及 RabbitMQ 在异步通信中的作用有一个基本的了解。
  • Docker 设置完成 - 确保您的计算机已安装并运行 Docker。它可以在 Docker 官方网站上下载。
  • 文本编辑器 - 用于修改文件,可以使用 Notepad++、VSCode 或 Sublime Text 等文本编辑器。
  • 命令行界面 (CLI) - 您应该能够舒适地使用命令行界面来发出命令。

设置 RabbitMQ 项目

首先,我们将创建一个简单的本地 RabbitMQ 项目。在验证一切按预期工作后,我们将继续将 RabbitMQ 容器化。

步骤 1:建立项目目录

请务必首先为您的 RabbitMQ 项目创建一个目录,以保持所有文件井井有条。Docker 相关组件和配置文件将位于此文件夹中。

$ mkdir rabbitmq-docker
$ cd rabbitmq-docker

步骤 2:为 RabbitMQ 建立配置文件

可以使用 rabbitmq.conf 文件自定义 RabbitMQ 设置。在项目目录中为您的配置文件创建一个文件夹以进行自定义设置:

$ mkdir config
$ touch config/rabbitmq.conf
Establish configuration file for RabbitMQ

现在,您可以使用文本编辑器打开并添加以下设置作为 rabbitmq.conf 文件的起点:

# Enable RabbitMQ Management Plugin
management.tcp.port = 15672
management.load_definitions = /config/definitions.json

此配置文件指示将从哪里加载自定义定义以及管理插件将在哪个端口 (15672) 上可用。

步骤 3:添加 RabbitMQ 定义

您可以使用 JSON 文件在 RabbitMQ 中预定义用户、队列和交换机。在 config 目录中,创建以下文件:

$ touch config/definitions.json

您可以在文件中包含以下定义:

{
   "vhosts": [{"name": "/"}],
   "users": [
      {
         "name": "admin",
         "password_hash": "hP5sd+9eVPX4gAmx3YJuzCl+FBI=",
         "hashing_algorithm": "rabbit_password_hashing_sha256",
         "tags": "administrator"
      }
   ],
   "permissions": [
      {
         "user": "admin",
         "vhost": "/",
         "configure": ".*",
         "write": ".*",
         "read": ".*"
      }
   ]
}
Add RabbitMQ Definitions

这将创建一个具有完全访问权限的 admin 用户和一个默认虚拟主机 (/)。

在本地运行 RabbitMQ

让我们首先在本地运行 RabbitMQ,以确保在将其容器化之前所有配置都正确。

步骤 1:在本地安装 RabbitMQ 服务器

在您的计算机上本地设置 RabbitMQ。安装命令取决于操作系统。

对于 Ubuntu / Debian -

$ sudo apt-get update
$ sudo apt-get install rabbitmq-server

对于 macOS 上的 Homebrew -

$ brew install rabbitmq
Install RabbitMQ Server Locally

步骤 2:启动 RabbitMQ

安装完成后,我们可以使用以下命令启动 RabbitMQ:

$ sudo systemctl start rabbitmq-server

对于 macOS,您可以使用:

$ brew services start rabbitmq
Launch RabbitMQ

步骤 3:启用管理插件

RabbitMQ 的管理插件提供了一个用户友好的 Web 界面来跟踪和控制 RabbitMQ 节点。您可以使用以下命令启用它。

$ sudo rabbitmq-plugins enable rabbitmq_management
Turn on Management Plugin

步骤 4:访问 RabbitMQ 管理仪表板

RabbitMQ 和管理插件启动后,启动浏览器并转到:

https://127.0.0.1:15672
Access RabbitMQ Management Dashboard

您可以使用默认凭据(用户名和密码均为 guest),但请记住通过定义文件或 Web 界面更新它们。

创建 Dockerfile

现在 RabbitMQ 在本地工作了,让我们继续将其容器化。为此,我们需要创建一个 Dockerfile,它将创建一个包含 RabbitMQ 及其依赖项的 Docker 镜像。

步骤 1:创建一个 Dockerfile

在项目目录中创建一个名为 Dockerfile 的新文件:

$ touch Dockerfile
RabbitMQ is working locally

步骤 2:定义基础镜像

在 Dockerfile 中,我们将使用 RabbitMQ 基础镜像。您可以使用 Docker Hub 上提供的官方 RabbitMQ 镜像。

FROM rabbitmq:3-management

步骤 3:复制配置文件

RabbitMQ 预计配置文件位于 /etc/rabbitmq/ 中,定义文件位于自定义目录中。

COPY ./config/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
COPY ./config/definitions.json /etc/rabbitmq/definitions.json

为了与外部世界通信,您必须将 rabbitmq.conf 和 definitions.json 文件复制到容器内的相应目录中。

步骤 4:公开必要的端口

为了与 RabbitMQ 通信,您还需要公开以下端口:

  • 5672 - 用于 AMQP 连接。
  • 15672 - 用于管理仪表板。

我们可以在您的 Dockerfile 中按如下方式指定这些端口:

EXPOSE 5672 15672

步骤 5:最终的 Dockerfile

# Use the official RabbitMQ image with the management plugin enabled
FROM rabbitmq:3-management
 
# Copy configuration and definition files
COPY ./config/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
COPY ./config/definitions.json /etc/rabbitmq/definitions.json
 
# Expose RabbitMQ and management ports
EXPOSE 5672 15672

构建 RabbitMQ Docker 镜像

现在 Dockerfile 已准备就绪,我们可以构建 Docker 镜像了。

步骤 1:构建镜像

打开终端,导航到您的项目目录,并键入以下命令:

$ docker build -t my-rabbitmq-image 
Building RabbitMQ Docker Image

当我们使用 docker build 命令时,Docker 会根据 Dockerfile 构建一个镜像。我们可以使用 -t 选项标记镜像,并且构建上下文由当前目录 (.) 指示。

步骤 2:验证镜像构建

列出您计算机上的每个 Docker 镜像将允许您确认镜像是否已成功构建:

$ docker images
Validate Rabbitmq Docker Image Build

运行 RabbitMQ Docker 容器

构建 Docker 镜像后,让我们在 Docker 容器中启动 RabbitMQ。

步骤 1:启动容器

我们可以使用 Docker run 命令从我们刚刚创建的镜像启动容器。

$ docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbitmq-container my-rabbitmq-image

上述命令执行以下操作

  • -d - 容器的独立模式(后台执行)。
  • -p 5672:5672 - 将 RabbitMQ 的 5672 端口路由到您的本地计算机。
  • -p 15672:15672 - 映射管理插件的 15672 端口。
  • --name my-rabbitmq-container - 为容器分配一个名称。
  • my-rabbitmq-image - 指定要运行的镜像。
Running RabbitMQ Docker Container

步骤 2:访问 RabbitMQ 仪表板

容器运行后,您可以通过导航到以下位置访问 RabbitMQ 的 Web 界面:

https://127.0.0.1:15672

结论

在本章中,我们学习了如何使用 Docker 将 RabbitMQ 容器化。使用 Docker,我们可以在一个一致的、隔离的环境中运行 RabbitMQ,该环境确保开发和生产之间的可移植性。

使用 Docker,可以轻松地扩展 RabbitMQ 或将其集成到更大的容器化应用程序堆栈中。

使用 Docker 容器化 RabbitMQ 的常见问题

在本节中,我们收集了一些关于如何使用 Docker 容器化 RabbitMQ 的常见问题,以及它们的答案:

1. 如何在 Docker 中配置 RabbitMQ 以实现高可用性?

可以通过在 Docker 中设置 RabbitMQ 节点的集群来配置 RabbitMQ 以实现高可用性。使用 Kubernetes 或 Docker Compose 来定义多个 RabbitMQ 容器,每个节点充当集群的成员。

利用 RabbitMQ 附带的队列镜像和集群功能,确保消息在节点之间复制,以实现容错和高可用性。

2. 如何监视 Docker 容器中的 RabbitMQ?

要使用其基于 Web 的界面监视 RabbitMQ,请启用 RabbitMQ 管理插件。还可以通过公开必要的端口并与监视程序交互来配置 Prometheus 或其他监视工具来跟踪 RabbitMQ 指标。

建议集中日志记录(使用 Docker 日志记录驱动程序)以在大型部署中获得更好的可观察性。

广告