在学尚硅谷阳哥的SpringCloud视频时,卡在了Nacos持久化这里了。
我是在docker用nacos来连接本地的数据库,一直连接不上,百度,bing,关于nacos做持久化的文章我基本都看了,花了一个晚上,还有一个早上的时间才成功连接上。
下载nacos源文件,然后去改pom文件,再去修改naming项目的com.alibaba.nacos.naming.healthcheck 包下的 MysqlHealthCheckProcessor 类:
把
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
改为
import com.mysql.cj.jdbc.MysqlDataSource;
然后再把整个项目打包成jar包,替换掉nacos容器的target目录里的jar包,不过nacos源码里的pom文件引入的mysql驱动好像是8.0.13,不知道这个版本及以下的要不要往容器中放驱动,还是直接就可以启动,如果mysql是8.0.13及以下的同学可以试试能不能按照mysql5.6的方式配置成功。
不过,这种方法只使用于nacos1.3以前的版本,1.3后MysqlHealthCheckProcessor已经没有导入MysqlDataSource,所以用不了。
第二种方法是用docker-compose.yml去解决,因为我比较菜,这种方法不会用,所以也没去尝试。
在nacos容器里新建一个plugins/mysql目录,然后把mysql8的驱动放到里面,这种是可以的,不过中间还有以下操作需要做才能连接,下面我会详细的写出nacos1.3连接docker里的mysql5.6和mysql8.0.18,你们按照需要选择性的看。
注意:需要先把linux的端口开启,或者把防火墙关闭。
nacos-sql.sql文件:https://pan.baidu.com/s/1nsrZDBUw5rl7tCc-PQ_QAg 密码:0acj
已添加create database nacos_config
,可以直接使用。
此标题最后有一条命令启动的方式,可以看过程,也可以直接去看语句,不过数据库要先配置好。
打开本机的终端:
#拉取mysql5.6镜像
docker pull mysql:5.6
#拉取nacos1.3镜像(此时最新版是1.3)
docker pull nacos
#运行(请注意,开放的是3305端口)
docker run -p 3305:3306 --name mysql5.6 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
#把sql文件复制到linux中
#scp 本机sql文件路径 root@linuxip:linux路径
scp /Users/pro/Downloads/nacos/conf/nacos-mysql.sql [email protected]:/home
#输入linux的root用户密码进行传输,使用虚拟机的共享目录也可以
打开linux终端:
#在linux把文件传到mysql5.6容器中
#docker cp linux中文件的路径 容器ID:容器内的路径(这里放在容器的/home目录里)
#容器ID用 docker ps 查看
docker cp /home/nacos-mysql.sql f5381aee7490:/home
#进入mysql5.6容器
docker exec -it 容器ID /bin/bash
#进入mysql
mysql -uroot -p123456 --default-character-set=utf8
#创建nacos_config数据库
source /home/nacos-mysql.sql
#退出mysql
exit
#退出容器
exit
#运行nacos
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
#进入nacos1.3容器
docker exec -it 容器ID /bin/bash
cd conf
#备份application.properties
cp application.properties application.properties.bk
#修改application.properties文件
vim application.properties
#如果有提示,按Enter回车进入
#按i进行编辑
spring.datasource.platform=mysql
...
#10.211.55.17是linux的IP地址,填localhost是无效的
#注意,这里的端口号是3305
db.url.0=jdbc:mysql://10.211.55.17:3305/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
#注释掉db.url.1
db.user=root
db.password=123456
#按esc键,然后 :wq! 退出
主要改4个地方:
#退出容器
exit
#重启nacos
docker restart 容器ID
然后在浏览器输入:http://10.211.55.17:8848/nacos
账号和密码都是nacos
#进入mysql5.6容器
docker exec -it 容器ID /bin/bash
#进入mysql
mysql -uroot -p123456 --default-character-set=utf8
#切换到nacos_config数据库
use nacos_config;
#查看config_info表
select * from config_info;
成功写到数据库中,此时删除nacos容器,再新建一个,只要配置是连接到这个数据库的,都能还原之前的配置。
一条命令启动nacos:
#需要按照自己的配置进行修改,例如连接的数据库IP地址,端口号
docker run --env MODE=standalone --name mynacos -d -p 8848:8848 -e MYSQL_SERVICE_HOST=10.211.55.17 -e MYSQL_SERVICE_PORT=3305 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_DATABASE_NUM=1 nacos/nacos-server
配置完数据库后,直接用这条语句启动一个nacos,可以看到前面的配置。
mysql8.0.18前面的操作和mysql5.6,只是多了一步,需要把mysql8的驱动移到容器中。
最下面有最便捷的启动方式,同样需要先配置好数据库。
打开本机的终端:
#拉取mysql5.6镜像
docker pull mysql:8.0.18
#拉取nacos1.3镜像(此时最新版是1.3)
docker pull nacos
#运行(开放的是3306端口,和5.6的不同)
docker run -p 3306:3306 --name mysql8.0.18 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.18
#把sql文件复制到linux中
#scp 本机sql文件路径 root@linuxip:linux路径
scp /Users/pro/Downloads/nacos/conf/nacos-mysql.sql [email protected]:/home
#输入linux的root用户密码进行传输,使用虚拟机的共享目录也可以
打开linux终端:
#在linux把文件传到mysql8.0.18容器中
#docker cp linux中文件的路径 容器ID:容器内的路径(这里放在容器的/home目录里)
#容器ID用 docker ps 查看
docker cp /home/nacos-mysql.sql a6ea251d1758:/home
#进入mysql8.0.18容器
docker exec -it 容器ID /bin/bash
#进入mysql
mysql -uroot -p123456 --default-character-set=utf8
#创建nacos_config数据库
source /home/nacos-mysql.sql
#退出mysql
exit
#退出容器
exit
#运行nacos
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
#进入nacos1.3容器
docker exec -it 容器ID /bin/bash
cd conf
#备份application.properties
cp application.properties application.properties.bk
#修改application.properties文件
vim application.properties
#如果有提示,按Enter回车进入
#按i进行编辑
spring.datasource.platform=mysql
...
#10.211.55.17是linux的IP地址,填localhost是无效的
db.url.0=jdbc:mysql://10.211.55.17:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
#注释掉db.url.1
db.user=root
db.password=123456
#按esc键,然后 :wq! 退出
主要改4个地方:
我已经把我自己有的mysql驱动都放在百度云了,需要的可以直接拿:https://pan.baidu.com/s/1-IH5StRps_kCZBxmAwdjsg 密码:gsv3
这里需要把mysql8的驱动放到容器中,可以打开自己的maven下载的jar包的目录。
因为我的是8.0.18,所以用这个为例:
在本机的终端:
#把驱动从本地传到linux中
#scp 本机sql文件路径 root@linuxip:linux路径
scp /Users/pro/apache-maven-3.5.4/maven_repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar [email protected]:/home
#输入linux的root用户密码进行传输,使用虚拟机的共享目录也可以
在容器中:
#在nacos1.3容器中的nacos目录下新建plugins/mysql二级目录(plugins和conf同级)
mkdir -p plugins/mysql
#退出容器
exit
在linux终端:
#把驱动传入容器中
docker cp /home/mysql-connector-java-8.0.18.jar df6001cf4ff3:/home/nacos/plugins/mysql
#重启nacos
docker restart 容器ID
然后在浏览器输入:http://10.211.55.17:8848/nacos
账号和密码都是nacos
#进入mysql8.0.18容器
docker exec -it 容器ID /bin/bash
#进入mysql
mysql -uroot -p123456 --default-character-set=utf8
#切换到nacos_config数据库
use nacos_config;
#查看config_info表
select * from config_info;
mysql8稍微麻烦一点,配置完数据库后,先启动nacos:
#1. 先启动nacos
#按照自己的信息修改
docker run --env MODE=standalone --name mynacos2 -d -p 8848:8848 -e MYSQL_SERVICE_HOST=10.211.55.17 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_DATABASE_NUM=1 nacos/nacos-server
#2. 新建目录(当前位置在/home)
mkdir -p plugins/mysql
#3. 把驱动放到目录里(当前位置在/home,驱动也在此目录)
mv mysql-connector-java-8.0.18.jar plugins/mysql/
#4. 把整个文件docker cp进容器
docker cp plugins 容器ID:/home/nacos
#5. 重启nacos
docker restart 容器ID
这是我遇到问题后的解决办法,如果试了我的方法后还不行,可以先检查一下自己有没有地方写错了,IP地址,url,数据库名等这些,然后还是不行,那就需要再去网上找找资料了。
下一篇:在Docker上用3个Nacos1.3容器+一个MySQL5和8容器+一个Nginx容器进行集群的具体操作(Nacos集群版)