作为一个后端的Java开发,日常工作离不开注册中心。而注册中心,用的最多的就是nacos。
那怎么在开发电脑上把nacos很方便的跑起来,就是个不得不面对的问题。
目前在开发电脑上准备像nacos/mysql这样的中间件,最方便的管理工具我认为就是docker了。
从网络上下载好一个image,启动一个容器就能用起来了。哪天不用了,直接停止容器,删除image就好了。系统干干净净的。
互联网上关于如何在docker里运行nacos的文章,一搜一大把,目前这篇文章是我认为写的最好的一篇。但是在实操的过程中,还是发现了一些问题,基于它再整理出来一篇吧。
首先,作为一个后端开发,在docker上安装mysql基本是跑不了的。而nacos的配置信息,又是可以持久化在mysql里面的。所以让nacos容器和mysql容器能够互通是前提条件。
那怎么互通呢?——这就涉及到docker里面的network的概念。这个概念又可以改天单独再开一篇。
在docker里创建一个网络,默认用bridge模式:
docker network create nacos
接下来在docker里面启动mysql的时候,让mysql跑在nacos这个network里面。具体怎么启动mysql容器的命令行不再啰嗦。就是注意在启动mysql容器的命令行参数里增加一个参数:
--network nacos
这样,mysql容器就运行在nacos这个网络里了。
接下来的部分,就是本文跟上面这篇参考文章的不同之处了:
nacos的image,我用的是v2.2.3-slim这个tag,因为这个版本适配我的mac芯片。
启动nacos的时候,让它也运行在nacos这个network里面,这样nacos在访问mysql的时候,就不需要显示的指定mysql的容器IP,而是指定mysql容器的name就好了。可以理解成通过DNS把域名解析成IP地址的过程。记一个域名要比记IP容易多了吧。
等nacos容器启动起来,看看启动日志如果没有啥报错,nacos就可以用了。
但是,当nacos容器stop之后,如果再次启动它,发现竟然启动不了,报错内容为:
Caused by: java.lang.IllegalStateException: No DataSource set
显然是找不到数据源。。。。但是明明已经在命令上把参数都写了啊。。。什么情况
经过一番折腾,总算是折腾明白了。下面来说我的步骤:
第一步:启动nacos容器
docker run --name nacos -d \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--network nacos \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=mysql \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_USER=username \
-e MYSQL_SERVICE_PASSWORD=password \
nacos/nacos-server:v2.2.3-slim
第二步:修改nacos容器里的配置文件
把容器里的配置文件拷贝到宿主机的目录
docker cp nacos:/home/nacos/conf/application.properties ~/Work
打开application.properties文件,找到配置mysql数据源的那一行:
db.url.0=jdbc:mysql://…………
在数据源的最后,加上:serverTimezone=Asia/Shanghai这个参数。
是的,我用的是mysql的8.2版本,数据源的参数里必须带上serverTimezone这个参数。
修改完配置文件,再拷贝回去。
docker cp ~/Work/application.properties nacos:/home/nacos/conf
这样就算是把容器里的配置文件改好了
第三步:重启一下nacos容器
docker restart nacos
这篇文章里的方案是先改配置文件,改完配置文件然后把容器删除了,再启动一次容器。问题是:容器被删除了,配置文件不是白改了么?
好了。以上就是如何在docker里面运行nacos的经验总结。后续再写一个如何在docker里面运行各种中间价的系列文章。毕竟作为一个后端开发,依赖的中间件简直不要太多了:mysql,redis,nacos,rabbitmq……