使用Docker搭建Nacos的持久化和集群部署

目录

1. 准备 

1.1 mysql安装

1.2 创建nacos需要的数据库

1.3 下载nacos镜像

1.4 创建自定义网络 (可省略)

1.5 获取nginx镜像

2. nacos集群部署

2.1 将mysql连接到mynet网络(可以省略)

2.2 nacos集群

2.3 使用nginx访问集群


1. 准备 

1.1 mysql安装

  • 下载镜像
docker pull mysql/mysql-server:5.7
  • 在宿主机中相关目录,用于挂载容器的相关数据
mkdir -p /data/mysql/{conf,data}
  • 编写my.cnf配置文件,在/data/mysql/conf目录中 (或下载 直接上传即可)

my.cnf.txt - 蓝奏云 / 需要把后面的txt扩展名删除

[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
##官方的配置
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


##下面为添加的自定义配置
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# modeified: 
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_allowed_packet=10M
default-time_zone='+8:00'
default_authentication_plugin=mysql_native_password
  • 创建并启动mysql容器
    docker run -p 3306:3306 \
          --name mysql \
          -v /data/mysql/conf/my.cnf:/etc/my.cnf \
          -v /data/mysql/data:/var/lib/mysql \
          --privileged=true \
          --restart=always \
          -e MYSQL_ROOT_PASSWORD=123456 \
          -d mysql/mysql-server:5.7
    

    参数说明:

    -p 3306:3306:宿主机端口:容器端口

    --name mysql:容器名字

    -v:挂载宿主机的一个目录, 持久化存储的关键所在,将主机目录挂载到容器对应目录,分别是:配置文件、日志文件、数据文件

    -v /data/mysql/conf:/etc/mysql/conf.d

    -v /data/mysql/logs:/logs

    -v /data/mysql/data:/var/lib/mysq

    --privileged=true:使用该参数,container内的root拥有真正的root权限, 否则,container内的root只是外部的一个普通用户权限

    --restart=always:容器自动启动参数,其值可以为[no,on-failure,always]

    no为默认值,表示容器退出时,docker不自动重启容器

    on-failure表示,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃

    always表示,只要容器退出,则docker将自动重启容器

    -e MYSQL_ROOT_PASSWORD=123456:设置root的密码

    -d mysql/mysql-server:5.7:后台启动模式及使用的镜像

  • 修改mysql允许Navicat远程连接
    # 进入容器
    docker exec -it mysql /bin/bash
    
    # 登录
    mysql -u root -p;
    
    # 授权
    grant all privileges on *.* to root@'%' identified by '123456';
    
    # 刷新权限
    flush privileges; 
    

    1.2 创建nacos需要的数据库

  • 将3306端口加入防火墙,使用mysql客户端链接数据库
  • 创建数据库
    CREATE DATABASE IF NOT EXISTS nacos_config
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;
    

    数据表

    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info   */
    /******************************************/
    CREATE TABLE `config_info` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(255) DEFAULT NULL,
      `content` longtext NOT NULL COMMENT 'content',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
      `app_name` varchar(128) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      `c_desc` varchar(256) DEFAULT NULL,
      `c_use` varchar(64) DEFAULT NULL,
      `effect` varchar(64) DEFAULT NULL,
      `type` varchar(64) DEFAULT NULL,
      `c_schema` text,
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_aggr   */
    /******************************************/
    CREATE TABLE `config_info_aggr` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(255) NOT NULL COMMENT 'group_id',
      `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
      `content` longtext NOT NULL COMMENT '内容',
      `gmt_modified` datetime NOT NULL COMMENT '修改时间',
      `app_name` varchar(128) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
    
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_beta   */
    /******************************************/
    CREATE TABLE `config_info_beta` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL COMMENT 'content',
      `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_tag   */
    /******************************************/
    CREATE TABLE `config_info_tag` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
      `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL COMMENT 'content',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_tags_relation   */
    /******************************************/
    CREATE TABLE `config_tags_relation` (
      `id` bigint(20) NOT NULL COMMENT 'id',
      `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
      `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
      `nid` bigint(20) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`nid`),
      UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
      KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = group_capacity   */
    /******************************************/
    CREATE TABLE `group_capacity` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
      `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
      `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
      `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
      `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
      `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
      `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_group_id` (`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = his_config_info   */
    /******************************************/
    CREATE TABLE `his_config_info` (
      `id` bigint(64) unsigned NOT NULL,
      `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `data_id` varchar(255) NOT NULL,
      `group_id` varchar(128) NOT NULL,
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL,
      `md5` varchar(32) DEFAULT NULL,
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
      `src_user` text,
      `src_ip` varchar(20) DEFAULT NULL,
      `op_type` char(10) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      PRIMARY KEY (`nid`),
      KEY `idx_gmt_create` (`gmt_create`),
      KEY `idx_gmt_modified` (`gmt_modified`),
      KEY `idx_did` (`data_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
    
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = tenant_capacity   */
    /******************************************/
    CREATE TABLE `tenant_capacity` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
      `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
      `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
      `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
      `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
      `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
      `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
      `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
    
    
    CREATE TABLE `tenant_info` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `kp` varchar(128) NOT NULL COMMENT 'kp',
      `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
      `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
      `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
      `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
      `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
      `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
      KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
    
    CREATE TABLE users (
        username varchar(50) NOT NULL PRIMARY KEY,
        password varchar(500) NOT NULL,
        enabled boolean NOT NULL
    );
    
    CREATE TABLE roles (
        username varchar(50) NOT NULL,
        role varchar(50) NOT NULL
    );
    
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
    
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
    

    导进去数据后 我们将数据库容器删除 ,重新创建外网不可访问mysql

    没有自定义网络 先设置自定义网咯

    如下使用  –subnet创建网络(用来指定ip段),–gateway(用来指定网关),my_net为创建的名字

     sudo docker network create --driver bridge --subnet 192.168.0.1/16 --gateway 192.168.0.1 mynet
    
       docker run \
             --name mysql \
             --net mynet \
             --ip 192.168.0.11 \
             -v /data/mysql/conf/my.cnf:/etc/my.cnf \
             -v /data/mysql/data:/var/lib/mysql \
             --privileged=true \
             --restart=always \
             -e MYSQL_ROOT_PASSWORD=123456 \
             -d mysql/mysql-server:5.7   

    1.3 下载nacos镜像

    docker pull nacos/nacos-server:1.1.4

    1.4 创建自定义网络 (可省略)

    docker network create mynet --subnet=192.168.0.0/16

    1.5 获取nginx镜像

    docker pull nginx

    2. nacos集群部署

    因为机器配置较低,本例使用两台nacos服务器演示集群,在真实环境下,为了便于主节点选举,通常集群机器通常为奇数台。

    2.1 将mysql连接到mynet网络(可以省略)

    docker network connect mynet mysql --ip 192.168.0.11

    此时可以查看mynet网络的具体配置:

    docker network inspect mynet

    注: 如果mysql容器还没有创建,也可以创建mysql容器时指定网络配置,(上面已经将mysql连接到mynet,所以不用执行此步):

    docker run \
             --name mysql \
             --net mynet \
             --ip 192.168.0.11 \
             -v /data/mysql/conf/my.cnf:/etc/my.cnf \
             -v /data/mysql/data:/var/lib/mysql \
             --privileged=true \
             --restart=always \
             -e MYSQL_ROOT_PASSWORD=123456 \
             -d mysql/mysql-server:5.7 
    

    2.2 nacos集群

  • 启动第一个节点nacos节点
    docker run -d \
               --net mynet \
               --ip 192.168.0.21 \
               -e PREFER_HOST_MODE=ip \
               -e MODE=cluster \
               -e NACOS_SERVERS="192.168.0.22:8848" \
               -e SPRING_DATASOURCE_PLATFORM=mysql \
               -e MYSQL_MASTER_SERVICE_HOST=192.168.0.11 \
               -e MYSQL_MASTER_SERVICE_PORT=3306 \
               -e MYSQL_MASTER_SERVICE_USER=root \
               -e MYSQL_MASTER_SERVICE_PASSWORD=123456 \
               -e MYSQL_MASTER_SERVICE_DB_NAME=nacos_config \
               -e MYSQL_DATABASE_NUM=1 \
               -e NACOS_SERVER_PORT=8848 \
               --name nacos01 \
               --restart=always \
               nacos/nacos-server:1.1.4
    

  • 启动第二个nacos节点
    docker run -d \
               --net mynet \
               --ip 192.168.0.22 \
               -e PREFER_HOST_MODE=ip \
               -e MODE=cluster \
               -e NACOS_SERVERS="192.168.0.21:8848" \
               -e SPRING_DATASOURCE_PLATFORM=mysql \
               -e MYSQL_MASTER_SERVICE_HOST=192.168.0.11 \
               -e MYSQL_MASTER_SERVICE_PORT=3306 \
               -e MYSQL_MASTER_SERVICE_USER=root \
               -e MYSQL_MASTER_SERVICE_PASSWORD=123456 \
               -e MYSQL_MASTER_SERVICE_DB_NAME=nacos_config \
               -e MYSQL_DATABASE_NUM=1 \
               -e NACOS_SERVER_PORT=8848 \
               --name nacos02 \
               --restart=always \
               nacos/nacos-server:1.1.4
    

    2.3 使用nginx访问集群

  • 创建宿主机挂载目录
    [root@localhost data]# mkdir -p /data/nginx/{conf,log,html}

  • 上传nginx.conf配置文件(上传到/data/nginx/conf目录即可)
  • 配置文件内容如下

    worker_processes 1;
    
    events {
        worker_connections 1024;
    }
    
    http {
        include mime.types;
        default_type  application/octet-stream;
        sendfile on;
    
        keepalive_timeout 65;
        gzip on;
    
        #服务器的集群
        #upstream  tomcats {  #服务器集群名字
                #TODO:172.17.0.3是docker容器的IP 
            #server    172.17.0.3:8080  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。
            #server    172.17.0.4:8080  weight=2;
        #}
        
        #新增1:nacos集群
        upstream  nacoses {
            server    192.168.0.21:8848  weight=1;
            server    192.168.0.22:8848  weight=1;
        }  
    
        #当前的Nginx的配置
        server {
            listen       80;#监听80端口,可以改成其他端口
            server_name  localhost;#当前服务的域名,没有域名可随便填写
       
                    #新增2:用于重定向至nacos集群
            location /nacos {
                    proxy_pass http://nacoses;
            }
    
            location / {
                    root         /usr/share/nginx/html/dist;#将要访问的网站的目录
                try_files $uri $uri/  /index.html;#该句代码是为解决history路由不能跳转的问题,在vue-router官网有介绍
            }
    
            #location  ^~/api/ {
                    #^~/api/表示匹配前缀是api的请求,proxy_pass的结尾有/, 则会把/api/*后面的路径直接拼接到后面,即移除api
                #proxy_pass http://tomcats/;
            #}
        }
    
    }
    

  • 启动nginx容器:
    docker run \
           --name mynginx \
           --net mynet \
           -d -p 80:80 \
           -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
           -v /data/nginx/log:/var/log/nginx \
           -v /data/nginx/html:/usr/share/nginx/html \
           nginx:latest
    

  • 将mynginx同时连接到bridge网络,用于与宿主机通讯
    [root@localhost ~]# docker network connect bridge mynginx
    

  • 访问控制台确认部署:
  • http://192.168.229.130/nacos

    出现如下界面说明集群正常:

猜你喜欢

转载自blog.csdn.net/qq_62898618/article/details/128430108