从零玩转Docker之docker-compose快捷部署中间件2

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 从零玩转Docker之docker-compose快捷部署中间件

搭建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

0bab1d43070f03673f2a2dde39f32d8.png

启动延迟队列

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

520c8cd5bf6f9ca2fc05f5548493b85.png

重新启动rabbitmq容器

docker restart rabbitmq

访问查看

7acde273121780c0ec980c620ecbfd5.png

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
  1. data 数据存储目录 (如果mysql初始化错误 需要将文件夹内部全部删除)
  2. init 文件夹可以放置 .sh .sql 文件 在初始化容器时会执行
  3. 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
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
162 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
21天前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
25 2
|
27天前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
41 3
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
持续交付 开发者 Docker
掌握Docker容器化技术,加速软件开发与部署
掌握Docker容器化技术,加速软件开发与部署
51 0
|
7月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
120 0
|
6月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
1677 0
|
5月前
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
283 3
|
2月前
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
124 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
4月前
|
消息中间件 Java 测试技术
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
这篇文章是关于如何在SpringBoot应用中整合RabbitMQ的消息中间件。内容包括了在SpringBoot项目中添加RabbitMQ的依赖、配置文件设置、启动类注解,以及如何通过单元测试来创建交换器、队列、绑定,并发送和接收消息。文章还介绍了如何配置消息转换器以支持对象的序列化和反序列化,以及如何使用注解`@RabbitListener`来接收消息。
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】