使用docker-compose搭建高可用Nacos注册中心
写在前面
关于nacos1.x和nacos2.x的区别以及使用方式,参考下面一篇链接
Nacos2.0兼容性及使用
使用docker
Nacos1.x
单机方式搭建
进入docker hub,查找镜像
按照说明启动
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: demo
profiles:
active: test
cloud:
nacos:
server-addr: 192.168.101.170:8848
config:
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.4
container_name: nacos
restart: always
ports:
- '8848:8848'
environment:
MODE: standalone
JVM_XMX: 512m
JVM_MS: 168m
JVM_MMS: 168m
JVM_XMN: 288m
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8848/nacos/actuator/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
logging:
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: mysql image: mysql:8.0.28 restart: always ports: - '3306:3306' environment: MYSQL_ROOT_PASSWORD: "123456" TZ: Asia/Shanghai volumes: - ./data:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d/ networks: - nacos deploy: resources: limits: cpus: '0.5' memory: '512M' healthcheck: test: ["CMD","mysqladmin","-uroot","-p123456","ping","-h","localhost"] timeout: 20s retries: 10 nacos: container_name: nacos image: lhstack/nacos:1.4.4 restart: always ports: - '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/Shanghai 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_healthy networks: nacos: ipv4_address: 10.42.0.10 deploy: resources: limits: cpus: '1' memory: 384M nacos1: container_name: nacos1 image: lhstack/nacos:1.4.4 restart: always ports: - '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/Shanghai NACOS_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_healthy networks: nacos: ipv4_address: 10.42.0.11 deploy: resources: limits: cpus: '1' memory: 384M networks: nacos: driver: bridge ipam: driver: default config: - 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.1
container_name: nacos
restart: always
ports:
- '8848:8848'
- '9848:9848'
environment:
MODE: standalone
JVM_XMX: 512m
JVM_MS: 168m
JVM_MMS: 168m
JVM_XMN: 288m
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8848/nacos/actuator/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
logging:
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: mysql image: mysql:8.0.28 restart: always ports: - '3306:3306' environment: MYSQL_ROOT_PASSWORD: "123456" TZ: Asia/Shanghai volumes: - ./data:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d/ networks: - nacos deploy: resources: limits: cpus: '0.5' memory: '512M' healthcheck: test: ["CMD","mysqladmin","-uroot","-p123456","ping","-h","localhost"] timeout: 20s retries: 10 nacos: container_name: nacos image: lhstack/nacos:2.1.1 restart: always ports: - '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/Shanghai 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_healthy networks: nacos: ipv4_address: 10.42.0.10 deploy: resources: limits: cpus: '1' memory: 384M nacos1: container_name: nacos1 image: lhstack/nacos:2.1.1 restart: always ports: - '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/Shanghai NACOS_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_healthy networks: nacos: ipv4_address: 10.42.0.11 deploy: resources: limits: cpus: '1' memory: 384M networks: nacos: driver: bridge ipam: driver: default config: - subnet: 10.42.0.0/16 EOF
启动并使用浏览器访问
docker-compose up -d
添加配置并使用客户端测试