搭建RabbitMQ 消息队列
Docker 部署
创建文件夹
mkdir -p /root/docker/rabbitmq/log mkdir -p /root/docker/rabbitmq/data
分配权限(最重要的一步)
为所有目录包括子目录分配读写权限 没有写权限无法存储 会报错无法启动
chmod -R 777 /root/docker/rabbitmq
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 \ -v /root/docker/rabbitmq/data:/data \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management
参数说明:
- -d:表示在后台运行容器;
- -p:将容器的端口 5672(应用访问端口)和 15672 (控制台Web端口号)映射到主机中;
- -e:指定环境变量:
- RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
- RABBITMQ_DEFAULT_USER:默认的用户名;
- RABBITMQ_DEFAULT_PASS:默认的用户密码;
- -v 映射容器文件夹
- –hostname:指定主机名(RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据,默认为主机名);
- –name rabbitmq:设置容器名称;
- rabbitmq:容器使用的镜像名称;
设置开机自启动 (可选)
docker update rabbitmq --restart=always
启动 rabbitmq_management (RabbitMQ后台管理)
// 进入容器内部 我这里使用容器名字进入 也可以使用容器id docker exec -it rabbitmq /bin/bash >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // 开启web后台管理界面 rabbitmq-plugins enable rabbitmq_management
延迟队列插件
注意: 插件版本最好和rabbitmq一致
进入web端后左上角有显示当前安装的RabbitMQ版本
安装完成后用工具将插件文件上传到服务器上
将刚刚上传的插件拷贝到容器内plugins目录下
docker cp /root/docker/rabbitmq/plugins/rabbitmq_delayed_message_exchange-3.11.1.ez rabbitmq:/plugins
启动延迟队列
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
重新启动rabbitmq容器
docker restart rabbitmq
访问查看
Docker-Compose 部署
创建文件夹
mkdir -p /root/docker/rabbitmq/log mkdir -p /root/docker/rabbitmq/data
分配权限(最重要的一步)
为所有目录包括子目录分配读写权限 没有写权限无法存储 会报错无法启动
chmod -R 777 /root/docker/rabbitmq
安装搭建
由于需要内置插件 这里我们使用自定义 Dockerfile 方式
FROM rabbitmq:3.11.13-management MAINTAINER Yang BuYi # 添加插件到指定目录 可按照此方式自行扩展其他插件 ADD ./rabbitmq_delayed_message_exchange-3.11.1.ez /plugins # 开启插件 RUN rabbitmq-plugins enable rabbitmq_delayed_message_exchange ENTRYPOINT ["rabbitmq-server"]
docker-compose 编排
version: '3' services: rabbitmq: image: rabbitmq:3.11.13 container_name: rabbitmq # 使用 Dockerfile 构建 build: context: ./rabbitmq environment: # 控制台账号密码 RABBITMQ_DEFAULT_USER: admin RABBITMQ_DEFAULT_PASS: 123456 ports: - "15672:15672" # 管理界面端口 - "5672:5672" # api 端口 volumes: - /root/docker/rabbitmq/log:/var/log/rabbitmq - /root/docker/rabbitmq/data:/var/lib/rabbitmq network_mode: "host"
执行安装
docker-compose up -d rabbitmq
搭建Mysql8.0
持久化地址
mkdir -p /root/mysql/data /root/mysql/init /root/mysql/conf
- data 数据存储目录 (如果mysql初始化错误 需要将文件夹内部全部删除)
- init 文件夹可以放置 .sh .sql 文件 在初始化容器时会执行
- conf 文件夹 放置 my.cnf 配置文件 (touch my.cnf) 可自定义编写mysql配置
DockerCompose部署
version: '3' services: mysql8.0: # 镜像名 image: mysql:8.0.21 # 容器名(以后的控制都通过这个) container_name: mysql8.0 # 重启策略 restart: always environment: # 时区上海 TZ: Asia/Shanghai # root 密码 MYSQL_ROOT_PASSWORD: root # 初始化数据库(后续的初始化sql会在这个库执行) MYSQL_DATABASE: nacos_config # 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限) MYSQL_USER: nacos # 用户密码 MYSQL_PASSWORD: nacos # 映射端口 ports: - 3306:3306 volumes: # 数据挂载 - /root/mysql/data/:/var/lib/mysql/ # 配置挂载 - /root/mysql/conf/:/etc/mysql/conf.d/ # 初始化目录挂载 - /root/mysql/init/:/docker-entrypoint-initdb.d/ command: # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配) --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1
执行
–compatibility 兼容性命令
docker-compose --compatibility up -d
如果果初始化失败 需要执行 停止容器 删除镜像 删除数据文件
docker-compose stop docker-compose rm mysql8.0 rm -rf /root/mysql/data/*
Docker 部署
持久化地址
mkdir -p /data/mysql/conf mkdir -p /data/mysql/data mkdir -p /data/mysql/logs
1.创建my.cnf文件,放在 /data/mysql/conf 目录中,注意配置文件中的端口号、字符集、时区
vi /data/mysql/conf/my.cnf
[client] port = 3308 default-character-set = utf8mb4 [mysql] port = 3308 default-character-set = utf8mb4 [mysqld] # bind-address = 0.0.0.0 # port = 3306 max_connections=10000 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 设置时区和字符集 # default-time-zone='+8:00' character-set-client-handshake=FALSE init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci' gtid-mode=ON enforce-gtid-consistency = ON
docker run --restart=always --name mysql8.0 -v /data/mysql/conf:/etc/mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/log:/var/log -v /data/mysql/mysql-files:/var/lib/mysql-files -p 3308:3306 -e MYSQL_ROOT_PASSWORD='123456' -d mysql:8.0
Mysql5.7
docker pull mysql:5.7 mkdir -p /data/mysql/conf mkdir -p /data/mysql/data mkdir -p /data/mysql/logs docker run -d -p 3308:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/log:/var/log -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
其他问题
1.解决时间显示问题
[root@yangs ~]# docker exec -it mysql8.0 bash root@a498923c0bd3:/# date Tue Aug 3 06:44:32 UTC 2023 root@dwdadwda:/# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime root@dwdadwda:/# exit [root@yangs /]# docker restart mysql8.0 -- 重启镜像 [root@yangs /]# docker exec -it mysql8.0 bash root@dwdadwda:/# date Tue Aug 3 14:45:35 CST 2023
2.解决无法登录问题: 工具连接登录mysql
docker exec -it mysql8.0 bash
更改密码加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
刷新权限
FLUSH PRIVILEGES;
3.出现:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 解决
不重启mysql的解决】使用 select @@global.sql_mode; 查询功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用。
mysql> select @@global.sql_mode; +----------------------------------------------------------------------------------------------------+ | @@global.sql_mode | +----------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
去掉ONLY_FULL_GROUP_BY,重新设置值
mysql> set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.00 sec) mysql> select @@global.sql_mode; +----------------------------------------------------------------------------------------------------+ | @@global.sql_mode | +----------------------------------------------------------------------------------------------------+ | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
重启mysql的解决方案 修改my.cnf文件,在[mysqld] 下方添加以下规则,并重启mysql容器。同时重启mysql连接工具、连接程序重启。
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION