写点什么

Docker 下 Nacos 持久化配置

作者:程序员欣宸
  • 2022-10-13
    广东
  • 本文字数:4699 字

    阅读完需:约 15 分钟

Docker下Nacos持久化配置

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 本文是《Spring Cloud Alibaba 实战系列》的第五篇,学习如何将 Nacos 服务所用的数据库从嵌入式数据库改为 MySql。

系列文章链接

  • 下面是《Spring Cloud Alibaba 实战系列》的所有文章地址:


  1. 《Docker下,两分钟极速体验Nacos》

  2. 《Docker下的Nacos环境开发》

  3. 《Docker下,两分钟极速体验Nacos配置中心》

  4. 《Docker下Nacos配置应用开发》

  5. 《Docker下Nacos持久化配置》;

官方操作指导

  • 下图是来自官方的操作指导,地址是:https://nacos.io/zh-cn/docs/deployment.html ,可见步骤很简单:

  • 如果您是在物理机上操作,按照上述步骤即可完成,如果您的 Nacos 部署在 Docker 上,下本文可以用来做参考:

环境信息

  1. Nacos server 版本:1.1.0

  2. 操作系统:CentOS Linux release 7.6.1810

  3. Docker:1.13.1, build b2f74b2/1.13.1

  4. docker-compose:1.24.1, build 4667896

  5. jdk:1.8.0_191

  6. maven:3.6.0



version: '2'services:  nacos:    image: bolingcavalry/nacosserver:0.0.1    container_name: nacos    restart: unless-stopped    ports:    - '8848:8848'  config-demo:    image: bolingcavalry/nacosconfigdemo:1.0-SNAPSHOT    container_name: config-demo    restart: unless-stopped    depends_on:    - nacos    ports:    - '8080:8080'
复制代码

Docker 环境操作步骤简介

  • 简单介绍一下整个实战的步骤:


  1. 准备初始化 nacos 数据库的 sql 脚本;

  2. docker-compose.yml 中增加 mysql,并设置容器创建时执行前面的 sql 脚本;

  3. 准备 nacos 配置文件给 docker-compose.yml 中 nacos 容器使用;

  4. 启动,验证功能正常;

  5. 检查数据库中是否有数据;

  6. 删除容器,再重建容器,确认数据可以完全恢复;


  • 接下来一起实战吧。

准备初始化 nacos 数据库的 sql 脚本

  1. 此 sql 用于创建 nacos server 运行所需的表和数据,去下载 nacos server 安装包,地址是:https://github.com/alibaba/nacos/releases/download/1.1.0/nacos-server-1.1.0.tar.gz

  2. 下载的安装包解压后,文件 nacos/conf/nacos-mysql.sql 就是我们所需的 sql 脚本;

  3. 打开此脚本,可见内容中没有创建数据库,这样的脚本在 mysql 的 docker 容器内无法自动执行,需要在 sql 文件的开始位置添加以下内容:


CREATE DATABASE nacos_config;use nacos_config;
复制代码


  1. 将文件 nacos-mysql.sql 放在 docker-compose.yml 所在目录下;

docker-compose.yml 中增加 mysql

  • 接下来在容器编排文件 docker-compose.yml 中增加 mysql 容器:

  • 在 docker-compose.yml 中增加 mysql 容器,新增的 mysql 编排信息放在最前面,内容如下:


mysql:    image: mysql:5.7.27    container_name: mysql    restart: unless-stopped    volumes:      - ./nacos-mysql.sql:/docker-entrypoint-initdb.d/nacos-mysql.sql      - ./mysqldata:/var/lib/mysql    command: --default-authentication-plugin=mysql_native_password    environment:      MYSQL_ROOT_PASSWORD: 123456
复制代码


  • 上述内容有几处需要注意:a. 第一个 volumes 参数将宿主机的 nacos-mysql.sql 映射到容器的 /docker-entrypoint-initdb.d/ 目录,mysql 容器启动时会执行这个目录下的所有以 sh 和 sql 结尾的文件;b. 第二个 volumes 参数将 docker-compose.yml 文件所在位置的 mysqldata 目录映射到容器的 /var/lib/mysql 目录,这样数据库所有数据都保存在宿主机上了,此 mysqldata 文件夹容器启动时自动创建;c. command 参数设置了 mysql 的鉴权方式是密码方式;d. 环境变量 MYSQL_ROOT_PASSWORD 设置了 mysql 的 root 密码为 123456;

准备 nacos 配置文件给 docker-compose.yml 中 nacos 容器使用

  • 接下来需要设置 nacos server 的参数,将 mysql 相关参数配置好,这样 nacos server 启动后就会使用 mysql 保存数据:

  • 进入刚才下载和解压的 nacos server 安装包,文件 nacos/conf/application.properties 就是我们所需的配置文件;

  • 将文件 application.properties 复制到 docker-compose.yml 所在目录;

  • 打开文件 application.properties ,在尾部新增以下内容,这些是 mysql 相关的配置:


spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://mysql:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb.user=rootdb.password=123456
复制代码


  • 打开 docker-compose.yml 文件,找到 nacos 的配置,修改后的内容如下:


nacos:    image: bolingcavalry/nacosserver:0.0.1    container_name: nacos    restart: unless-stopped    volumes:      - ./application.properties:/root/nacos/conf/application.properties    depends_on:      - mysql    ports:      - '8848:8848'
复制代码


  • 如上所示,nacos 的配置有两处修改:a. 增加 volumes,将宿主机的 application.properties 文件映射到容器中,作为 nacos 的配置文件;b. 增加依赖配置,在 mysql 容器启动成功后才会启动 nacos;

  • 完整的 docker-compose.yml 内容如下:


version: '2'services:  mysql:    image: mysql:5.7.27    container_name: mysql    restart: unless-stopped    volumes:      - ./nacos-mysql.sql:/docker-entrypoint-initdb.d/nacos-mysql.sql      - ./mysqldata:/var/lib/mysql    command: --default-authentication-plugin=mysql_native_password    ports:      - '3306:3306'    environment:      MYSQL_ROOT_PASSWORD: 123456  nacos:    image: bolingcavalry/nacosserver:0.0.1    container_name: nacos    restart: unless-stopped    volumes:      - ./application.properties:/root/nacos/conf/application.properties    depends_on:      - mysql    ports:      - '8848:8848'  config-demo:    image: bolingcavalry/nacosconfigdemo:1.0-SNAPSHOT    container_name: config-demo    restart: unless-stopped    depends_on:    - nacos    ports:    - '8080:8080'
复制代码


  • 至此,准备完毕,可以验证了;

验证


docker-compose up -d
复制代码


  • 我这里宿主机的 IP 是 192.168.121.131,登录 Nacos 的 web 页面,创建应用所需的配置项,地址是:http://192.168.121.131:8848/nacos ,用户名和密码都是 nacos;

  • 如下图,新增一个配置项:

  • 浏览器访问地址:http://192.168.121.131:8080/test ,如下图,可见应用已经从 nacos 取得了配置:

  • 再来看看 mysql 的数据;

  • 在宿主机执行命令 docker exec -it mysql /bin/bash 进入容器;

  • 进入容器后,执行命令 mysql -h127.0.0.1 -uroot -p123456 连接 MySQL;

  • 参考以下的命令,检查 MySQL 的数据,可见刚才配置的数据都存入了 MySQL:


mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || nacos_config       || performance_schema || sys                |+--------------------+5 rows in set (0.00 sec)
mysql> use nacos_config;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedmysql> show tables;+------------------------+| Tables_in_nacos_config |+------------------------+| config_info || config_info_aggr || config_info_beta || config_info_tag || config_tags_relation || group_capacity || his_config_info || roles || tenant_capacity || tenant_info || users |+------------------------+11 rows in set (0.00 sec)mysql> select * from config_info \G*************************** 1. row *************************** id: 1 data_id: my-nacos-config.yaml group_id: BOLING_CAVALRY content: bolingcavalry: desc: desc from nacos yaml config md5: f44c8fd76e8da757380e8f7ddabe6e70 gmt_create: 2019-08-31 13:53:01gmt_modified: 2019-08-31 13:53:01 src_user: NULL src_ip: 192.168.121.1 app_name: tenant_id: c_desc: nacos config demo c_use: NULL effect: NULL type: yaml c_schema: NULL1 row in set (0.00 sec)
复制代码


  • 至此,可以确定在 Docker 环境下,Nacos 使用 MySQL 进行持久化存储操作成功,接下来我们验证即使容器被删除,数据也可以恢复

删除容器,再重建容器,确认数据可以完全恢复

  • 在 docker-compose.yml 所在的目录下执行以下命令,会停止所有容器并将其删除:


docker-compose down
复制代码


  • 执行 docker ps -a ,确认宿主机上已经没有任何容器存在:


[root@maven test]# docker-compose downStopping config-demo ... doneStopping nacos       ... doneStopping mysql       ... doneRemoving config-demo ... doneRemoving nacos       ... doneRemoving mysql       ... doneRemoving network test_default[root@maven test]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
复制代码


  • 此时就相当于整个环境已经不存在了,但是 MySQL 的数据文件夹已经被映射到宿主机,就是 mysqldata 目录;

  • 接下来我们要做的是重新创建所有容器,但是要使用之前的数据,因此不需要再执行 nacos-mysql.sql 了,在 docker-compose.yml 中去掉 mysql 容器的 nacos-mysql.sql 这个 volumens 参数:


version: '2'services:  mysql:    image: mysql:5.7.27    container_name: mysql    restart: unless-stopped    volumes:      - ./mysqldata:/var/lib/mysql    command: --default-authentication-plugin=mysql_native_password    ports:      - '3306:3306'    environment:      MYSQL_ROOT_PASSWORD: 123456  nacos:    image: bolingcavalry/nacosserver:0.0.1    container_name: nacos    restart: unless-stopped    volumes:      - ./application.properties:/root/nacos/conf/application.properties    depends_on:      - mysql    ports:      - '8848:8848'  config-demo:    image: bolingcavalry/nacosconfigdemo:1.0-SNAPSHOT    container_name: config-demo    restart: unless-stopped    depends_on:    - nacos    ports:    - '8080:8080'
复制代码


  • 再次执行 docker-compose up -d ,启动所有容器;

  • 打开 nacos 的配置页面,原来的数据还在:

  • 访问 demo 应用,依然可以成功从 nacos 取得配置内容:

  • 至此,Docker 下 Nacos 持久化配置实战就完成了,希望能给您的容器化项目提供一些参考。

官方 Docker 服务

  • Naocs 的官方也给出了 Docker 下的 Nacos 镜像以及对应的编排操作指南,地址是:https://github.com/nacos-group/nacos-docker ,您也可以根据官方指导来实践,官方编排提供了更多的设置和配置,功能更强大,但是由于内容过多(例如 Mysql 使用了主从的容器设置),不适合本次文章的主题,因此我这里依然沿用了之前自己动手做的镜像;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022-10-13阅读数: 22
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Docker下Nacos持久化配置_Docker_程序员欣宸_InfoQ写作社区