使用docker-compose搭建高可用Nacos注册中心
- 写在前面
- 使用docker
- Nacos1.x
- 单机方式搭建
- 进入docker hub,查找镜像
- 按照说明启动
- 通过浏览器访问
- 添加配置并使用客户端测试
- 集群方式搭建
- 搭建nacos需要的数据库环境
- 编写nacos集群的docker脚本并启动
- Nacos2.x
- 单机方式搭建
- 按照说明启动
- 通过浏览器访问,并添加配置
- 客户端使用
- 集群方式搭建
- 搭建nacos需要的数据库环境
- 编写nacos集群的docker脚本并启动
- 使用docker-compose
- Nacos1.x
- 单机方式搭建
- 编写docker-compose.yaml脚本
- 执行docker-compose脚本
- 使用浏览器访问
- 添加配置并使用客户端测试
- 集群方式搭建
- 生成nacos集群需要的sql文件
- 生成docker-compose.yaml文件
- 启动并使用浏览器访问
- 添加配置,并使用客户端连接
- Nacos2.x
- 单机方式搭建
- 编写docker-compose.yaml脚本
- 启动并使用浏览器访问
- 添加配置并使用客户端测试
- 集群方式搭建
- 生成nacos集群需要的sql文件
- 生成docker-compose.yaml文件
- 启动并使用浏览器访问
- 添加配置并使用客户端测试
写在前面
关于nacos1.x和nacos2.x的区别以及使用方式,参考下面一篇链接
Nacos2.0兼容性及使用
使用docker
Nacos1.x
单机方式搭建
进入docker hub,查找镜像
NaocsImage
按照说明启动
docker run --name nacos -p 8848:8848 -e JVM_XMS="512m" -e -JVM_XMX="512m" -e JVM_MS="168m" -e JVM_MMS="168m" -e JVM_XMN="288m" -e MODE=standalone -d lhstack/nacos:1.4.4
通过浏览器访问
添加配置并使用客户端测试
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>nacos-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos-demo</name><description>nacos-demo</description><properties><java.version>11</java.version><spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
bootstrap.yml
spring:application:name: demoprofiles:active: testcloud:nacos:server-addr: 192.168.101.170:8848config:file-extension: yml
集群方式搭建
这里使用脚本方式搭建,方便维护
搭建nacos需要的数据库环境
-
生成sql以及使用docker启动的数据库脚本
相关sql脚本,去官网下载,这里搭建1.4.4版本的nacos,对应sql也是1.4.4的
Nacos1.4.4-sql
注意,这里需要在sql内容之前添加创建数据库的sql语句,方便在mysql启动时自动加载sql创建对应表
## 在sql文件最前面添加以下两行即可 CREATE DATABASE `nacos` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `nacos`;
## 创建nacos目录和sql目录 mkdir -p nacos/sql && cd nacos/sql ## 下载sql脚本 wget https://gitee.com/mirrors/Nacos/raw/1.4.4/distribution/conf/nacos-mysql.sql ## 在最前面添加数据库创建的sql sed -i "1iCREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" nacos-mysql.sql sed -i "2iUSE nacos;" nacos-mysql.sql cd .. # 生成docker启动脚本 cat > nacos-mysql.sh <<EOF #/bin/bash docker rm -f mysql docker network rm nacos docker network create --driver=bridge --ipam-driver=default --subnet=10.42.0.0/16 nacos docker run --name mysql --restart=always --network=nacos --hostname=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -v \${PWD}/sql:/docker-entrypoint-initdb.d/ -v \${PWD}/data:/var/lib/mysql -d mysql:8.0.28 EOF
-
执行启动docker-mysql的sh脚本
sh nacos-mysql.sh
-
通过navicat等数据库客户端工具连接查看
编写nacos集群的docker脚本并启动
-
通过nacos镜像地址的说明,可以发现,搭建集群需要几个参数,分别是
NACOS_SERVERS: nacos集群地址 MYSQL_SERVICE_HOST: 数据库host MYSQL_SERVICE_USER: 数据库用户名 MYSQL_SERVICE_PASSWORD: 数据库密码 MYSQL_SERVICE_DB_NAME: 数据库名称 SPRING_DATASOURCE_PLATFORM: 数据库类型,这里是mysql MYSQL_SERVICE_DB_PARAM: 数据库连接扩展参数
-
编写脚本
cat > nacos-cluster.env <<EOF NACOS_SERVERS=10.42.0.10 10.42.0.11 TZ=Asia/Shanghai MYSQL_SERVICE_HOST=mysql MYSQL_SERVICE_USER=root MYSQL_SERVICE_PASSWORD=123456 MYSQL_SERVICE_DB_NAME=nacos MYSQL_SERVICE_DB_PARAM=allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false SPRING_DATASOURCE_PLATFORM=mysql JVM_XMX=384m JVM_XMS=384m JVM_XMN=192m JVM_MS=128m JVM_MMS=128m EOF cat > nacos-cluster.sh <<EOF #/bin/bash docker rm -f nacos nacos1 docker run --name nacos --restart=always --ip=10.42.0.10 --network=nacos --hostname=nacos -p 8848:8848 --env-file=\${PWD}/nacos-cluster.env -d lhstack/nacos:1.4.4 docker run --name nacos1 --restart=always --ip=10.42.0.11 --network=nacos --hostname=nacos -p 8849:8848 --env-file=\${PWD}/nacos-cluster.env -d lhstack/nacos:1.4.4 EOF
-
执行脚本,启动nacos集群
sh nacos-cluster.sh
-
浏览器访问并添加配置
-
使用客户端测试
Nacos2.x
nacos2.x使用的grpc,采用ip偏移量的方式,比如http暴露的端口是8848,grpc暴露的端口对应就是9848
单机方式搭建
按照说明启动
# 关闭之前的nacos容器,如果没有启动,则可以不管
docker rm -f nacos
docker run --name nacos -p 8848:8848 -p 9848:9848 -e JVM_XMS="512m" -e -JVM_XMX="512m" -e JVM_MS="168m" -e JVM_MMS="168m" -e JVM_XMN="288m" -e MODE=standalone -d lhstack/nacos:2.1.1
通过浏览器访问,并添加配置
- 浏览器访问,并添加配置
客户端使用
- 版本依赖
这里由于服务端是2.x的版本,因此客户端依赖的版本从2.2.6.RELEASE修改为2.2.7.RELEASE
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>nacos-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos-demo</name><description>nacos-demo</description><properties><java.version>11</java.version><spring.cloud.alibaba.version>2.2.7.RELEASE</spring.cloud.alibaba.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
- 配置
- 启动验证
集群方式搭建
搭建nacos需要的数据库环境
-
生成sql以及使用docker启动的数据库脚本
相关sql脚本,去官网下载,这里搭建2.1.1版本的nacos,对应sql也是2.1.1的
Nacos2.1.1-sql
注意,这里需要在sql内容之前添加创建数据库的sql语句,方便在mysql启动时自动加载sql创建对应表
## 在sql文件最前面添加以下两行即可 CREATE DATABASE `nacos` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `nacos`;
## 创建nacos目录和sql目录 mkdir -p nacos/sql && cd nacos/sql ## 下载sql脚本 wget https://gitee.com/mirrors/Nacos/raw/2.1.1/distribution/conf/nacos-mysql.sql ## 在最前面添加数据库创建的sql sed -i "1iCREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" nacos-mysql.sql sed -i "2iUSE nacos;" nacos-mysql.sql cd .. # 生成docker启动脚本 cat > nacos-mysql.sh <<EOF #/bin/bash docker rm -f mysql docker network rm nacos docker network create --driver=bridge --ipam-driver=default --subnet=10.42.0.0/16 nacos docker run --name mysql --restart=always --network=nacos --hostname=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -v \${PWD}/sql:/docker-entrypoint-initdb.d/ -v \${PWD}/data:/var/lib/mysql -d mysql:8.0.28 EOF
-
执行启动docker-mysql的sh脚本
sh nacos-mysql.sh
-
通过navicat等数据库客户端工具连接查看
编写nacos集群的docker脚本并启动
- 通过nacos镜像地址的说明,可以发现,搭建集群需要几个参数,分别是
NACOS_SERVERS: nacos集群地址 MYSQL_SERVICE_HOST: 数据库host MYSQL_SERVICE_USER: 数据库用户名 MYSQL_SERVICE_PASSWORD: 数据库密码 MYSQL_SERVICE_DB_NAME: 数据库名称 SPRING_DATASOURCE_PLATFORM: 数据库类型,这里是mysql MYSQL_SERVICE_DB_PARAM: 数据库连接扩展参数
- 编写脚本
cat > nacos-cluster.env <<EOF NACOS_SERVERS=10.42.0.10 10.42.0.11 TZ=Asia/Shanghai MYSQL_SERVICE_HOST=mysql MYSQL_SERVICE_USER=root MYSQL_SERVICE_PASSWORD=123456 MYSQL_SERVICE_DB_NAME=nacos MYSQL_SERVICE_DB_PARAM=allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false SPRING_DATASOURCE_PLATFORM=mysql JVM_XMX=384m JVM_XMS=384m JVM_XMN=192m JVM_MS=128m JVM_MMS=128m EOF cat > nacos-cluster.sh <<EOF #/bin/bash docker rm -f nacos nacos1 docker run --name nacos --restart=always --ip=10.42.0.10 --network=nacos --hostname=nacos -p 8848:8848 -p 9848:9848 --env-file=\${PWD}/nacos-cluster.env -d lhstack/nacos:2.1.1 docker run --name nacos1 --restart=always --ip=10.42.0.11 --network=nacos --hostname=nacos -p 8849:8848 -p 9849:9848 --env-file=\${PWD}/nacos-cluster.env -d lhstack/nacos:2.1.1 EOF
- 执行脚本,启动nacos集群
sh nacos-cluster.sh
- 通过浏览器访问,并添加配置
- 使用客户端连接
使用docker-compose
Nacos1.x
单机方式搭建
编写docker-compose.yaml脚本
# 停掉之前的容器
docker rm -f nacos nacos1 mysql
# 生成docker-compose脚本
cat > docker-compose.yaml <<EOF
version: '3'
services:nacos:image: lhstack/nacos:1.4.4container_name: nacosrestart: alwaysports:- '8848:8848'environment:MODE: standaloneJVM_XMX: 512mJVM_MS: 168mJVM_MMS: 168mJVM_XMN: 288mhealthcheck:test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8848/nacos/actuator/health' || exit 1"]timeout: 2sinterval: 10sretries: 5start_period: 15slogging:options:max-file: '1'max-size: '32k'deploy:resources:limits:cpus: '20m'memory: '512M'
EOF
- 运行上面的脚本
执行docker-compose脚本
docker-compose up -d
使用浏览器访问
添加配置并使用客户端测试
集群方式搭建
注意,所有操作都在demo目录下面,请确认清楚
生成nacos集群需要的sql文件
相关sql脚本,去官网下载,这里搭建1.4.4版本的nacos,对应sql也是1.4.4的
Nacos1.4.4-sql
注意,这里需要在sql内容之前添加创建数据库的sql语句,方便在mysql启动时自动加载sql创建对应表
## 删除之前的数据库生成的数据和sql文件
rm -rf data sql
## 创建nacos目录和sql目录
mkdir -p nacos/sql && cd nacos/sql
## 下载sql脚本
wget https://gitee.com/mirrors/Nacos/raw/1.4.4/distribution/conf/nacos-mysql.sql
## 在最前面添加数据库创建的sql
sed -i "1iCREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" nacos-mysql.sql
sed -i "2iUSE nacos;" nacos-mysql.sql
cd ..
生成docker-compose.yaml文件
-
删除为使用的网卡
docker network prune
-
生成docker-compose.yaml文件
cat > docker-compose.yaml <<EOF version: '3' services:mysql:container_name: mysqlimage: mysql:8.0.28restart: alwaysports:- '3306:3306'environment:MYSQL_ROOT_PASSWORD: "123456"TZ: Asia/Shanghaivolumes:- ./data:/var/lib/mysql- ./sql:/docker-entrypoint-initdb.d/networks:- nacosdeploy:resources:limits:cpus: '0.5'memory: '512M'healthcheck:test: ["CMD","mysqladmin","-uroot","-p123456","ping","-h","localhost"]timeout: 20sretries: 10nacos:container_name: nacosimage: lhstack/nacos:1.4.4restart: alwaysports:- '8848:8848'environment:MYSQL_SERVICE_DB_PARAM: "allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false"NACOS_SERVERS: "10.42.0.10 10.42.0.11"TZ: Asia/ShanghaiMYSQL_SERVICE_HOST: 'mysql'MYSQL_SERVICE_USER: 'root'MYSQL_SERVICE_PASSWORD: '123456'MYSQL_SERVICE_DB_NAME: 'nacos'SPRING_DATASOURCE_PLATFORM: 'mysql'JVM_XMX: '384m'JVM_XMS: '384m'JVM_XMN: '192m'JVM_MS: '128m'JVM_MMS: '128m'logging:options:max-file: '1'max-size: '16k'depends_on:mysql:condition: service_healthynetworks:nacos:ipv4_address: 10.42.0.10deploy:resources:limits:cpus: '1'memory: 384Mnacos1:container_name: nacos1image: lhstack/nacos:1.4.4restart: alwaysports:- '8849:8848'environment:MYSQL_SERVICE_DB_PARAM: "allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false"TZ: Asia/ShanghaiNACOS_SERVERS: "10.42.0.10 10.42.0.11"MYSQL_SERVICE_HOST: 'mysql'MYSQL_SERVICE_USER: 'root'MYSQL_SERVICE_PASSWORD: '123456'MYSQL_SERVICE_DB_NAME: 'nacos'SPRING_DATASOURCE_PLATFORM: 'mysql'JVM_XMX: '384m'JVM_XMS: '384m'JVM_XMN: '192m'JVM_MS: '128m'JVM_MMS: '128m'logging:options:max-file: '1'max-size: '16k'depends_on:mysql:condition: service_healthynetworks:nacos:ipv4_address: 10.42.0.11deploy:resources:limits:cpus: '1'memory: 384M networks:nacos:driver: bridgeipam:driver: defaultconfig:- subnet: 10.42.0.0/16 EOF
启动并使用浏览器访问
添加配置,并使用客户端连接
Nacos2.x
单机方式搭建
编写docker-compose.yaml脚本
# 停掉之前的容器
docker rm -f nacos nacos1 mysql
# 生成docker-compose脚本
cat > docker-compose.yaml <<EOF
version: '3'
services:nacos:image: lhstack/nacos:2.1.1container_name: nacosrestart: alwaysports:- '8848:8848'- '9848:9848'environment:MODE: standaloneJVM_XMX: 512mJVM_MS: 168mJVM_MMS: 168mJVM_XMN: 288mhealthcheck:test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8848/nacos/actuator/health' || exit 1"]timeout: 2sinterval: 10sretries: 5start_period: 15slogging:options:max-file: '1'max-size: '32k'deploy:resources:limits:cpus: '20m'memory: '512M'
EOF
启动并使用浏览器访问
docker-compose up -d
添加配置并使用客户端测试
集群方式搭建
注意,所有操作都在demo目录下面,请确认清楚
生成nacos集群需要的sql文件
相关sql脚本,去官网下载,这里搭建2.1.1版本的nacos,对应sql也是2.1.1的
Nacos2.1.1-sql
注意,这里需要在sql内容之前添加创建数据库的sql语句,方便在mysql启动时自动加载sql创建对应表
## 删除之前的数据库生成的数据和sql文件
rm -rf data sql
## 创建nacos目录和sql目录
mkdir -p nacos/sql && cd nacos/sql
## 下载sql脚本
wget https://gitee.com/mirrors/Nacos/raw/2.1.1/distribution/conf/nacos-mysql.sql
## 在最前面添加数据库创建的sql
sed -i "1iCREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" nacos-mysql.sql
sed -i "2iUSE nacos;" nacos-mysql.sql
cd ..
生成docker-compose.yaml文件
-
清除之前的痕迹
docker rm -f nacos nacos1 mysql #删除为使用的网卡 docker network prune
-
生成docker-compose.yaml文件
cat > docker-compose.yaml <<EOF version: '3' services:mysql:container_name: mysqlimage: mysql:8.0.28restart: alwaysports:- '3306:3306'environment:MYSQL_ROOT_PASSWORD: "123456"TZ: Asia/Shanghaivolumes:- ./data:/var/lib/mysql- ./sql:/docker-entrypoint-initdb.d/networks:- nacosdeploy:resources:limits:cpus: '0.5'memory: '512M'healthcheck:test: ["CMD","mysqladmin","-uroot","-p123456","ping","-h","localhost"]timeout: 20sretries: 10nacos:container_name: nacosimage: lhstack/nacos:2.1.1restart: alwaysports:- '8848:8848'- '9848:9848'environment:MYSQL_SERVICE_DB_PARAM: "allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false"NACOS_SERVERS: "10.42.0.10 10.42.0.11"TZ: Asia/ShanghaiMYSQL_SERVICE_HOST: 'mysql'MYSQL_SERVICE_USER: 'root'MYSQL_SERVICE_PASSWORD: '123456'MYSQL_SERVICE_DB_NAME: 'nacos'SPRING_DATASOURCE_PLATFORM: 'mysql'JVM_XMX: '384m'JVM_XMS: '384m'JVM_XMN: '192m'JVM_MS: '128m'JVM_MMS: '128m'logging:options:max-file: '1'max-size: '16k'depends_on:mysql:condition: service_healthynetworks:nacos:ipv4_address: 10.42.0.10deploy:resources:limits:cpus: '1'memory: 384Mnacos1:container_name: nacos1image: lhstack/nacos:2.1.1restart: alwaysports:- '8849:8848'- '9849:9848'environment:MYSQL_SERVICE_DB_PARAM: "allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&characterEncoding=UTF8&serverTimezone=UTC&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false"TZ: Asia/ShanghaiNACOS_SERVERS: "10.42.0.10 10.42.0.11"MYSQL_SERVICE_HOST: 'mysql'MYSQL_SERVICE_USER: 'root'MYSQL_SERVICE_PASSWORD: '123456'MYSQL_SERVICE_DB_NAME: 'nacos'SPRING_DATASOURCE_PLATFORM: 'mysql'JVM_XMX: '384m'JVM_XMS: '384m'JVM_XMN: '192m'JVM_MS: '128m'JVM_MMS: '128m'logging:options:max-file: '1'max-size: '16k'depends_on:mysql:condition: service_healthynetworks:nacos:ipv4_address: 10.42.0.11deploy:resources:limits:cpus: '1'memory: 384M networks:nacos:driver: bridgeipam:driver: defaultconfig:- subnet: 10.42.0.0/16 EOF
启动并使用浏览器访问
docker-compose up -d
添加配置并使用客户端测试