CentOS中离线安装DockerCompos并用其部署Rabbitmq(使用离线导入导出docker镜像方式)

发布于:2025-04-11 ⋅ 阅读:(33) ⋅ 点赞:(0)

场景

Docker+DockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBoot+Vue流水线项目过程详解、踩坑记录(附镜像资源、离线包资源下载):

Docker+DockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBoot+Vue流水线项目过程详解、踩坑记录(附镜像资源、离线包资源下载)_jenkins+springboot+docker+docker-compose部署-CSDN博客

参考上面类似的方式实现使用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端口,使用上面配置的用户名密码登录即可。


网站公告

今日签到

点亮在社区的每一天
去签到