写在前面:在学习阶段,我们想快速学习SpringCloudAlibaba功能,但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭,我们学习时的组件版本很可能和作者的不一致,又或者是各自环境不一,只能一坑又一坑的踩。因此,本篇博客针对这一痛点,进行nacos集群部署记录。
关于nacos的理论知识,以及单机版部署网上前人之述足矣。关于集群实战方面,我看了一些视频和博客,一般分为:
- window搭建(学习不建议)
- linux搭建(环境准备繁琐)
- docker单容器部署(集群模式启动\停止,修改配置繁琐)
- docker-compose部署(企业常用)
但关于docker-compose部署方式,一般都是单机单台版的,因此我想完善一下集群部署这块,并拓展一下docker-compose的使用方法,因为企业中部署经常需要用到。废话不多说,实战就开干!
一、环境准备
1. 虚拟机
- 软件VmWare
- 系统Centos7.6
- 内存分配:8G
关于虚拟机怎么配置,我推荐下面这篇博客,就不多介绍了。
2.安装docker
使用docker-compose,首先需要下载docker和docker-compose。关于docker的下载,完全可以参考我的另一篇博客:
Study-02-Docker安装http://t.csdnimg.cn/zrrdO当时跟着视频敲得博客,前面有些啰嗦。直接看从下面这部分开始复制粘贴即可:
ps:我上面的方法默认安装的最新版,当然撰写本博客时间,用的也是当前最新版。
3. 安装docker-compose
-
命令安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
ps:这种方法我没成功过,因为网不好,再者翻墙,容易连接超时。这里有个很恶心的地方,国内也有相关的源,下载速度很快,确实可以下,但是下下来不能用,这就很离谱,试了几个博客的都是这。
- 手动安装(推荐)
访问网址:
https://github.com/docker/compose/releaseshttps://github.com/docker/compose/releases这里以docker-compose v2.21.0为例
(1)点击Assets,下载 docker-compose-linux-x86_64
(2)上传文件
将docker-compose-linux-x86_64 上传至下面目录下(一般这个目录都有,没有的话自己创建)。关于怎么上传,Xshell和finalShell这些图形化工具都有。
ps:为什么选择这个目录,因为下载后默认就是这个目录。
bash
cd /usr/local/bin
上传到该目录下后,重命名为 docker-compose。
bash
mv docker-compose-linux-x86_64 docker-compose
接下来就是赋予权限。
bash
sudo chmod +x /usr/local/bin/docker-compose
安装完成后,进行验证:
bash
docker-compose --version
二、集群部署
使用docker-compose部署,首先梳理nacos集群需要什么:
- mysql 8.0 镜像(本版要求5.7+)
- nacos1.4.0 镜像 (版本根据项目来)
- 部署使用:一个msyql容器、三个nacos容器。
1. 创建目录
bash
sudo mkdir -p /usr/local/software/nacos
2. 构建docker-compose
(1)命令介绍
Compose 模板文件 - Docker --- 从入门到实践https://yeasy.gitbook.io/docker_practice/compose/compose_file(2)构建梳理
nacos需要配置mysql,所以mysql需要先运行。mysql 运行需要先初始化脚本,创建nacos数据库和相关表。
(3)创建mysql初始化文件
- 在nacos目录下创建init_mysql目录,然后创建init_nacos_mysql.sql文件。
bash
mkdir init_mysql
vim init_nacos_mysql.sql
- 进入nacos官网,拷贝nacos_db中的内容至init_nacos_mysql.sql中
网址:
由于官网sql不包括创建数据库内容,所以在创建表结构上面需要加入创建数据库语句:
sql
/******************************************/
/* 数据库 = nacos */
/* 字符集 = utf8mb4 */
/* 排序规则 = utf8mb4_general_ci */
/******************************************/
CREATE DATABASE IF NOT EXISTS nacos DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE nacos;
- wq保存退出即可
(4)创建文件
- 在上面创建的nacos目录下,执行:
bash
vim docker-compose.yml
- 输入 i 进入编辑模式,然后将下面内容复制进去,第三节我对文件会进行详解:
ps:复制时,不要忘记使用 i 进入编辑模式!然后就是如果你误操作了的话,在Esc命令模式下,依次输入:gg d G 可以快速清空文档。
这里我们使用了端口:8846、8847、8848三个端口作为服务端口。
bash
version: '3'
services:
mysql:
image: mysql:8.0.20
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d
- /usr/local/software/nacos/mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- nacos_network
nacos1:
image: nacos/nacos-server:1.4.0
container_name: nacos1
hostname: nacos1
environment:
- PREFER_HOST_MODE=hostname
- MODE=cluster
- NACOS_APPLICATION_PORT=8846
- NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- MYSQL_SERVICE_DB_NAME=nacos
ports:
- "8846:8846"
depends_on:
- mysql
networks:
- nacos_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 3
nacos2:
image: nacos/nacos-server:1.4.0
container_name: nacos2
hostname: nacos2
environment:
- PREFER_HOST_MODE=hostname
- MODE=cluster
- NACOS_APPLICATION_PORT=8847
- NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- MYSQL_SERVICE_DB_NAME=nacos
ports:
- "8847:8847"
depends_on:
- mysql
networks:
- nacos_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8847/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 3
nacos3:
image: nacos/nacos-server:1.4.0
container_name: nacos3
hostname: nacos3
environment:
- PREFER_HOST_MODE=hostname
- MODE=cluster
- NACOS_APPLICATION_PORT=8848
- NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- MYSQL_SERVICE_DB_NAME=nacos
ports:
- "8848:8848"
depends_on:
- mysql
networks:
- nacos_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 3
networks:
nacos_network:
driver: bridge
- 保存后退出
(5)启动
在nacos目录下,输入命令:
sql
docker-compose up -d
(6)检查
健康状态返回为healthy,说明集群部署成功:
传统客户端方法:
访问网址,查看集群启动情况(记得开放客户端对应端口的防火墙):
sql
sudo firewall-cmd --permanent --add-port=8848/tcp
sudo firewall-cmd --reload
如果想要远程访问数据库:记得防火墙开放3306端口。
至此,使用nacos集群部署完毕,下面是docker-compose启动和停止相关命令:
Tip: 要在docker-compose.yml同级目录下执行
- 首次创建命令(后台执行)
docker-compose up -d
- 启动命令
docker-compose start
- 重启命令
docker-compose restart
- 停止/删除命令
-
docker-compose down
这个命令不仅停止项目中定义的所有容器,还会删除它们。除了容器之外,与容器关联的网络、网络接口和默认的网络栈也会被删除。但请注意,除非你特别指定,否则挂载的卷(volumes)不会被删除。
-
docker-compose down --volumes
或docker-compose down -v
这个命令会做
docker-compose down
相同的所有事情,并且还会删除所有在docker-compose.yml
文件中定义的卷(volumes)。这是一种彻底清理项目的方式,因为它会移除所有数据。 -
docker-compose stop
这个命令只会停止容器,不会删除任何东西。所有的数据、网络设置和卷都会保留,以便后续可以通过
docker-compose start
再次启动。
当然对于集群快速部署,上面已经完成了,但是对于docker-compose构建,估计还是有很多明白的地方,下面我将在第三节分享自己的心得。
三、docker-compose详解
关于docker-compose基础知识,我在第二节的构建docker-compose中附的有网址,可以前去学习。下面我对本文编写的部署nacos文件进行详解。
1. 文件分析
bash
version: '3'
在docker-compose.yml
文件中,version: "3"
标志表示该文件使用的是Docker Compose的第3版语法。Docker Compose的不同版本提供了不同的特性和选项。版本3是为Docker 1.13及更高版本设计的,提供了一系列针对生产环境优化的新功能和改进。
sql
networks:
nacos_network:
driver: bridge
-
networks
: 定义了所有自定义网络的配置。 -
nacos_network
: 这是自定义网络的名称。 -
driver: bridge
: 指定使用桥接(bridge)驱动程序。桥接网络是Docker网络的一种类型,它使容器可以访问外部网络,同时还能让不同的容器互相通信。
当使用docker-compose up
启动服务时,Docker Compose会自动创建这个自定义网络,并且你在这个Compose文件里定义的所有服务都会连接到这个网络,从而能够在该网络内互相通信。
为什么要使用Dokcer网络?
隔离性: 不同的网络提供不同的隔离层,这样不同的应用或服务之间不会相互影响。这有助于增强安全性。
简化配置 : 使用Docker网络可以自动进行DNS解析,容器可以通过服务名称而不是IP地址进行通信,这大大简化了配置。
易于扩展: 当应用需要更多服务或组件时,可以很容易地将它们加入到现有的Docker网络中,而不需要对现有系统进行大量修改。
bash
mysql:
image: mysql:8.0.20
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d
- /usr/local/software/nacos/mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- nacos_network
- mysql:自定义服务名,可以用这个名称在Docker Compose内部引用这个服务。
- image: 指定使用哪个Docker镜像来创建容器,这里是MySQL的8.0.20版本。
- container_name: 定义容器的名称为mysql。
- environment: 定义环境变量。
- MYSQL_ROOT_PASSWORD=123456: 设置MySQL root用户的密码为123456。
- volumes: 映射宿主机和容器内的文件或目录。
- /usr/local/software/nacos/init_mysql:/docker-entrypoint-initdb.d: 将宿主机的/usr/local/software/nacos/init_mysql目录映射到容器的/docker-entrypoint-initdb.d目录。用于初始化数据库。
- /usr/local/software/nacos/mysql_data:/var/lib/mysql: 将宿主机的/usr/local/software/nacos/mysql_data目录映射到容器的/var/lib/mysql目录,用于保存MySQL的数据。
- ports: 端口映射。
- "3306:3306": 将容器的3306端口映射到宿主机的3306端口。
- networks: 网络设置。
- nacos_network: 这个容器将连接到名为nacos_network的自定义网络。
sql
nacos1:
image: nacos/nacos-server:1.4.0
container_name: nacos1
hostname: nacos1
environment:
- PREFER_HOST_MODE=hostname
- MODE=cluster
- NACOS_APPLICATION_PORT=8846
- NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- MYSQL_SERVICE_DB_NAME=nacos
ports:
- "8846:8846"
depends_on:
- mysql
networks:
- nacos_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8846/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 3
-
nacos1
: 服务名称,定义nacos1,nacos2,nacos3服务就可以在内部调用了。 -
image:
指定使用哪个Docker镜像来创建容器,这里是Nacos Server的1.4.0版本。 -
container_name:
定义容器的名称为nacos1
。 -
hostname:
设置容器内部的主机名为nacos1
,不写的话默认为容器id。 -
environment
: 定义环境变量。PREFER_HOST_MODE=hostname
:Nacos首选的主机模式设置为主机名,上面我们自定义为了nacos1。MODE=cluster
:Nacos运行在集群模式下。NACOS_APPLICATION_PORT=8846
:Nacos应用的端口。NACOS_SERVERS=nacos1:8846 nacos2:8847 nacos3:8848
:集群中其他Nacos服务器的地址和端口。(这里也可以写ip地址,但记得加"",例如:"192.168.64.1:8846 192.168.64.1:8847 192.168.64.1:8848
")SPRING_DATASOURCE_PLATFORM=mysql
:使用MySQL作为数据源。MYSQL_SERVICE_HOST=mysql
:MySQL服务的主机名。MYSQL_SERVICE_PORT=3306
:MySQL服务的端口。MYSQL_SERVICE_USER=root
:MySQL的用户。MYSQL_SERVICE_PASSWORD=123456
:MySQL用户的密码。MYSQL_SERVICE_DB_NAME=nacos
:使用的MySQL数据库名称。
-
ports
: 端口映射。"8846:8846"
: 将容器的8846端口映射到宿主机的8846端口。
-
depends_on
: 依赖服务。mysql
:nacos1
服务依赖于mysql
服务,mysql启动后才执行nacos1。还有一种
-
networks
: 网络设置。nacos_network
: 这个容器将连接到名为nacos_network
的自定义网络。
-
healthcheck
: 健康检查设置。test
: 执行的健康检查命令,nacos有健康检查命令。interval
: 检查间隔。timeout
: 超时时间。retries
: 重试次数。
其他集群配置和nacos1配置一致,只需要更改端口号和服务名就可以实现增加集群节点。
2. 其他问题
如何修改Nacos配置?
直接在environment中修改nacos参数即可,但是修改docker-compose后需要重新构建。但是需要重新启动服务。
重新启动服务: 有两种主要方法可以重新启动服务以应用更改。
-
全部重新启动 : 使用
docker-compose down
将现有的服务容器、网络、卷和图像全部停止并删除,然后使用docker-compose up
重新启动。 -
部分重新启动 : 如果你只是修改了一个服务,你也可以仅重新启动该服务。使用
docker-compose up -d <service_name>
来重新启动特定的服务。这样做通常更快,因为它不会影响到其他正在运行的服务。例如:只修改了nacos1服务,则执行:docker-compose up -d nacos1。
内存配置过大问题?
nacos会设置默认JVM参数,如果感觉比较大,可以自定义参数,在environment中增加下面的参数配置即可。最后根据情况选择重启服务方式。
- JVM_XMS=1g
- JVM_XMX=1g
- JVM_XMN=512m
出错了,如何查看日志?
docker logs -f 容器id
nacos状态不是healthy?
第一次构建,有时候会出现某个服务启动失败的情况,有可能是因为数据库容器没有及时启动,可以执行docker-compose restart命令重启试试。还有启动时间较长会处于Starting状态,耐心等待即可,如若不行,请使用上面的查看日志命令,具体定位原因。有可能会有疑惑,为什么docker-compose中使用了depends_on还会出现加载顺序失败的问题,下面进行补充:
-
启动顺序 : 使用
depends_on
会控制容器的启动顺序,但它不会等待依赖的服务"完全就绪"后再启动。例如,数据库可能需要一些时间初始化,但depends_on
不会等数据库初始化完成。 -
停止顺序 :
depends_on
也影响容器的停止顺序。依赖服务将先于依赖它的服务停止。 -
健康检查 : 如果你需要等待依赖服务完全启动(例如,数据库初始化完成),可以在
docker-compose.yml
中为依赖服务添加一个healthcheck
字段。 -
并非强制性 : 即使没有使用
depends_on
,所有服务仍然可以手动按任何顺序启动和停止。depends_on
只是自动化这个过程。
四、对比普通docker构建
1. 构建mysql
拉取镜像:
docker pull mysql:8.0.20
启动镜像:
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20
2. 构建nacos集群
bash
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8846 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8846:8846 \
--name my-nacos1 \
nacos/nacos-server:1.4.0
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8847 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8847:8847 \
--name my-nacos2 \
nacos/nacos-server:1.4.0
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="192.168.64.142:8846 192.168.64.142:8847 192.168.64.142:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.64.142 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_SERVER_IP=192.168.64.142 \
-p 8848:8848 \
--name my-nacos3 \
nacos/nacos-server:1.4.0
开放防火墙端口:
bash
sudo firewall-cmd --permanent --add-port=8846/tcp
sudo firewall-cmd --permanent --add-port=8847/tcp
sudo firewall-cmd --permanent --add-port=8848/tcp
sudo firewall-cmd --reload
测试访问:
http://192.168.64.142:8846/nacos
http://192.168.64.142:8847/nacos
http://192.168.64.142:8848/nacos
3. 优缺点对比
Docker Compose构建的优点:
-
简单性和一致性 : 通过一个
docker-compose.yml
文件,你可以定义整个应用环境的所有服务、网络和卷,这样可以确保每次部署都是一致的。 -
自动化 : 一条
docker-compose up
命令就可以启动你在docker-compose.yml
中定义的所有服务和依赖。 -
便于本地开发: 对于多服务应用,使用Docker Compose可以轻易地在本地机器上模拟生产环境。
-
依赖管理 : 通过
depends_on
字段,可以轻松管理服务间的依赖关系。 -
可读性和文档化 :
docker-compose.yml
文件也作为一种文档,可以让其他开发者或系统管理员快速了解应用的结构和服务。 -
网络配置: 简化了容器间网络连接的设置,自动配置了一个默认的网络环境。
-
缩放和负载均衡 : 使用
docker-compose
可以方便地扩展服务的实例数量。
Docker Compose构建的缺点:
-
复杂性: 对于单一应用或只有一个服务的简单项目,使用Docker Compose可能显得过于复杂。
-
学习曲线 : 相较于Docker单命令,需要时间学习
docker-compose.yml
文件的语法和选项。 -
不适用于生产: Docker Compose主要是为了简化开发和测试环境的配置,而不是用于生产环境。对于生产环境,更推荐使用如Kubernetes这样的容器编排工具。
-
资源消耗: 如果你在本地机器上运行多个容器,可能会消耗大量的资源。
Docker单台运行的优点:
-
简单快捷: 对于简单应用或单个服务,使用基础的Docker命令更为直接和快速。
-
更少的抽象: 没有额外的抽象层,有时候这样更容易理解和调试。
-
适用于生产: Docker容器可以在生产环境中单独运行,或者被集成到其他容器编排解决方案中。
Docker单台运行的缺点:
-
手动管理: 每个容器和服务都需要手动启动、停止和连接。
-
难以管理依赖: 如果有多个相互依赖的服务,手动管理它们会变得复杂和容易出错。
-
不易于复制: 没有一个统一的配置文件,迁移到另一台机器或共享给其他开发者会更困难。
-
缺乏自动化和一致性: 由于没有自动化脚本和定义好的配置,可能会导致环境不一致的问题。
本文详细介绍了docker-compose在单台服务器上构建集群,虽然真实开发中并不会这样做,而是使用的真实的服务器,搭建集群。但是通过本次搭建的过程,可以知道docker-compose的基本应用。如果道友有足够的时间,部署项目时不妨改造试试,假设你的微服务项目有:study_front,study_backend1,study_backend2,mysql等等。使用docker-compose部署构建可以很方便的管理和维护,迁移到别处也不会因为环境问题而头疼。
至此,一个使用docker-compose搭建nacos集群完毕,恭喜道友在学习之路上更进一步。这学习大道茫茫,然而你我都是这条路上的苦行僧,在此留下心得,祝你我都能修的圆满。咱们下一个路口(BUG)见!