如何在docker里运行nacos

197 阅读3分钟

作为一个后端的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……