Docker部署mysql,ngnix,redis,rabbitMQ,elasticsearch,nacos,sentinel,seata等

本文章以黑马的docker课程为例,除了讲解hmall的部署外,还包含服务器的购买(以阿里云为例)、linux环境下用docker的安装和项目部署mysql安装前后端项目打包和部署ngnix安装和配置自定义网络DockerCompose配置、redis安装及启动连接,以及RabbitMQ、elasticsearch、Nacos、Sentinel、Seata等常用中间件的安装,希望能帮助到初学者的学习。

说在前面:以一张图说明docker常见命令、容器和镜像的区别。对docker想要个更详细的理解的可以去看b站的课程,本文章没有讲解docker的原理,只是讲解了操作的命令。

1.安装Docker

1.1卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

1.2配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

由于docker关闭了中国的访问渠道,所以要配置阿里云镜像,原先的download.docker.com不能再使用。

yum-config-manager \
  --add-repo \
   https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.3安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.4启动和校验

# 启动Docker
systemctl start docker
​
# 停止Docker
systemctl stop docker
​
# 重启
systemctl restart docker
​
# 设置开机自启
systemctl enable docker
​
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

1.5配置镜像加速

这里以阿里云镜像加速为例。

1.6注册阿里云账号

首先访问阿里云网站:

阿里云-计算,为了无法计算的价值

注册一个账号。

1.7开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

点击后进入控制台:

首次可能需要选择立刻开通,然后进入控制台。

1.8配置镜像加速

 找到镜像工具下的镜像加速器

页面向下滚动,即可找到配置的文档说明:

具体命令如下:

# 创建目录
mkdir -p /etc/docker
​
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
​
# 重新加载配置
systemctl daemon-reload
​
# 重启Docker
systemctl restart docker

2.安装MySql

2.1安装mysql

由于mysql默认挂载的数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载,这样,不仅操作数据卷方便,还能实现数据的持久保存,哪怕更新mysql版本,原先的数据依然存在。如将mysql的数据卷挂载到root目录下。

安装命令:

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  mysql:8.0.28

命令解读:

  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行。

  • --name mysql : 给容器起个名字叫mysql,你可以叫别的。

  • -p 3306:3306 : 设置端口映射。

    • 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。

    • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。

    • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口

  • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数

    • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定

    • 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码

  • -v : 配置本地数据卷挂载,以data为例,不配置会默认挂载在/var/lib/docker/volumes/data/_data目录下,配置本地数据卷后不仅操作数据卷方便,还能实现数据的持久保存。

    • 格式:-v 要配置到的本地目录:对应镜像原始挂载目录,镜像原始的挂载目录要去DockerHub网站或者软件的官方网站中查看。

    • 注意:本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

  • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

    • 格式:REPOSITORY:TAG,例如mysql:8.0.28,其中REPOSITORY可以理解为镜像名,TAG是版本号

    • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

2.2 开放远程连接端口和授权

1.要远程连接mysql,还要在云服务器控制台防火墙中开放3306端口。

2.执行以下代码,授权mysql远程登录。

docker exec -it mysql bash
mysql -uroot -p
#输入密码
​
#进入到mysql
use mysql;
select host, user, authentication_string, plugin from user;
 
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
(设置远程登录密码123456,密码别设置的太简单,否则知道你服务器ip就随便登录你的mysql了)
​
// 设置远程连接权限
grant all on *.* to 'root'@'%';
​
//刷新权限
flush privileges;

2.3 远程连接mysql

操作见ubuntu安装mysql并使用datagrip远程连接_ubuntu datagrip-CSDN博客

3.部署后端

3.1导入准备好的hmall

利用maven打成jar包

3.2 上传服务器

将dockerfile和刚刚打好的jar包上传到root目录下

3.3 构建镜像

命令:

docker build -t hmall .

命令解释见Docs

3.4 自定义网络

常见命令:

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect
3.4.1 步骤
#创建网络
docker network create hmall
#将mysql加入hmall网络
docker network connect hmall mysql
#查看mysql容器,检查是否加入成功
docker inspect mysql

3.4 运行容器

#创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmall --network hmall -p 8080:8080 hmall
#查看容器是否启动成功,查看所有容器
docker ps
#查看hmall日志
docker logs -f hmall

成功部署截图

4.部署前端nginx

4.1 将nginx文件上传

4.2 创建nginx容器

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmall \
  nginx
  
#查看容器是否启动成功
docker ps

4.3 测试

访问黑马商城--首页2,出现以下页面则部署完成。

部署到此结束,下面第五点是利用DockerCompose一键部署的,也是部署的一种方式;第六点讲redis的安装。

5.利用DockerCompose部署

Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,实现对docker部署的优化,DockerComposen能实现一键部署

docker-compose.yml文件的基本语法可以参考官方文档:

Compose file version 3 reference | Docker Docs

5.1 编写docker-compose文件

version: "3.8"
​
services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
#配置网络
  hm-net:
    name: hmall

用docker-compose部署也要编写Dockerfile文件。

Dockerfile和docker-compose文件并不一定要在同一个目录下

Dockerfile用于定义Docker镜像的构建过程,包括基础镜像、安装的软件包、环境变量设置、工作目录指定等。而docker-compose文件则用于定义和运行多容器的Docker应用程序,允许使用单个命令来启动多个容器。

可以将Dockerfile放在项目的根目录下,而将docker-compose文件放在另一个目录中,只要确保在docker-compose文件中正确指定了Dockerfile的路径即可。例如,可以在docker-compose文件的build部分使用contextdockerfile属性来指定Dockerfile的位置。

5.2 一键部署

# 5.启动所有, -d 参数是后台启动
docker compose up -d
docker-compose基本语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型参数或指令说明
Options-f指定compose文件的路径和名称
-p指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

6.redis安装(补充)

redis安装并配置本地目录挂载,安装方法与mysql类似,但需要先下载redis.conf文件,因为docker部署的redis并不自带redis.conf文件,在线下载命令wget http://download.redis.io/redis-stable/redis.conf,服务器无网可在有网的电脑上浏览器输入以下地址下载,然后再上传服务器http://download.redis.io/redis-stable/redis.conf

6.1 创建本地存储、日志和配置文件

1.创建存储目录、日志目录和配置文件目录

mkdir -p /root/redis/{conf,data}

2.下载和修改redis.conf

下载链接:GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps.先在电脑下载好,再上传到服务武器。

4.修改redis.conf配置文件内容

# 让外部设备连接
bind 0.0.0.0
 
# 关闭保护模式
protected-mode no
 
# 关闭后台运行(避坑提示,因为docker运行就已经有后台守护,改为yes会启动不了redis)
daemonize no

5.修改权限

chmod 777 /root/redis/log/redis.log /root/redis/conf/redis.conf

6.2 启动并运行镜像

1.拉取镜像

不写版本默认最新

docker pull redis:7.2.2

2.运行镜像

docker run \
  --restart=always \
  --log-opt max-size=100m \
  --log-opt max-file=2 \
  --name redis \
  -p 6379:6379 \
  -v /root/redis/conf/redis.conf:/etc/redis/redis.conf \
  -v /root/redis/data:/data \
  -d redis:7.2.2 redis-server /etc/redis/redis.conf \
  --appendonly yes \
  --requirepass 123456

3.命令解读:

  1. --restart=always

    这个选项告诉 Docker 无论何时容器退出,都应该自动重启它。这对于确保关键服务始终在线非常有用。

  2. --log-opt max-size=100m --log-opt max-file=2

    这两个选项用于配置容器的日志。max-size=100m 表示单个日志文件的大小限制为 100MB。max-file=2 表示保留两个日志文件。当第一个日志文件达到 100MB 时,Docker 会开始写入第二个日志文件;当第二个文件也满时,Docker 会开始覆盖第一个文件的内容。

  3. --name redis

    为容器指定一个名称,这里是 redis

  4. -p 6379:6379

    将容器的 6379 端口映射到主机的 6379 端口。这样,你就可以通过主机的 6379 端口来访问容器内的 Redis 服务。

  5. -v /root/redis/conf/redis.conf:/etc/redis/redis.conf

    创建一个卷,将主机上的 /root/redis/conf/redis.conf 文件挂载到容器内的 /etc/redis/redis.conf。这样,Redis 在容器内启动时,会使用你指定的配置文件。

  6. -v /root/redis/data:/data

    将主机上的 /root/redis/data 目录挂载到容器内的 /data 目录。这通常用于持久化 Redis 的数据,即使容器被删除,数据也不会丢失。

  7. -d

    以分离模式(后台模式)运行容器。

  8. redis:7.2.2

    指定要运行的 Docker 镜像名称,这里是 redis:7.2.2

  9. redis-server /etc/redis/redis.conf

    这是传递给容器内 redis-server 命令的参数,指定它应该使用 /etc/redis/redis.conf 作为配置文件来启动。

  10. --appendonly yes --requirepass 123456

    这两个参数是redis-server的配置选项,而不是docker run的选项。--appendonly yes 启用 Redis 的 AOF(Append Only File)持久化模式。--requirepass 123456 设置 Redis 的密码为 123456,用于访问控制。

4.开启防火墙端口

#开启防火墙指定端口命令:
firewall-cmd --add-port=6379/tcp --permanent
#刷新防火墙端口命令:
firewall-cmd --reload

6.3 在Docker中连接Redis

# 在容器 redis 中开启一个交互模式的终端
docker exec -it redis /bin/bash

# 连接 redis
redis-cli

# 密码登录
auth 123456

以上就可以在docker中连接redis,后续操作与直接部署redis的操作方式相同。

7.RabbitMQ安装

7.1 RabbitMQ安装

1.拉取镜像

docker pull rabbitmq:management

2.执行以下安装命令

docker run \
 -e RABBITMQ_DEFAULT_USER=root \
 -e RABBITMQ_DEFAULT_PASS=123456 \
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:management

3.命令解读

  1. docker run: 这是 Docker 的一个基本命令,用于从指定的镜像启动一个新的容器实例。

  2. -e RABBITMQ_DEFAULT_USER=itheima: 通过 -e 参数,为容器设置环境变量。这里设置了 RabbitMQ 的默认用户名为 root

  3. -e RABBITMQ_DEFAULT_PASS=123456: 同样地,这也是一个环境变量设置,为 RabbitMQ 的默认用户设置密码为 123456

  4. -v mq-plugins:/plugins: 使用 -v--volume 参数挂载一个卷。这里,将宿主机上的 mq-plugins 卷(如果不存在,Docker 会自动创建)挂载到容器内的 /plugins 目录。这通常用于向 RabbitMQ 添加自定义插件。

  5. --name mq: 为容器指定一个名称,这里设置为 mq。这样,你可以通过 docker ps 或其他 Docker 命令更容易地引用这个容器。

  6. --hostname mq: 设置容器的主机名为 mq。虽然这通常与容器的名称相同,但在某些情况下,你可能希望为它们设置不同的值。

  7. -p 15672:15672: 使用 -p--publish 参数将容器的端口映射到宿主机的端口。这里,将容器的 15672 端口映射到宿主机的 15672 端口。这个端口是 RabbitMQ 的管理界面所使用的。

  8. -p 5672:5672: 同样地,将容器的 5672 端口映射到宿主机的 5672 端口。这是 RabbitMQ 的 AMQP 协议所使用的端口,用于消息传递

  9. -d: 以“分离”模式运行容器,即在后台运行容器并返回容器 ID。这样,你可以在启动容器后继续在终端上执行其他命令。

  10. rabbitmq:3.8-management: 这是你要从中启动容器的 Docker 镜像的名称和标签。

4.查看是否安装成功

docker ps

状态显示为up即成功安装。

5.访问

输入服务器"ip地址:15672"访问,访问前记得配置服务器防火墙端口号放行。

8.elasticsearch安装

8.1 安装elasticsearch

1.创建网络

docker network create es-net

2.安装命令

一定要保证服务器内存剩余空间大于512MB,否则开始能启动起来,到最后直接就是Restarting状态了,不要看服务器控制台,这个不准,我就是被这个耗费了一下午时间,刚开始安装时,一定要先把所有的其他服务停了再启动es,否则无论怎么安装都是Restarting。(我的服务器是2核2G的,当时控制台显示使用1300MB左右内存,按理来说应该是足够的,但是就是不行,最终不得不停掉所有其他的服务,再重启es访问才得以解决)

docker run -d \
  --name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    -v es-logs:/usr/share/elasticsearch/logs \
    --privileged \
    --restart=always \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.17.18

3.成功页面

开启防火墙端口9200和9300,输入网址:9200访问。显示以下页面才代表成功安装,不能只根据docker ps判断

4.禁用Kibana安全提示

elasticsearch 7.13以上版本,在默认不开启Elastic 安全功能时,Kibana的搜索结果页面会多出一行提示,建议我们开启ElasticSearch 安全功能。在个人学习或者内网开放ES连接的情况下我们可以不需要开启安全功能,但是在生产集群中还是建议开启安全选项的。

这是因为没有显式禁用安全选项导致的,也就是说ElasticSearch会提示你是不是忘了启用这个选项,只要在配置文件中显式禁用即可取消这个提示。以下是操作步骤。

#进入容器
docker exec -it es /bin/bash
#进入config目录
cd config
#关闭 密码安全验证
echo 'xpack.security.enabled: false' >> elasticsearch.yml
#退出容器后,重启es
docker restart es

8.2 安装Kibana

1.安装命令

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.17.18

2.成功页面

访问ip:5601,刚开始可能会报502,这是因为elasticsearch服务比较慢,多访问几次就可以了。

8.3 安装ik分词器

1.下载分词器

https://github.com/infinilabs/analysis-ik/releases/tag/v7.17.18,要下载elasticsearch-analysis-ik-xxx.zip,不要下载source

2.查看数据卷挂载

查看es的 es-plugins 容器卷插件目录,并进入该目录

#查看es的 es-plugins 容器卷插件目录
docker volume inspect es-plugins
#进入该目录
cd /var/lib/docker/volumes/es-plugins/_data

3.安装分词器

将下载好的分词器解压后上传到/var/lib/docker/volumes/es-plugins/_data目录后重启es即可。

4.测试是否安装成功

在Kibana中写入以下代码

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "黑马程序员学习java太棒了"
}

9.Nacos安装

Nacos是一个用于服务注册与发现的框架,用于管理微服务。

通过docker安装nacos,nacos中的所有数据都会保存在容器内部。倘若容器迁移则nacos源数据则不复存在,所以通常我们通常会将nacos的数据保存在mysql中。

9.1 创建数据库

将该数据库执行文件直接导入到服务器数据库执行即可。

-- --------------------------------------------------------
-- 主机:                           192.168.150.101
-- 服务器版本:                        8.0.27 - MySQL Community Server - GPL
-- 服务器操作系统:                      Linux
-- HeidiSQL 版本:                  12.2.0.6576
-- --------------------------------------------------------
​
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
​
​
-- 导出 nacos 的数据库结构
DROP DATABASE IF EXISTS `nacos`;
CREATE DATABASE IF NOT EXISTS `nacos` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */;
USE `nacos`;
​
-- 导出  表 nacos.config_info 结构
DROP TABLE IF EXISTS `config_info`;
CREATE TABLE IF NOT EXISTS `config_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
  `md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COLLATE utf8_bin COMMENT 'source user',
  `src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,
  `c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `type` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `c_schema` text COLLATE utf8_bin,
  `encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info';
​
-- 正在导出表  nacos.config_info 的数据:~0 rows (大约)
DELETE FROM `config_info`;
​
-- 导出  表 nacos.config_info_aggr 结构
DROP TABLE IF EXISTS `config_info_aggr`;
CREATE TABLE IF NOT EXISTS `config_info_aggr` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',
  `content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='增加租户字段';
​
-- 正在导出表  nacos.config_info_aggr 的数据:~0 rows (大约)
DELETE FROM `config_info_aggr`;
​
-- 导出  表 nacos.config_info_beta 结构
DROP TABLE IF EXISTS `config_info_beta`;
CREATE TABLE IF NOT EXISTS `config_info_beta` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
  `content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COLLATE utf8_bin COMMENT 'source user',
  `src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_beta';
​
-- 正在导出表  nacos.config_info_beta 的数据:~0 rows (大约)
DELETE FROM `config_info_beta`;
​
-- 导出  表 nacos.config_info_tag 结构
DROP TABLE IF EXISTS `config_info_tag`;
CREATE TABLE IF NOT EXISTS `config_info_tag` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
  `content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
  `md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COLLATE utf8_bin COMMENT 'source user',
  `src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_tag';
​
-- 正在导出表  nacos.config_info_tag 的数据:~0 rows (大约)
DELETE FROM `config_info_tag`;
​
-- 导出  表 nacos.config_tags_relation 结构
DROP TABLE IF EXISTS `config_tags_relation`;
CREATE TABLE IF NOT EXISTS `config_tags_relation` (
  `id` bigint NOT NULL COMMENT 'id',
  `tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_tag_relation';
​
-- 正在导出表  nacos.config_tags_relation 的数据:~0 rows (大约)
DELETE FROM `config_tags_relation`;
​
-- 导出  表 nacos.group_capacity 结构
DROP TABLE IF EXISTS `group_capacity`;
CREATE TABLE IF NOT EXISTS `group_capacity` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
​
-- 正在导出表  nacos.group_capacity 的数据:~0 rows (大约)
DELETE FROM `group_capacity`;
​
-- 导出  表 nacos.his_config_info 结构
DROP TABLE IF EXISTS `his_config_info`;
CREATE TABLE IF NOT EXISTS `his_config_info` (
  `id` bigint unsigned NOT NULL,
  `nid` bigint unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) COLLATE utf8_bin NOT NULL,
  `group_id` varchar(128) COLLATE utf8_bin NOT NULL,
  `app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
  `content` longtext COLLATE utf8_bin NOT NULL,
  `md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text COLLATE utf8_bin,
  `src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `op_type` char(10) COLLATE utf8_bin DEFAULT NULL,
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='多租户改造';
​
-- 正在导出表  nacos.his_config_info 的数据:~0 rows (大约)
DELETE FROM `his_config_info`;
​
-- 导出  表 nacos.permissions 结构
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE IF NOT EXISTS `permissions` (
  `role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  `resource` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `action` varchar(8) COLLATE utf8mb4_general_ci NOT NULL,
  UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
​
-- 正在导出表  nacos.permissions 的数据:~0 rows (大约)
DELETE FROM `permissions`;
​
-- 导出  表 nacos.roles 结构
DROP TABLE IF EXISTS `roles`;
CREATE TABLE IF NOT EXISTS `roles` (
  `username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  `role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
​
-- 正在导出表  nacos.roles 的数据:~1 rows (大约)
DELETE FROM `roles`;
INSERT INTO `roles` (`username`, `role`) VALUES
    ('nacos', 'ROLE_ADMIN');
​
-- 导出  表 nacos.tenant_capacity 结构
DROP TABLE IF EXISTS `tenant_capacity`;
CREATE TABLE IF NOT EXISTS `tenant_capacity` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='租户容量信息表';
​
-- 正在导出表  nacos.tenant_capacity 的数据:~0 rows (大约)
DELETE FROM `tenant_capacity`;
​
-- 导出  表 nacos.tenant_info 结构
DROP TABLE IF EXISTS `tenant_info`;
CREATE TABLE IF NOT EXISTS `tenant_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='tenant_info';
​
-- 正在导出表  nacos.tenant_info 的数据:~0 rows (大约)
DELETE FROM `tenant_info`;
​
-- 导出  表 nacos.users 结构
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
  `password` varchar(500) COLLATE utf8mb4_general_ci NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
​
-- 正在导出表  nacos.users 的数据:~1 rows (大约)
DELETE FROM `users`;
INSERT INTO `users` (`username`, `password`, `enabled`) VALUES
    ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);
​
/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;
​
9.2 上传配置文件
将custom.env文件上传至虚拟机的/root/nacos目录下,custom.env文件如下

PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=129.204.101.215 #修改为自己的服务器
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root #自己的
MYSQL_SERVICE_PASSWORD=123 #自己的数据库密码
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

9.3 下载镜像

1.拉取镜像

docker pull nacos/nacos-server:v2.3.2

不行的修改 /etc/docker/daemon.json,然后重启docker,重新加载配置文件。

{
  "registry-mirrors": ["https://bgd9bkbz.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"]
}

2.启动容器

docker run --name nacos -e MODE=standalone \
-p 8848:8848 -d -p 9848:9848 -p 9849:9849 \
-v nacos-conf:/usr/local/nacos/conf \
-v nacos-data:/usr/local/nacos/data \
-v nacos-logs:/usr/local/nacos/logs \
--privileged=true --restart=always \
nacos/nacos-server:v2.3.2

10. Sentinel安装

Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。

官网:home | Sentinel

10.1 执行docker命令

docker run \
--name sentinel \
--restart=always \
-d \
-p 8858:8858 \
-p 8719:8719 \
bladex/sentinel-dashboard:1.8.6

10.2 查看是否部署成功

浏览器访问8858端口,出现以下页面即访问成功,用户和密码都为sentinel。

11. Seata安装

Seata是一个用于解决分布式事务的框架,Seata的安装要保证内存在2G以上,否则会运行失败。

11.1 修改application.yml文件

修改seata文件下的application.yml文件,修改内容如下:注意docker中网络的知识,下面的第二个mysql是指容器名,修改好后将整个文件夹上传到服务器。

11.2 创建数据库表

在服务器中创建以下数据库表

CREATE DATABASE IF NOT EXISTS `seata`;
USE `seata`;
​
​
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;
​
​
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;
​
​
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;
​
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;
​
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

11.3 创建网络

创建网络并将mysql和nacos加入

#创建网络
docker network create springcloud-net
​
docker network connect springcloud-net mysql
​
docker network connect springcloud-net nacos

11.4 Docker部署

ip地址修改为自己的,网络名也要记得修改。

没有足够的内存要加入-e JMX_OPTS="-Xmx256m -Xms256m",设置JVM内存为256m。

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e JMX_OPTS="-Xmx256m -Xms256m" \
-e SEATA_IP=129.204.181.215 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network springcloud-net \
-d \
seataio/seata-server:1.5.2

11.5 访问成功页面

访问7099端口,出现以下页面即成功。

结语:后期还会不断更新其他中间件的安装,可能涉及到原先内容的修改,随着内容的增加,工作量将会变大,而CSDN的修改操作较为麻烦,为了节省时间,后续不会对本博客维护,如想阅读本博客最新版本可以点击以下飞书链接查阅:https://wvm85tdfrov.feishu.cn/docx/Cnn0dKTt2oIoEMxJkSMcrL16nEf?from=from_copylink

另外,如果觉得本教程写的不错的话,还请点赞、收藏和转发,有问题也可以在评论区反馈。

  • 40
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值