微服务-服务发现Nacos进阶-Nacos容器化

249 阅读3分钟

一、概述

本次使用的Nacos版本为2.2.1。

二、MySql数据持久化

通过DockerDesktop工具简单弄下本地的Mysql数据库持久化,主要命令如下:

# 使用容器化启动MySql,外部访问端口为3307,卷为data-mysql
# 初始化密码为123456
docker run --name mysqlDemo -p 3307:3306 -v data-mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.42
# localnet是我本地定义的类型为bridge的网络,将mysqlDemo加入localnet
# 为了方便后续Nacos容器化使用mysqlDemo名称访问数据库
docker network connect localnet mysqlDemo

三、Nacos连接MySql

进入到nacos-server-2.2.1/nacos/conf目录下

3.1 初始化Nacos数据库

查找mysql-schema.sql文件,初始化MySql数据库。

3.2 修改Nacos数据库连接

修改application.properties文件,找到如下配置片段并进行修改

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
# spring.datasource.platform=mysql
spring.sql.init.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3307/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

注意:我这里的端口号是3307,数据库实例名称是nacos_config。

3.3 启动并访问Nacos

进入到bin目录下,使用控制台,输入startup.cmd -m standalone启动nacos。 http://127.0.0.1:8848/nacos 初始化密码是nacos/nacos
在配置列表中添加如下内容,到数据库确认数据,完成数据库配置。

image.png

image.png

四、Nacos容器化

4.1 Dockerfile

FROM base-jdk-ubuntu:1.8
MAINTAINER zouh
RUN mkdir /app
WORKDIR /app
COPY nacos ./nacos
EXPOSE 8848
EXPOSE 9848
ENTRYPOINT ["sh","/app/nacos/bin/nacosup.sh"]

镜像基于ubuntu的jdk1.8镜像,在bin目录下自定义写了nacosup.sh启动命令,内容如下:

#!/bin/bash
# 这里我采用的是单机模式
/app/nacos/bin/startup.sh -m standalone
# 避免镜像退出
tail -f /dev/null

4.2 Docker卷准备

新增nacos-config和nacos-log卷。
其中nacos-log默认放空即可,nacos-config放入如下三个文件即可:

image.png

数据库的连接配置片段如下:

image.png

4.3 启动

docker run --name nacos-demo -d -p 8848:8848 -p 9848:9848 -v nacos-config:/app/nacos/conf  -v nacos-log:/app/nacos/logs --net localnet nacos-demo:2.2.1

这里说明下几个重要属性:

  • 卷的映射,包含配置和日志
  • 网络类型设置,因为我这里的MySql数据库使用我自定义的localnet(类型为bridge),所以这里nacos的应用也需要和数据库在同一个网络里面。
    最终启动成功后访问nacos。

五、总结

整个过程耗费了将近三个小时,碰到几个问题总结下。

5.1 容器化后的应用数据库连接需要增加如下两个属性
&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true  
5.2 Docker同一个网络类型里面的端口,使用的是容器内的端口,而不是映射出来的端口

比如本次mysql配置是 3307:3306,其中3307代表的是映射到外部的端口,3306是容器内容的端口,这里采用了类型为bridge的网络,故而容器化后的nacos需要使用3306端口

5.3 基础镜像的操作系统最好选择功能相对完善的操作系统,比如unbuntu、centos。