Запуск RabbitMQ в Docker

  • Михаил
  • 12 мин. на прочтение
  • 703
  • 20 Jun 2022
  • 28 Feb 2023

RabbitMQ — это программное обеспечение брокера сообщений с открытым исходным кодом (иногда называемое промежуточным программным обеспечением, ориентированным на сообщения), которое реализует протокол расширенной очереди сообщений (AMQP). Сервер RabbitMQ написан на языке программирования Erlang и построен на платформе Open Telecom Platform для кластеризации и аварийного переключения. Клиентские библиотеки для взаимодействия с брокером доступны для всех основных языков программирования. 

Сегодня мы поговорим о том, как быстро запустить экземпляр RabbitMQ на Docker. Мы рассмотрим два способа запуска образа RabbitMQ Docker в контейнере с помощью команды docker run , и с помощью Docker Compose. Знакомство с этими двумя подходами должно значительно ускорить ваше изучение RabbitMQ..

 

Использование образа RabbitMQ Docker

Реестр контейнеров RabbitMQ ( ссылка ) включает множество образов для разных платформ. В этой статье мы будем использовать образ RabbitMQ с тегом 3-management, который представляет собой образ Docker с установленным и включенным по умолчанию подключаемым модулем управления RabbitMQ.

Предполагая, что рабочий стол Docker установлен, мы используем командуdocker pull rabbitmq:3-managementчтобы получить образ RabbitMQ Docker из DockerHub. После того, как образ Docker загружен и сохранен локально, мы можем запустить контейнер RabbitMQ, используя следующую команду.

docker run --restart=always -d --hostname my-rabbit --name some-rabbit -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 8080:15672 rabbitmq:3-management

или если достаточно проброса порта брокера и web интерфейса.

docker run --restart=always -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 8080:15672 rabbitmq:3-management

Список порты используемых RabbitMQ

4369/tcp, 
5671/tcp,
5672/tcp, 
15671/tcp, 
15672/tcp,
15691-15692/tcp, 
25672/tcp

В приведенной выше команде порт 5672 используется для клиентских подключений RabbitMQ, а порт 15672 — для веб-сайта управления RabbitMQ. Выполнение этой команды может занять минуту. После этого мы можем открыть окно браузера и использовать URL-адрес http://localhost:15672 для посещения веб-сайта управления RabbitMQ. На следующем снимке экрана показана страница входа на веб-сайт.

Мы можем использовать имя пользователя и пароль по умолчанию guest:guestдля входа на веб-сайт. На следующем снимке экрана показана домашняя страница веб-сайта управления.

После входа в систему мы можем исследовать конфигурации RabbitMQ, соединения, каналы, обмены и очереди. Мы также можем настроить новые учетные записи для входа с различными разрешениями.

Очень просто! Теперь у нас есть экземпляр сервера RabbitMQ. Мы можем оставить все нетронутым на веб-сайте управления и начать изучать RabbitMQ, следуя его официальным руководствам .

Настроек RabbitMQ по умолчанию достаточно для учебных целей и некоторых сценариев разработки, но не для большинства реальных проектов. На самом деле нам обычно нужно настроить предопределенные обмены и очереди, а также набор пользователей с их разрешениями. Более того, когда мы обновляем экземпляр RabbitMQ, хорошей идеей будет экспортировать настройки в виде файла и сохранить файл настроек в системе контроля версий.

Далее в этом разделе я сначала покажу вам, как экспортировать настройки RabbitMQ., а затем я покажу вам, как загрузить настройки в контейнер Docker с помощью Docker Compose.

Подготавливаем файл настроек

definitions.json

{
 "rabbit_version": "3.8.3",
 "rabbitmq_version": "3.8.3",
 "users": [
   {
     "name": "user1",
     "password_hash": "sOD2Ib17c/ZW9PiMDKZXvoHlBcWirR0lF/+vTOTOy/t7QSuL",
     "hashing_algorithm": "rabbit_password_hashing_sha256",
     "tags": ""
   },
   {
     "name": "admin",
     "password_hash": "ZdETL0pgo3iUOn/shv9QhBl3T98wMsLu2/5GfIL2fjbpPgMM",
     "hashing_algorithm": "rabbit_password_hashing_sha256",
     "tags": "administrator"
   },
   {
     "name": "user2",
     "password_hash": "xynNraNzjBRvH9LkLRtnvHZW91dRw3EbDUMdxAVkxj9wSBEC",
     "hashing_algorithm": "rabbit_password_hashing_sha256",
     "tags": ""
   }
 ],
 "vhosts": [{ "name": "/" }],
 "permissions": [
   {
     "user": "admin",
     "vhost": "/",
     "configure": ".*",
     "write": ".*",
     "read": ".*"
   },
   {
     "user": "user1",
     "vhost": "/",
     "configure": "",
     "write": "logs*",
     "read": ".*"
   },
   {
     "user": "user2",
     "vhost": "/",
     "configure": "",
     "write": "",
     "read": "mytest"
   }
 ],
 "topic_permissions": [
   {
     "user": "user1",
     "vhost": "/",
     "exchange": "logs",
     "write": ".*",
     "read": ".*"
   },
   {
     "user": "user2",
     "vhost": "/",
     "exchange": "logs",
     "write": "order.*",
     "read": "order.*"
   },
   {
     "user": "admin",
     "vhost": "/",
     "exchange": "",
     "write": ".*",
     "read": ".*"
   }
 ],
 "parameters": [],
 "global_parameters": [
   { "name": "cluster_name", "value": "rabbit@my-rabbit" },
   {
     "name": "internal_cluster_id",
     "value": "rabbitmq-cluster-id-fBlXlF8ZzdFhhNCMG7vY-A"
   }
 ],
 "policies": [],
 "queues": [
   {
     "name": "myRabbitMQ",
     "vhost": "/",
     "durable": true,
     "auto_delete": false,
     "arguments": { "x-queue-type": "classic" }
   }
 ],
 "exchanges": [
   {
     "name": "logs",
     "vhost": "/",
     "type": "topic",
     "durable": true,
     "auto_delete": false,
     "internal": false,
     "arguments": {}
   }
 ],
 "bindings": [
   {
     "source": "logs",
     "vhost": "/",
     "destination": "mytest",
     "destination_type": "queue",
     "routing_key": "order.created",
     "arguments": {}
   }
 ]
}

 

Загрузка/импорт определений брокера с помощью Docker Compose

Несмотря на то, что на StackOverflow есть много ответов, связанных с этой темой, большинство из них устарели. Здесь мы будем использовать последние версии всех зависимостей.

Мы создаем docker-compose.ymlфайл с его содержимым следующим образом.

version: '3.8'
services:
 rabbitmq:
   image: rabbitmq:3-management
   hostname: my-rabbit
   volumes:
     - ./rabbitmq/etc/definitions.json:/etc/rabbitmq/definitions.json
     - ./rabbitmq/etc/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
     - ./rabbitmq/data:/var/lib/rabbitmq/mnesia/rabbit@my-rabbit
     - ./rabbitmq/logs:/var/log/rabbitmq/log
   ports:
     - 5672:5672
     - 15672:15672

В docker-compose.ymlфайле требуется строка 8, если мы хотим, чтобы RabbitMQ загружал наши настроенные определения. Строка 8 монтирует наш definitions.jsonфайл в контейнер Docker.

Строки с 9 по 11 являются необязательными томами, но часто используются. Строки 10 и 11 — это файлы базы данных и журнала сервера RabbitMQ. Мы можем сохранить их на нашем локальном диске на случай, если мы захотим восстановить историю сообщений. Обратите внимание, что эти две локальные папки нужно игнорировать в Git.

Строка 9 относится к rabbitmq.conf файлу. Файл конфигурации rabbitmq.conf позволяет настроить сервер RabbitMQ и плагины. Начиная с RabbitMQ 3.7.0 файл конфигурации имеет sysctlформат . В git-репозитории RabbitMQ есть пример rabbitmq.confфайла , который включает в себя большинство элементов конфигурации, которые мы, возможно, захотим установить, а также документацию по этим настройкам.

В свою демонстрацию я включил минимальный rabbitmq.conf файл, который не является обязательным. В следующем фрагменте кода показано содержимое и формат этого rabbitmq.conf файла.

loopback_users.guest = false
listeners.tcp.default = 5672
management.listener.port = 15672
management.listener.ssl = false
management.load_definitions = /etc/rabbitmq/definitions.json

Хорошо. С помощью docker-compose.yml файла мы можем легко запустить сервер RabbitMQ с нашими настроенными определениями и конфигурациями. Команда, которую мы будем использовать, это docker-compose up. Быстрый способ проверить пользовательские определения — войти на веб-сайт управления в качестве пользователя-администратора ( admin:P@ssw0rd). Мы должны увидеть, что гостевой пользователь больше не существует на сервере RabbitMQ.

С помощью настраиваемых определений мы можем запускать экземпляры RabbitMQ с одинаковым поведением в разных средах и платформах.

RabbitMQ, и Docker — отличные инструменты для нашей разработки. Я надеюсь, что эта статья ускорит ваше изучение RabbitMQ.