使用docker搭建NACOS集群
SpringCloud Alibaba,必然会使用Nacos进行服务注册与配置管理。然而,在实际的生产环境中,使用单服务器搭建nacos服务器是十分危险的,如若发生宕机或网络故障,整个微服务将无法访问。因此,通常使用集群的方式进行部署。
Nacos搭建集群要求至少部署3台服务器实例。Nacos使用derby作为内嵌数据库,在使用集群作为部署方式时,内嵌数据库无法保持数据同步与数据一致,故一般使用外接MySQL数据库的方式保存配置文件。
架构图:
MySQL
由于nacos需要依赖于MySQL作为资源存储,所以在编写完整docker-compose之前我会先用docker启动临时的mysql容器,然后准备好nacos需要的数据库
- 启动临时容器
docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -v /app/cloud/mysql/data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
此处需要挂载宿主机目录,在启动docker-compse后就不需要再次初识化数据。
- 用mysql客户端连接你的容器,然后导入nacos的数据表
https://github.com/alibaba/nacos/tree/develop/distribution/conf/nacos-mysql.sql
- 停止容器,由于加了--rm参数,所以容器会自动删除
docker stop containerID
dockers-compose.yaml:
version: "3.9"
services:
mysql:
container_name: mysql
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- /app/cloud/mysql/data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
networks:
nacos_cluster_nginx:
ipv4_address: 172.19.0.5
nacos-cluster-1:
image: nacos/nacos-server:2.0.3
environment:
PREFER_HOST_MODE: ip
MODE: cluster
NACOS_SERVER_IP: 172.19.0.2
NACOS_SERVERS: "172.19.0.2:8848 172.19.0.3:8848 172.19.0.4:8848"
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 172.19.0.5
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: root
JVM_XMS: 256m
JVM_XMX: 512m
JVM_XMN: 256m
ports:
- "8860:8848"
restart: always
networks:
nacos_cluster_nginx:
ipv4_address: 172.19.0.2
nacos-cluster-2:
image: nacos/nacos-server:2.0.3
environment:
PREFER_HOST_MODE: ip
MODE: cluster
NACOS_SERVER_IP: 172.19.0.3
NACOS_SERVERS: "172.19.0.2:8848 172.19.0.3:8848 172.19.0.4:8848"
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 172.19.0.5
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: root
JVM_XMS: 256m
JVM_XMX: 512m
JVM_XMN: 256m
ports:
- "8862:8848"
restart: always
networks:
nacos_cluster_nginx:
ipv4_address: 172.19.0.3
nacos-cluster-3:
image: nacos/nacos-server:2.0.3
environment:
PREFER_HOST_MODE: ip
MODE: cluster
NACOS_SERVER_IP: 172.19.0.4
NACOS_SERVERS: "172.19.0.2:8848 172.19.0.3:8848 172.19.0.4:8848"
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 172.19.0.5
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: root
JVM_XMS: 256m
JVM_XMX: 512m
JVM_XMN: 256m
ports:
- "8864:8848"
restart: always
networks:
nacos_cluster_nginx:
ipv4_address: 172.19.0.4
nginx:
image: nginx:latest
restart: always
ports:
- "8081:80"
volumes:
- /etc/nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- nacos-cluster-1
- nacos-cluster-2
- nacos-cluster-3
networks:
nacos_cluster_nginx:
ipv4_address: 172.19.0.6
networks:
nacos_cluster_nginx:
ipam:
config:
- subnet: 172.19.0.0/16
nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream
{
upstream nacos {
server 172.19.0.2:8848;
server 172.19.0.3:8848;
server 172.19.0.4:8848;
}
server {
listen 80;
proxy_pass nacos;
}
}
执行以下命令启动:
docker-compose up -d
访问nginx页面