Когда для проекта мне понадобилось докеризовать rabbitmq, то я подумал, что ничего проще и быть не может и сейчас мы все это на изях сделаем. Но, как обычно, все оказалось немного сложнее в реальной жизни. Так-как я знатно походил по граблям, то пожалуй стоит немного задокументировать, где эти грабли аккуратно разложены.
Запуск RabbitMQ в Docker
Пример описания сервиса
Помимо рекомендованных /var/lib/rabbitmq/ и /var/log/rabbitmq/ я бы посоветовал еще вынести во внешние тома /etc/rabbitmq и обязательно прописывать hostname или в противном случае база данных узла кролика будет инициализироваться с рандомным ID (на baremetal я такого не ловил, но вот с контейнерами получилось очень интересно).
version: "3.9"
services:
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: rabbitmq
hostname: rabbitmq
ports:
- 5672:5672
- 15672:15672
volumes:
- ./rabbitmq/data/:/var/lib/rabbitmq/
- ./rabbitmq/log/:/var/log/rabbitmq
- ./rabbitmq/etc/:/etc/rabbitmq
Файлы в /etc/
conf.d/10-defaults.conf
loopback_users.guest = false
log.console = true
enabled_plugins
[rabbitmq_management,rabbitmq_prometheus]
rabbitmq.conf
auth_mechanisms.1 = PLAIN
auth_mechanisms.2 = AMQPLAIN
loopback_users.guest = false
listeners.tcp.default = 5672
default_pass = admin
default_user = admin
hipe_compile = false
#management.listener.port = 15672
#management.listener.ssl = false
management.tcp.port = 15672
management.load_definitions = /etc/rabbitmq/definitions.json
definitions.json
{
"users": [
{
"name": "admin",
"password": "admin",
"tags": "administrator"
}
],
"vhosts": [
{
"name": "/"
}
],
"policies": [
{
"vhost": "/",
"name": "ha",
"pattern": "",
"apply-to": "all",
"definition": {
"ha-mode": "all",
"ha-sync-batch-size": 256,
"ha-sync-mode": "automatic"
},
"priority": 0
}
],
"permissions": [
{
"user": "admin",
"vhost": "/",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"queues": [
{
"name": "job-import.triggered.queue",
"vhost": "/",
"durable": true,
"auto_delete": false,
"arguments": {}
}
],
"exchanges": [
{
"name": "lob-proj-dx",
"vhost": "/",
"type": "direct",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {}
}
],
"bindings": [
{
"source": "lob-proj-dx",
"vhost": "/",
"destination": "job-import.triggered.queue",
"destination_type": "queue",
"routing_key": "job-import.event.triggered",
"arguments": {}
}
]
}
Теперь данные сохраняются локально в не зависимости от операций с контейнерами Rabbitmq.
Доступы
Доступ к web-интерфейсу: http://127.0.0.1:15672
Логин-пароль: admin/admin
Примечание
Обязательно указываем hostmane в docker-compose.yml или в противном случае база данных rabbitmq будет пересоздаваться заново.
Шпаргалка по работе в консоли RabbitMQ
Кластер и очереди
Проверка статуса кластера
# rabbitmqctl cluster_status
Авторизоваться от имени другого пользователя
# rabbitmqctl authenticate_user USER PASSWORD
Список всех очередей на всех виртуальных хостах
# for i in $(rabbitmqctl list_vhosts); do echo vhost: $i && rabbitmqctl list_queues -p $i; done
Смена типа узла с disk на ram
# rabbitmqctl change_cluster_node_type ram
Установка плагинов
# rabbitmq-plugins enable amqp_client rabbitmq_consistent_hash_exchange