rabbitmq容器化部署
需求 容器化部署rabbitmq服务
部署服务
找到如下官网信息版本
官网版本发布信息
这里看到最新版本是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 '^]'.
参考官网的配置文件