0


rabbitmq容器化部署

需求 容器化部署rabbitmq服务

基础版本 系统ubuntu 24docker 20.10,rabbitmq 3.13.2

部署服务

找到如下官网信息版本

官网版本发布信息

这里看到最新版本是3.13版本,这里在3.13中找一个版本下载容器镜像即可。

找到dockrhub.com中 找到3.13.2版本镜像。

容器服务安装此处省略

现在配置容器镜像下载需要的容器代理

~# cat /etc/docker/daemon.json
{
        "registry-mirrors": [
                "https://hub.iyuu.cn",
                "https://docker.1panel.live"
        ]
}

下载rabbitmq镜像

docker pull rabbitmq:3.13.2-management

部署容器服务

docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password  rabbitmq:3.13.2-management

查看容器状态,容器异常退出,查看容器日志

# docker ps -a
CONTAINER ID   IMAGE                        COMMAND                  CREATED             STATUS                           PORTS                                                                                                                                                 NAMES
a739628b8375   rabbitmq:3.13.2-management   "docker-entrypoint.s…"   About an hour ago   Exited (134) About an hour ago      

n# docker logs a73
Failed to create thread: Operation not permitted (1)
Aborted (core dumped)
                                                                                                        

这个报错是容器出现了权限问题,部署容器的时候需要加root特权的,这里加入参数docker时加上参数 --privileged=true
privileged=true:获得真正的root权限

删除这个异常退出的容器 重新部署

 docker run -d -p 15672:15672  -p  5672:5672 --privileged=true --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password  rabbitmq:3.13.2-management
bda51306d6691788437c49f1a5284c84be85abf10653ac5eb8930283a969b6e8
:~# docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS        PORTS                                                                                                                                                 NAMES
bda51306d669   rabbitmq:3.13.2-management   "docker-entrypoint.s…"   2 seconds ago   Up 1 second   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   some-rabbit

查看到容器服务已正常运行 无报错

验证及访问服务

访问 web端 用IP地址加端口号15672, 账号密码 user/password

到这里 mq服务部署 配置无误。

rabbitmq配置LTS

这边配置LTS依然在容器环境下

以下代码在宿主机上运行

# 创建 CA 证书
# 创建一个 CA 密钥文件,用于签发证书。
openssl genrsa -out ca_key.pem 4096

# 使用 CA 密钥创建一个自签名的 CA 证书。
openssl req -new -x509 -days 3650 -key ca_key.pem -out ca_certificate.pem -subj "/C=US/ST=California/L=San Francisco/O=YourOrg/CN=YourOrg CA"

# 创建服务器证书和密钥
# 创建一个服务器密钥文件。
openssl genrsa -out server_key.pem 4096

# 使用服务器密钥创建一个证书请求。
openssl req -new -key server_key.pem -out server_csr.pem -subj "/C=US/ST=California/L=San Francisco/O=YourOrg/CN=yourserver.example.com"

# 使用 CA 证书签发服务器证书。
openssl x509 -req -in server_csr.pem -CA ca_certificate.pem -CAkey ca_key.pem -CAcreateserial -out server_certificate.pem -days 365

确认所有证书文件都已正确生成:

•ca_key.pem:CA 密钥文件

•ca_certificate.pem:CA 证书文件

•server_key.pem:服务器密钥文件

•server_certificate.pem:服务器证书文件

以下代码在宿主机运行

提前把配置文件从容器服务中取出来配置文件路径是/etc/rabbitmq/conf.d/10-defaults.conf

docker cp 容器名称:/etc/rabbitmq/conf.d/10-defaults.conf .

把配置文件获取到本地后开始编辑配置文件,追加以下配置文件

listeners.ssl.default = 5671

ssl_options.cacertfile = /etc/rabbitmq/ca_certificate.pem
ssl_options.certfile   = /etc/rabbitmq/server_certificate.pem
ssl_options.keyfile    = /etc/rabbitmq/server_key.pem
ssl_options.verify     = verify_peer
ssl_options.fail_if_no_peer_cert = true

注意 上面生成的ssl配置文件是在宿主机的路径下,配置文件指定的路径是容器内的路径,这里要注意替换配置文件路径。

这里需要提前给上面的配置文件和秘钥授权不然会有如下报错。

报错参考如下:这里是因为秘钥文件在宿主机是因root创建的,容器内是已rabbitmq用户运行的程序,这里权限访问不到,会报错路径找不到文件。

2024-09-14 07:05:01.736878+00:00 [error] <0.156.0> ssl_options.keyfile invalid, file does not exist or cannot be read by the node
2024-09-14 07:05:01.747045+00:00 [error] <0.156.0> Error preparing configuration in phase validation:
2024-09-14 07:05:01.747111+00:00 [error] <0.156.0>   - ssl_options.keyfile invalid, file does not exist or cannot be read by the node

2024-09-14 07:05:01.749037+00:00 [error] <0.156.0>
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> BOOT FAILED
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> ===========
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> Error during startup: {error,failed_to_prepare_configuration}
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0>

进入容器查看服务运行的用户,容器内是用rabbitmq用户运行的程序

解决以上报错给文件授权

# 在配置文件和秘钥文件 的存储目录执行
chmod 777 *

把run命令 准备好,一般建议放到sh文件中。(注意秘钥文件路径)

docker run -d --hostname my-rabbit  --privileged=true --name some-rabbit   \
-v /root/rabbitmq/10-defaults.conf:/etc/rabbitmq/conf.d/10-defaults.conf  \
-v /root/rabbitmq/ca_certificate.pem:/etc/rabbitmq/ca_certificate.pem  \
-v /root/rabbitmq/server_certificate.pem:/etc/rabbitmq/server_certificate.pem   \
-v /root/rabbitmq/server_key.pem:/etc/rabbitmq/server_key.pem  \
-e RABBITMQ_DEFAULT_USER=user  -e RABBITMQ_DEFAULT_PASS=password \
-p 5671:5671 -p 5672:5672 -p 15672:15672 \
rabbitmq:3.13.2-management

查看容器日志信息

2024-09-14 08:05:32.133593+00:00 [info] <0.669.0> Ready to start client connection listeners
2024-09-14 08:05:32.135054+00:00 [info] <0.822.0> started TCP listener on [::]:5672
2024-09-14 08:05:32.136665+00:00 [info] <0.842.0> started TLS (SSL) listener on [::]:5671
 completed with 6 plugins.
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> Server startup complete; 6 plugins started.
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * rabbitmq_prometheus
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * rabbitmq_federation
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * rabbitmq_management
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * rabbitmq_management_agent
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * rabbitmq_web_dispatch
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0>  * oauth2_client
2024-09-14 08:05:32.218109+00:00 [info] <0.9.0> Time to start RabbitMQ: 5468 ms
2024-09-14 08:05:45.800176+00:00 [info] <0.886.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
2024-09-14 08:05:45.800326+00:00 [info] <0.886.0> Successfully synced tables from a peer
2024-09-14 08:05:46.794458+00:00 [info] <0.914.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
2024-09-14 08:05:46.794598+00:00 [info] <0.914.0> Successfully synced tables from a peer
2024-09-14 08:44:57.191730+00:00 [notice] <0.1672.0> TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message
2024-09-14 08:44:57.191730+00:00 [notice] <0.1672.0>  - {unsupported_record_type,13}

最重要的要搜索到以下两句话,这个是可以证明TLS已启用状态了,基本可以说是没有问题了。

2024-09-14 08:05:32.135054+00:00 [info] <0.822.0> started TCP listener on [::]:5672
2024-09-14 08:05:32.136665+00:00 [info] <0.842.0> started TLS (SSL) listener on [::]:5671

参考官网链接

服务验证

这里访问 IP地址+端口号 先测试一下 管理端是否可以访问,账号密码是 user/password,就是上面容器传进去的变量。这边可以访问到,就证明MQ是没有明显报错的。

TLS验证

先在其它宿主机上telnet 5671 TLS的专用端口 是否可以通,目前看到端口可以通,基本无误,可以联系研发进行 下一步程序连接TLS端口的测试和验证。

/rabbitmq# telnet 110.120.110.110 5671
Trying 110.120.110.110...
Connected to 110.120.110.110.
Escape character is '^]'.

参考官网的配置文件

rabbitmq配置集群

集群主要有两种模式 一种主从模式 一种高可用模式,主从模式 官网称之为经典模式,高可用模式官网称之为镜像模式。

镜像集群是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。

这种集群有一个问题,主从数据源要同步,要从主节点同步到从节点,但是这个主从同步它不是强一致的,存在一定的延迟,如果在主从同步期间出现了一点故障,就可能导致数据丢失。

因此在RabbitMQ的3.8版本以后,推出了新的功能:仲裁队列来代替镜像集群,底层采用Raft协议确保主从的数据一致性。

部署集群

在一台服务器上用三个容器部署集群。

1、创建一个存放配置文件的目录

创建目录 /tmp/0918

2、创建配置文件

三个节点全部一样,在/tmp/0918 下创建两个配置文件。这里rabbit@ 是固定写法不要变,这里mq01,mq02和mq03是需要在环境中可以解析到的,如果环境中无法解决会报错。

rabbitmq.conf

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq01
cluster_formation.classic_config.nodes.2 = rabbit@mq02
cluster_formation.classic_config.nodes.3 = rabbit@mq03

.erlang.cookie (注意文件权限600)这个值是前面创建单机的时候,提前从容器内随机复制出来的,docker cp 容器id://var/lib/rabbitmq/.erlang.cookie . 复制出来文件。

HBRHAKRMYJUBNVYEXHXH

3、部署各个节点

创建一个虚拟网络

docker network create mq-net-test

运行命令

运行mq01节点

docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq01 \
--hostname mq01 \
-p 8071:5672 \
-p 8081:15672 \
--privileged=true \
rabbitmq:3.13.2-management

运行mq02节点

docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq02 \
--hostname mq02 \
-p 8072:5672 \
-p 8082:15672 \
--privileged=true \
rabbitmq:3.13.2-management

运行mq03节点

docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq03 \
--hostname mq03 \
-p 8073:5672 \
-p 8083:15672 \
--privileged=true \
rabbitmq:3.13.2-management

集群验证

进入任意一个容器查看节点信息

-security:/tmp/0918# docker exec -it 6d /bin/bash

root@mq02:/#  rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
Basics

##############

Versions

rabbit@mq02: RabbitMQ 3.13.2 on Erlang 26.2.5
rabbit@mq01: RabbitMQ 3.13.2 on Erlang 26.2.5
rabbit@mq03: RabbitMQ 3.13.2 on Erlang 26.2.5

CPU Cores

Node: rabbit@mq02, available CPU cores: 2
Node: rabbit@mq01, available CPU cores: 2
Node: rabbit@mq03, available CPU cores: 2

Maintenance status

Node: rabbit@mq02, status: not under maintenance
Node: rabbit@mq01, status: not under maintenance
Node: rabbit@mq03, status: not under maintenance

##############

打开web端查看节点信息

http://IP地址:8081/#/

至此 rabbitmq集群搭建及验证完成。


本文转载自: https://blog.csdn.net/weixin_38924998/article/details/142254336
版权归原作者 运维潇哥 所有, 如有侵权,请联系我们删除。

“rabbitmq容器化部署”的评论:

还没有评论