使用默认设置和访问UI配置RabbitMQ管理docker映像

时间:2019-12-05 10:33:49

标签: docker docker-compose rabbitmq

背景

我需要使用RabbitMQ服务和我的应用程序设置一个docker-compose。此RabbitMQ服务需要具备三项才能正常工作:

  • 具有完全权限的名为“ user1”的用户
  • 名为“ vhost1”的虚拟主机
  • 在“ vhost1”内部,我需要一个名为“ Pizza”的交易所

我们尝试了什么

为此,我们尝试在我们的项目中创建一个名为rabbitmq的文件夹,其中包含以下文件:

definitions.json

{
    "rabbit_version": "3.6.6",
    "users": [
     {
      "name": "user1",
      "password_hash": "pass1",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
     }
    ],
    "vhosts": [
     {
      "name": "\/vhost1"
     }
    ],
    "permissions": [
     {
      "user": "user1",
      "vhost": "\/vhost1",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
     }
    ],
    "parameters": [],
    "policies": [],
    "queues": [],
    "exchanges": [],
    "bindings": []
   }

rabbitmq.conf

loopback_users.guest = false
listeners.tcp.default = 5672

我们正在使用volumes中的docker-compose命令并使用以下文件来安装此文件夹:

version: '3'
services:
  rabbit:
    image: rabbitmq:management
    ports:
      - "8080:15672"
      - "5672:5672"
    volumes: 
      - ${PWD}/rabbitmq:/etc/rabbitmq

问题

我们目前面临两个问题:

  1. 我们创建名为“ Pizza”的交易所。
  2. 即使我们在localhost:8080文件中指定了该端口的映射,我们也无法通过docker-compose访问RabbitMQ管理UI。

问题

  1. 我们如何在defininitions.json文件中定义虚拟主机的交换? (我在哪里可以读到它?)
  2. 为什么我们不能访问UI?我们在做什么错了?

1 个答案:

答案 0 :(得分:0)

解决方案

1。交换创建

第一个问题很容易解决。未创建交换的原因是因为"exchanges"文件中的definitions.json字段为空。要解决此问题,您需要向该列表添加交换对象:

"exchanges": [
    {
      "name": "Pizza",
      "vhost": "\/vhost1",
      "type": "fanout",
      "durable": true,
      "auto_delete": false,
      "internal": false,
      "arguments": {}
    }
  ],

可以在此博客文章中了解更多有关此的信息:

https://devops.datenkollektiv.de/creating-a-custom-rabbitmq-container-with-preconfigured-queues.html

2。访问管理界面

此处配置存在几个问题。首先,我用本地文件夹中的内容粉碎了容器中原始/etc/rabbitmq文件夹的内容。这不是故意的,可以在这里找到解决此问题的方法:

Unknown variable "management.load_definitions" in rabbitmq rabbit.conf file

第二个问题在rabbitmq.conf文件中。我们缺少告知应用程序加载定义文件的字段。以下是rabbitmq.conf文件的正确版本:

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

第三个(也是最后一个)问题是用户密码,特别是password_hash字段,该字段需要遵循特定的算法并以特定格式进行编码。有关此内容的更多信息,请参阅RabbitMQ的官方文档:

https://www.rabbitmq.com/passwords.html

要跳过处理盐分,哈希和编码的烦恼,如果您只想像我们想要的那样测试用于集成目的的设置,则只需使用示例中提供的密码test12

"users": [
     {
      "name": "user1",
      "password_hash": "kI3GCqW5JLMJa4iX1lo7X4D6XbYqlLgxIs30+P6tENUV2POR",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
     }
    ]

但是,对于您而言,重要的是要知道如何生成RabbitMQ将接受的用户密码,这是一个bash脚本,由同事的流血和泪水创建:

#!/bin/bash
PWD_HEX=$(echo -n $1 | xxd -p)
SALT="908D C60A" 
HEX="$SALT $PWD_HEX"
SHA256=$(echo -n $HEX | xxd -r -p | sha256sum)
# This is thw pwd to be inserted on your rabbit load_definitions file
echo "908D C60A $SHA256" | xxd -r -p | base64 

用法:./my_script userpass1

结论

通过所有这些方式,人们应该能够通过docker映像创建用户,虚拟主机和交换,同时还可以访问管理UI。