场景
Docker+DockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBoot+Vue流水线项目过程详解、踩坑记录(附镜像资源、离线包资源下载):
参考上面类似的方式实现使用DockerCompose部署Rabbimq。
因服务器无法连接外网,但是已经安装了Docker,所以需要离线安装DockerCompose,
并且先从能通外网的电脑或服务将rabbitmq的docker镜像进行导出,然后将其导入到服务器上。
RabbiMQ
RabbitMQ是一个开源的,在AMQP基础上完整的,可复用的企业消息系统。
支持主流的操作系统,Linux、Windows、MacOX等
多种开发语言支持,Java、Python、Ruby、.NET、PHP、C/C++、node.js等
AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。
2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
其他主流 MQ 产品
ActiveMQ:Apache 出品,最流行的,能力强劲的开源消息总线,基于 JMS(Java Message Service)规范
RocketMQ:阿里低延迟、高并发、高可用、高可靠的分布式消息中间件,基于 JMS,目前由 Apache 基金会维护
Kafka:分布式,分区的,多副本的,多订阅者的消息发布订阅系统(分布式 MQ 系统),可以用于搜索日志,监控日志,访问日志等
RabbitMQ核心架构
AMQP协议模型
组件 作用 类比案例
Producer 消息生产者,通过Exchange路由消息 快递发货方
Exchange 接收消息并根据规则推送到Queue(类型:Direct/Topic/Fanout/Headers) 快递分拣中心
Queue 存储消息的缓冲区(FIFO) 快递暂存仓库
Consumer 消息消费者,通过订阅Queue获取消息 快递收件人
Channel 复用TCP连接的轻量级通信管道(减少资源消耗) 快递运输的子车道
注:
博客:
霸道流氓气质-CSDN博客
实现
CentOS上离线安装DockerCompose
这里假定服务器上已经安装了Docker并且需要安装DockerCompose的2.34.0版本
首先在有网络的机器上下载 Docker Compose 二进制文件
wget https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64
如果是在windows电脑上,直接访问后面的链接地址下载即可
下载之后将其上传至要安装的服务器,执行如下指令
# 将文件移动到可执行路径
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建符号链接(可选)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装
docker-compose version
CentOS上使用导出导入docker镜像的方式离线拉取Rabbimq镜像
在服务器上无法访问外网,所以需要在能拉取rabbitmq镜像的服务器上拉取镜像并导出,然后手动上传至
服务器上并导入镜像
有网的机器上拉取rabbitmq镜像
docker pull rabbitmq:3.9-management
拉取完成后然后导出镜像
docker save -o rabbitmq_3.9-management.tar rabbitmq:3.9-management
导出成功之后将其下载到本地,并上传至不能通外网的服务器上
执行导入命令
docker load -i rabbitmq_3.9-management.tar
导入成功

这里需要注意在导出Docker镜像时tar包的命名格式,如果命名格式有问题,则将其下载到本地时会显示0B大小,无法使用。
CentOS上导出Docker镜像时命名格式要求
关于Docker镜像导出文件命名的详细规范与建议
合法字符集
允许:字母(a-zA-Z)、数字(0-9)、连字符(-)、下划线(_)、点(.)
禁止:空格、/ \ : * ? " < > |等特殊符号(可能被系统解析为路径或通配符)
文件扩展名
建议统一使用.tar作为后缀(Docker标准格式)
若压缩可追加.gz:rabbitmq_3.9-management.tar.gz
CentOS上使用DockerCompose实现部署Rabbitmq
在上面实现服务器上离线安装了DockerCompose以及离线加载Rabbitmq镜像后,在服务器上某目录新建
docker-compose.yml文件,文件内容如下:
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.9-management
container_name: rabbitmq
hostname: my-rabbit
ports:
- "5672:5672" # AMQP 协议端口
- "15672:15672" # 管理界面端口
volumes:
- ./data:/var/lib/rabbitmq
- ./logs:/var/log/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=svip
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_DEFAULT_VHOST=/badao
restart: always
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "status"]
interval: 30s
timeout: 10s
retries: 5
networks:
- rabbitmq_net
networks:
rabbitmq_net:
driver: bridge
配置文件关键内容详解:
volumes:
作用:挂载数据卷,实现数据持久化
格式:宿主机路径:容器内路径
路径说明:
/var/lib/rabbitmq:RabbitMQ的数据存储目录
/var/log/rabbitmq:RabbitMQ的日志目录
environment:
作用:设置容器环境变量
变量说明:
RABBITMQ_DEFAULT_USER:默认管理员用户名
RABBITMQ_DEFAULT_PASS:默认管理员密码
RABBITMQ_DEFAULT_VHOST:默认虚拟主机
healthcheck:
作用:定义健康检查机制
配置项:
test:检查命令,rabbitmq-diagnostics status返回0表示健康
interval:检查间隔(30秒)
timeout:单次检查超时时间(10秒)
retries:连续失败多少次才判定为不健康
用途:Docker可以根据健康检查结果管理容器
注意上面配置数据卷映射,所以在yml所在目录下新建data目录和logs目录,
并授予这两个目录权限!!!
chmod 777 -R ./data
chmod 777 -R ./logs
如果不授权直接启动,则启动失败,可以查看日志提示权限问题:
docker-compose logs -f rabbitmq
如果先是启动过再授予的权限,要先将data目录删掉重新建立并重新授权之后再启动。
否则会提示:
Application rabbitmq_prelaunch exited with reason: {{shutdown,{failed_to_start_child,prelaunch,{badmatch,{error,{{shutdown,{failed_to_start_child,auth,{"Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only",[{auth,init_no_setcookie,0,[{file,"auth.erl"},{line,313}]},{auth,init,1,[{file,"auth.erl"},{line,165}]},{gen_server,init_it,2,[{file,"gen_server.erl"},{line,851}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,814}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,240}]}]}}},{child,undefined,net_sup_dynamic,{erl_distribution,start_link,[#{clean_halt => false,name => rabbit_prelaunch_19@localhost,name_domain => shortnames,net_tickintensity => 4,net_ticktime => 60,supervisor => net_sup_dynamic}]},permanent,false,1000,supervisor,[erl_distribution]}}}}}},{rabbit_prelaunch_app,start,[normal,[]]}}
这个错误表明 RabbitMQ 启动失败,原因是 .erlang.cookie 文件的权限设置不正确。
启动 RabbitMQ 服务
# 启动服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f rabbitmq
此时访问服务器的15672端口,使用上面配置的用户名密码登录即可。
