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://: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://: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 日誌記錄驅動程式)以在大型部署中獲得更好的可觀察性。

廣告