本文章以黑马的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
部分使用context
和dockerfile
属性来指定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的集合,是逻辑概念 | |
Commands | up | 创建并启动所有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
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.命令解读:
-
--restart=always
这个选项告诉 Docker 无论何时容器退出,都应该自动重启它。这对于确保关键服务始终在线非常有用。
-
--log-opt max-size=100m --log-opt max-file=2
这两个选项用于配置容器的日志。
max-size=100m
表示单个日志文件的大小限制为 100MB。max-file=2
表示保留两个日志文件。当第一个日志文件达到 100MB 时,Docker 会开始写入第二个日志文件;当第二个文件也满时,Docker 会开始覆盖第一个文件的内容。 -
--name redis
为容器指定一个名称,这里是
redis
。 -
-p 6379:6379
将容器的 6379 端口映射到主机的 6379 端口。这样,你就可以通过主机的 6379 端口来访问容器内的 Redis 服务。
-
-v /root/redis/conf/redis.conf:/etc/redis/redis.conf
创建一个卷,将主机上的
/root/redis/conf/redis.conf
文件挂载到容器内的/etc/redis/redis.conf
。这样,Redis 在容器内启动时,会使用你指定的配置文件。 -
-v /root/redis/data:/data
将主机上的
/root/redis/data
目录挂载到容器内的/data
目录。这通常用于持久化 Redis 的数据,即使容器被删除,数据也不会丢失。 -
-d
以分离模式(后台模式)运行容器。
-
redis:7.2.2
指定要运行的 Docker 镜像名称,这里是
redis:7.2.2
。 -
redis-server /etc/redis/redis.conf
这是传递给容器内
redis-server
命令的参数,指定它应该使用/etc/redis/redis.conf
作为配置文件来启动。 -
--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.命令解读
-
docker run: 这是 Docker 的一个基本命令,用于从指定的镜像启动一个新的容器实例。
-
-e RABBITMQ_DEFAULT_USER=itheima: 通过
-e
参数,为容器设置环境变量。这里设置了 RabbitMQ 的默认用户名为root
。 -
-e RABBITMQ_DEFAULT_PASS=123456: 同样地,这也是一个环境变量设置,为 RabbitMQ 的默认用户设置密码为
123456
。 -
-v mq-plugins:/plugins: 使用
-v
或--volume
参数挂载一个卷。这里,将宿主机上的mq-plugins
卷(如果不存在,Docker 会自动创建)挂载到容器内的/plugins
目录。这通常用于向 RabbitMQ 添加自定义插件。 -
--name mq: 为容器指定一个名称,这里设置为
mq
。这样,你可以通过docker ps
或其他 Docker 命令更容易地引用这个容器。 -
--hostname mq: 设置容器的主机名为
mq
。虽然这通常与容器的名称相同,但在某些情况下,你可能希望为它们设置不同的值。 -
-p 15672:15672: 使用
-p
或--publish
参数将容器的端口映射到宿主机的端口。这里,将容器的15672
端口映射到宿主机的15672
端口。这个端口是 RabbitMQ 的管理界面所使用的。 -
-p 5672:5672: 同样地,将容器的
5672
端口映射到宿主机的5672
端口。这是 RabbitMQ 的 AMQP 协议所使用的端口,用于消息传递。 -
-d: 以“分离”模式运行容器,即在后台运行容器并返回容器 ID。这样,你可以在启动容器后继续在终端上执行其他命令。
-
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中。
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
另外,如果觉得本教程写的不错的话,还请点赞、收藏和转发,有问题也可以在评论区反馈。