【Docker】RabbitMQ 容器化部署

RabbitMQ标准软件基于Bitnami RabbitMQ 构建。当前版本为3.12

你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取

开源地址: https://gitee.com/qingplus/qingcloud-platform

QingHub RabbitMQ部署手册

连接容器

使用Docker 容器网络,应用程序容器可以轻松访问容器内运行的 RabbitMQ 服务器。

连接到同一网络的容器可以使用容器名称作为主机名来相互通信。

使用命令行

在此示例中,我们将创建一个 RabbitMQ 客户端实例,该实例将连接到与客户端在同一 Docker 网络上运行的服务器实例。

第 1 步:创建网络

docker network create app-tier --driver bridge

第 2 步:启动 RabbitMQ 服务器实例

使用命令--network app-tier的参数docker run将 RabbitMQ 容器连接到网络app-tier。

docker run -d --name rabbitmq-server \
    --network app-tier \
    registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq:latest

第 3 步:启动 RabbitMQ 客户端实例

最后,我们创建一个新的容器实例来启动 RabbitMQ 客户端并连接到上一步中创建的服务器:

docker run -it --rm \
    --network app-tier \
    registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq:latest rabbitmqctl -n rabbit@rabbitmq-server status

使用 Docker Compose 文件

如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。但是,我们将显式定义一个bridge名为app-tier的新网络。在此示例中,我们假设您希望从您自己的自定义应用程序映像连接到 RabbitMQ 服务器,该映像在以下代码片段中通过服务名称进行标识myapp。

version: '2'

networks:
  app-tier:
    driver: bridge

services:
  rabbitmq:
    image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq:latest'
    networks:
      - app-tier
  myapp:
    image: 'YOUR_APPLICATION_IMAGE'
    networks:
      - app-tier

重要:

1.替换YOUR_APPLICATION_IMAGE占位符
2.在您的应用程序容器中,使用主机名rabbitmq连接到 RabbitMQ 服务器

启动容器:

docker-compose up -d

配置

环境变量

当您启动rabbitmq镜像时,您可以通过在docker-compose文件或docker run命令行上传递一个或多个环境变量来调整实例的配置。

对于 docker-compose,在docker-compose.yml添加变量名称和值:

rabbitmq:
  ...
  environment:
    - RABBITMQ_PASSWORD=my_password
  ...

对于手动执行,-e为每个变量和值添加一个选项。
可用变量:

节点和集群配置

  • RABBITMQ_VHOST:RabbitMQ 应用程序虚拟主机。默认:/
  • RABBITMQ_USERNAME:RabbitMQ 应用程序用户名。默认:user
  • RABBITMQ_PASSWORD:RabbitMQ应用程序密码。默认值:bitnami
  • RABBITMQ_SECURE_PASSWORD:是否安全设置RabbitMQ密码。这与加载外部 RabbitMQ 定义不兼容。默认值:no
  • RABBITMQ_LOAD_DEFINITIONS:是否加载外部RabbitMQ定义。这与安全设置 RabbitMQ 密码不兼容。默认值:no。
  • RABBITMQ_ERL_COOKIE:Erlang cookie,用于确定不同节点是否允许相互通信。
  • RABBITMQ_NODE_TYPE:节点类型。有效值:stats、queue-ram或queue-disc。默认值:stats
  • RABBITMQ_NODE_NAME:节点名称和主机。例如:node@hostname或node(本地主机在集群拓扑中不起作用)。默认的rabbit@localhost。如果使用此变量,请确保指定有效的主机名,否则容器将无法启动。如果使用完全限定域名,RABBITMQ_USE_LONGNAME也需要设置为true
  • RABBITMQ_USE_LONGNAME:当设置为true时,这将导致 RabbitMQ 使用完全限定名称来标识节点。默认值:false
  • RABBITMQ_FORCE_BOOT:强制启动节点,即使它不是最后一个关闭的节点。默认值:no
  • RABBITMQ_CLUSTER_NODE_NAME:集群的节点名称。例如:clusternode@主机名
  • RABBITMQ_CLUSTER_PARTITION_HANDLING:集群分区恢复机制。默认:ignore
  • RABBITMQ_NODE_PORT_NUMBER:节点端口。默认值:5672
  • RABBITMQ_NODE_SSL_PORT_NUMBER:SSL 连接的 RabbitMQ 节点端口号。默认值:5671
  • RABBITMQ_SSL_CACERTFILE:RabbitMQ 服务器 SSL CA 证书文件的路径。没有默认值。
  • RABBITMQ_SSL_CERTFILE:RabbitMQ 服务器 SSL 证书文件的路径。没有默认值。
  • RABBITMQ_SSL_KEYFILE:RabbitMQ 服务器 SSL 证书密钥文件的路径。没有默认值。
  • RABBITMQ_COMBINED_CERT_PATH:证书文件和密钥文件会自动合并到此文件路径中的一个合并文件中。如果您无论如何都使用组合证书,请将其安装到容器并将此路径设置为安装的文件。默认值:/tmp/rabbitmq_combined_keys.pem
  • RABBITMQ_SSL_DEPTH:在有效证书路径中可以跟随对等证书的非自行颁发的中间证书的最大数量。没有默认值。
  • RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT:如果客户端无法提供证书,是否拒绝 TLS 连接。默认值:verify_none
  • RABBITMQ_SSL_VERIFY:是否启用对端SSL证书验证。默认值:否
  • RABBITMQ_PLUGINS:逗号、分号或空格分隔的插件列表,在初始化期间启用。没有默认值。
  • RABBITMQ_COMMUNITY_PLUGINS:逗号、分号或空格分隔的 URL 列表,在初始化期间下载自定义插件。没有默认值。

管理服务器配置

  • RABBITMQ_MANAGEMENT_BIND_IP:RabbitMQ管理服务器绑定IP地址。默认值:0.0.0.0
  • RABBITMQ_MANAGEMENT_PORT_NUMBER:RabbitMQ 管理服务器端口号。默认值:15672
  • RABBITMQ_MANAGEMENT_ALLOW_WEB_ACCESS:允许通过 Web 访问 RabbitMQ 管理门户RABBITMQ_USERNAME。默认值:false
  • RABBITMQ_MANAGEMENT_SSL_PORT_NUMBER:用于 SSL/TLS 连接的 RabbitMQ 管理服务器端口号。默认值:15671。
  • RABBITMQ_MANAGEMENT_SSL_CACERTFILE:RabbitMQ 管理服务器 SSL CA 证书文件的路径。没有默认值:$RABBITMQ_SSL_CACERTFILE。
  • RABBITMQ_MANAGEMENT_SSL_CERTFILE:RabbitMQ 管理服务器 SSL 证书文件的路径。默认值:$RABBITMQ_SSL_CERTFILE。
  • RABBITMQ_MANAGEMENT_SSL_KEYFILE:RabbitMQ 管理服务器 SSL 证书密钥文件的路径。默认值:$RABBITMQ_SSL_KEYFILE。
  • RABBITMQ_MANAGEMENT_SSL_DEPTH:对于 RabbitMQ 管理服务器,在有效证书路径中可以跟随对等证书的非自行颁发中间证书的最大数量。没有默认值。
  • RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT:如果客户端无法为 RabbitMQ 管理服务器提供证书,是否拒绝 TLS 连接。默认值:yes
  • RABBITMQ_MANAGEMENT_SSL_VERIFY:是否为RabbitMQ管理服务器启用对等SSL证书验证。默认值:verify_peer

LDAP配置

  • RABBITMQ_ENABLE_LDAP:启用 LDAP 配置。默认值:no
  • RABBITMQ_LDAP_TLS:启用安全 LDAP 配置。默认值:no
  • RABBITMQ_LDAP_SERVERS:逗号、分号或空格分隔的 LDAP 服务器主机名列表。没有默认值。
  • RABBITMQ_LDAP_SERVERS_PORT:LDAP 服务器端口。默认值:389
  • RABBITMQ_LDAP_USER_DN_PATTERN:DN用于绑定到LDAP的形式cn=$${username},dc=example,dc=org。没有默认值。

内存和磁盘配置

  • RABBITMQ_VM_MEMORY_HIGH_WATERMARK:RabbitMQ 的高内存水印可阻止发布者并防止新消息排队。可以指定为绝对值或相对值(百分比或 0 到 1 之间的值)。没有默认值。
  • RABBITMQ_DISK_FREE_RELATIVE_LIMIT:RabbitMQ 存储数据的分区的磁盘相对可用空间限制。默认值:1.0
  • RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT:RabbitMQ 存储数据的分区的磁盘绝对可用空间限制(优先于相对限制)。没有默认值。
  • RABBITMQ_ULIMIT_NOFILES:资源限制:打开文件描述符的最大数量。默认值:65536

设置集群

使用 Docker 组合

这是使用集群配置运行 RabbitMQ 的最简单方法:

第 1 步:在您的docker-compose.yml

将下面的代码片段复制到 docker-compose.yml 中,将 RabbitMQ stats 节点添加到集群配置中。

version: '2'

services:
  stats:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=stats
      - RABBITMQ_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    ports:
      - '15672:15672'
    volumes:
      - 'rabbitmqstats_data:/bitnami/rabbitmq/mnesia'

注意:服务的名称 ( stats ) 很重要,以便节点可以解析主机名以进行集群。(注意节点名称是rabbit@stats)

第 2 步:在配置中添加队列节点

更新您想要用于 RabbitMQ stats 节点集群的节点的定义。

  queue-disc1:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=queue-disc
      - RABBITMQ_NODE_NAME=rabbit@queue-disc1
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    volumes:
      - 'rabbitmqdisc1_data:/bitnami/rabbitmq/mnesia'

注意:同样,服务的名称 ( queue-disc1 ) 很重要,以便每个节点都可以解析该服务的主机名。

我们还将添加一个 ram 节点:

  queue-ram1:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=queue-ram
      - RABBITMQ_NODE_NAME=rabbit@queue-ram1
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    volumes:
      - 'rabbitmqram1_data:/bitnami/rabbitmq/mnesia'

第 3 步:添加卷描述

volumes:
  rabbitmqstats_data:
    driver: local
  rabbitmqdisc1_data:
    driver: local
  rabbitmqram1_data:
    driver: local

它将docker-compose.yml看起来像这样:

version: '2'

services:
  stats:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=stats
      - RABBITMQ_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    ports:
      - '15672:15672'
    volumes:
      - 'rabbitmqstats_data:/bitnami/rabbitmq/mnesia'
  queue-disc1:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=queue-disc
      - RABBITMQ_NODE_NAME=rabbit@queue-disc1
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    volumes:
      - 'rabbitmqdisc1_data:/bitnami/rabbitmq/mnesia'
  queue-ram1:
    image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq
    environment:
      - RABBITMQ_NODE_TYPE=queue-ram
      - RABBITMQ_NODE_NAME=rabbit@queue-ram1
      - RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
      - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
    volumes:
      - 'rabbitmqram1_data:/bitnami/rabbitmq/mnesia'

volumes:
  rabbitmqstats_data:
    driver: local
  rabbitmqdisc1_data:
    driver: local
  rabbitmqram1_data:
    driver: local

配置文件

可以将自定义rabbitmq.conf配置文件挂载到该/bitnami/rabbitmq/conf目录。如果没有挂载文件,容器会根据环境变量生成一个默认文件。advanced.config您还可以将您自己的文件(使用经典的 Erlang 术语)和配置文件挂载到此目录rabbitmq-env.conf。

作为替代方案,您还可以挂载custom.conf配置文件并将其挂载到/bitnami/rabbitmq/conf目录中。在这种情况下,将生成默认配置文件,稍后,custom.conf配置文件中的可用设置将与默认设置合并。例如,为了覆盖该listeners.tcp.default指令:

第 1 步:编写包含以下内容的 custom.conf 配置文件

listeners.tcp.default=1337

第 2 步:运行 RabbitMQ 挂载您的 custom.conf 配置文件

docker run -d --name rabbitmq-server \
   -v /path/to/custom.conf:/bitnami/rabbitmq/conf/custom.conf:ro \
    registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq:latest

之后,您的更改将被考虑到服务器的行为中。

SSL/TLS 证书和密钥文件的权限

如果将证书和密钥文件从本地主机绑定挂载到容器,请确保设置这些文件的正确所有权和权限:

sudo chown 1001:root <your cert/key files>
sudo chmod 400 <your cert/key files>

启用 LDAP 支持

如果您希望为 RabbitMQ 启用 LDAP 支持,则必须指定 LDAP 配置参数。以下环境变量可用于配置 LDAP 支持:

  • RABBITMQ_ENABLE_LDAP:启用 LDAP 配置。默认为no.
  • RABBITMQ_LDAP_TLS:启用安全 LDAP 配置。默认为no.
  • RABBITMQ_LDAP_SERVERS:逗号、分号或空格分隔的 LDAP 服务器主机名列表。没有默认值。
  • RABBITMQ_LDAP_SERVERS_PORT:LDAP 服务器端口。默认值:389
  • RABBITMQ_LDAP_USER_DN_PATTERN:用于以 LDAP 形式绑定到 LDAP 的 DN cn=$${username},dc=example,dc=org。无默认值。

注意:要转义$,RABBITMQ_LDAP_USER_DN_PATTERN您需要使用$$.

按照以下说明创建 OpenLDAP 服务器并使用它对 RabbitMQ 上的用户进行身份验证:

步骤1:创建网络并启动 OpenLDAP 服务器

docker network create app-tier --driver bridge
docker run --name openldap \
  --env LDAP_ADMIN_USERNAME=admin \
  --env LDAP_ADMIN_PASSWORD=adminpassword \
  --env LDAP_USERS=user01,user02 \
  --env LDAP_PASSWORDS=password1,password2 \
  --network app-tier \
  registry.cn-hangzhou.aliyuncs.com/qingcloudtech/openldap:latest

步骤2:创建advanced.config文件

要配置授权,您需要按照clasic config 格式创建一个 advance.config 文件,并添加您的授权规则。例如,使用下面的文件授予所有用户使用管理插件的能力,但不让他们成为管理员:

[{rabbitmq_auth_backend_ldap,[
    {tag_queries, [{administrator, {constant, false}},
                   {management,    {constant, true}}]}
]}].

步骤3:启动具有 LDAP 支持的 RabbitMQ

docker run --name rabbitmq \
  --env RABBITMQ_ENABLE_LDAP=yes \
  --env RABBITMQ_LDAP_TLS=no \
  --env RABBITMQ_LDAP_SERVERS=openldap \
  --env RABBITMQ_LDAP_SERVERS_PORT=1389 \
  --env RABBITMQ_LDAP_USER_DN_PATTERN=cn=$${username},ou=users,dc=example,dc=org \
  --network app-tier \
  -v /path/to/your/advanced.config:/bitnami/rabbitmq/conf/advanced.config:ro \
  registry.cn-hangzhou.aliyuncs.com/qingcloudtech/rabbitmq:latest

日志

docker logs rabbitmq

或使用 Docker Compose:

docker-compose logs rabbitmq
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容