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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDSClaw,2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 从零玩转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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
2736 4
|
6月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
315 5
|
6月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
2025 9
|
6月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
928 4
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
321 0
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
13918 1
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
583 3
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
870 2
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
消息中间件 数据库
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
消息中间件系列教程(18) -RabbitMQ-基于RabbitMQ解决分布式事务(思想)
452 0

热门文章

最新文章

下一篇
开通oss服务