Docker Compose 部署 Nacos 集群

节点规划

主机名 IP 地址 端口号
nacos-nginx 172.16.1.180 8845
nacos-server01 172.16.1.180 8846
nacos-server02 172.16.1.180 8847
nacos-server03 172.16.1.180 8848
nacos-mysql 172.16.1.180 3306

拉取 docker 镜像

镜像列表

镜像名 版本号
nginx 1.21.1
nacos/nacos-server 2.0.2
mysql 5.7.33

拉取命令

拉取 Nginx 镜像

$ docker pull nginx:1.21.1

拉取 Nacos 镜像

$ docker pull nacos/nacos-server:2.0.2

拉取 MySQL 镜像

$ docker pull mysql:5.7.33

部署容器

部署 MySQL

如果已经安装过 MySQL 或拥有其他可用的 MySQL,则跳过此步骤。

编排 MySQL

version: "3"

services:
  mysql:
    container_name: MySQL5.7.33
    image: mysql:5.7.33
    environment:
      - MYSQL_ROOT_PASSWORD=ok
    volumes:
      - /Users/shengyao/worker/environment/mysql/conf:/etc/mysql
      - /Users/shengyao/worker/environment/mysql/logs:/var/log/mysql
      - /Users/shengyao/worker/environment/mysql/data:/var/lib/mysql
    restart: on-failure
    ports:
      - 3306:3306
    privileged: true
    stdin_open: true
    tty: true

重点说明:

环境变量 - 编排中的MYSQL_ROOT_PASSWORD环境变量指定了 MySQL 的 root 账户密码。

数据卷挂载 - 编排中需要挂载三部分内容,分别为:MySQL 配置、MySQL 日志、MySQL 数据文件。

重启策略 - 编排中设置的策略为报错后重启

暴露端口 - ports 中的参数,左边为容器外部端口,即宿主机端口,右边为容器内部端口。

privileged - 为 true,则让容器内的 root 账户拥有真正的 root 权限。

stdin_open 和 tty - 为 true,则允许交互输入输出。

使用编排部署 MySQL

$ docker-compose -f <编排文件路径> up -d

初始化 Nacos 数据库

创建数据库
create database nacos-db;

如果有 Navicat 、SQLYog 等图形化管理器,也可以使用其进行手工创建。

nacos-db 表初始化

初始化 sql 语句可以从 GitHub 上下载

$ curl https://raw.githubusercontent.com/alibaba/nacos/2.0.2/distribution/conf/nacos-mysql.sql > nacos-mysql.sql

也可以复制以下脚本执行

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************/
/*   数据库全名 = 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 CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) 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 CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) 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 CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) 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 CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP 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 CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) 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 CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP 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,
    UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

部署 Nacos 集群

编排 Nacos 集群

version: "3"

services: 
    nacos1:
        container_name: nacos-server01
        hostname: nacos-server01
        image: nacos/nacos-server:2.0.2
        environment: 
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8848 nacos-server03:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.16.1.180
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=ok
            - MYSQL_SERVICE_DB_NAME=nacos-db
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
        volumes: 
            - /Users/shengyao/worker/environment/nacos/cluster-logs/nacos-server01:/home/nacos/logs
            - /Users/shengyao/worker/environment/nacos/init.d:/home/nacos/init.d
        ports: 
            - 8846:8848
            - 9555:9555
        restart: on-failure

    nacos2:
        container_name: nacos-server02
        hostname: nacos-server02
        image: nacos/nacos-server:2.0.2
        environment: 
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8848 nacos-server03:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.16.1.180
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=ok
            - MYSQL_SERVICE_DB_NAME=nacos-db
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
        volumes: 
            - /Users/shengyao/worker/environment/nacos/cluster-logs/nacos-server02:/home/nacos/logs
            - /Users/shengyao/worker/environment/nacos/init.d:/home/nacos/init.d
        ports: 
            - 8847:8848
        restart: on-failure

    nacos3:
        container_name: nacos-server03
        hostname: nacos-server03
        image: nacos/nacos-server:2.0.2
        environment: 
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos-server01:8848 nacos-server02:8848 nacos-server03:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.16.1.180
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=ok
            - MYSQL_SERVICE_DB_NAME=nacos-db
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
        volumes: 
            - /Users/shengyao/worker/environment/nacos/cluster-logs/nacos-server03:/home/nacos/logs
            - /Users/shengyao/worker/environment/nacos/init.d:/home/nacos/init.d
        ports: 
            - 8848:8848
        restart: on-failure

重要说明:

环境变量说明

  • MODE=cluster

    运行模式,默认为单机模式,cluster 为集群模式。

  • PREFER_HOST_MODE=hostname

    节点主机访问模式,hostname 为使用主机名访问。

  • NACOS_SERVERS=nacos-server01:8848 nacos-server02:8848 nacos-server03:8848

    Nacos 服务节点列表,本次搭建的是三节点集群。格式:主机名:端口号 或 IP:端口号。

  • SPRING_DATASOURCE_PLATFORM=mysql

    数据源平台,默认为空。mysql 为使用 MySQL 作为数据源。

  • MYSQL_SERVICE_HOST=172.16.1.180

    MySQL 的主机地址,注意不能使用 127.0.0.1,127.0.0.1 在部署 Docker 时指的是容器内的本地地址,而不是宿主机的本地地址。如果部署 MySQL 时,配置了 hostname ,也可以使用 hostname 作为地址。

  • MYSQL_SERVICE_PORT=3306

    MySQL 的端口号。

  • MYSQL_SERVICE_USER=root

    MySQL 的用户名。

  • MYSQL_SERVICE_PASSWORD=ok

    MySQL 的账户密码。

  • MYSQL_SERVICE_DB_NAME=nacos-db

    要连接的数据库名称。


  • JVM_XMS=128m

  • JVM_XMX=128m

  • JVM_XMN=128m

    以上三个环境变量配置的是 Nacos 的 JVM,默认情况下 Nacos 分配的内存为 2G,如果是单机多容器部署,注意要加上此环境变量的配置,否则会一直重启。如果是多机单容器部署则不需要。


数据卷挂载说明

此次编排配置了两个挂载,分别为 Nacos 节点日志、Nacos 节点配置。其中节点日志为每个节点单独挂载了一个目录,节点配置则是三个节点共用一个配置,以保证三个节点的配置统一。

如果是多机环境,则每个节点的挂载各自独立,但如果修改其中一个主机的 nacos 节点配置,则最好将其他剩余节点的配置也统一修改。

使用编排部署 Nacos 集群

$ docker-compose -f <编排文件路径> up -d

部署结束后,使用 docker logs 分别查看容器运行日志。

$ docker logs -f <容器ID>

如果返回如下内容,则说明此节点启动成功。

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.0.2
,`--.'`|  ' :                       ,---.               Running in cluster mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 1
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://nacos-server01:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2021-07-27 11:21:15,725 INFO The server IP list of Nacos is [nacos-server01:8848, nacos-server02:8848, nacos-server03:8848]

2021-07-27 11:21:16,738 INFO Nacos is starting...

2021-07-27 11:21:16,738 INFO Nacos is starting...

2021-07-27 11:22:06,052 INFO Nacos started successfully in cluster mode. use external storage

打开浏览器,分别输入:http://:8846/nacoshttp://:8847/nacoshttp://:8848/nacos,如果显示如下页面,则说明集群部署并启动成功。

image-20210727154208627.png

输入默认账户和密码,即:nacos,用户名和密码一样。进入到管理后台。进入到集群管理 -> 节点列表,页面显示如下:

image-20210727154402956.png

从页面中我们可以看到,三个节点的状态均为 UP(在线)。至此 Nacos 集群就搭建完毕了,接下来我们通过 Nginx 来为 Nacos 增加一个统一的访问入口,以便于后续的管理和维护。

我们可以在其中一个 Nacos 节点上创建一个配置文件,然后通过其他节点访问,如果都可以看到相同的配置文件,则说明集群可用。另外,创建完配置文件后,查看 MySQL 的 nacos-db 数据中的config_info表,如果可以看到我们新建的配置,则说明 nacos 可以使用 MySQL 进行持久化。

部署 Nginx

拷贝 Nginx 配置

Nginx 的部署与其他服务部署略有不同,我们需要先启动一个 Nginx 容器实例,然后从容器事例中拷贝出 Nginx 的配置文件到指定目录,之后我们将复制出的配置文件与 Nginx 容器的数据卷进行挂载,从而达到可以在容器外部修改配置文件的目的。这么做是因为,如果直接挂载,那么容器实例中的的目录将会被外部的挂载所覆盖。这是官方 Nginx 镜像的一个小缺陷,注意一下就行了。

  • 运行 Nginx 容器

    $ docker run --name temp-nginx -p 8080:8080 -d nginx:1.21.1
    
  • 在宿主机创建 Nginx 的挂载目录

    # 实际创建时以自己的机器环境为准
    $ mkdir -p <宿主机挂载目录>
    
  • 拷贝容器中的配置到宿主机的挂载目录

    $ docker cp :/etc/nginx/ <宿主机挂载目录>
    
  • 停止并删除容器实例

    $ docker stop 
    $ docker rm 
    

修改 Nginx 配置文件

位置:<宿主机挂载目录>/conf.d/default.conf

配置文件主要修改两个部分,一个是新增 upstream,通过负载均衡来配置 Nacos 服务的节点;第二个是修改 server 下的 location,在其中添加反向代理配置。另外,如果你的 Nginx 没有配置过 server_name,那么还需要修改 server 下的 server_name 配置。

完整配置文件如下:

# 添加负载均衡配置
upstream nacos {
    server nacos-server01:8846 weight=1 max_fails=2 fail_timeout=10s;
    server nacos-server01:8847 weight=1 max_fails=2 fail_timeout=10s;
    server nacos-server01:8848 weight=1 max_fails=2 fail_timeout=10s;
}

server {
    listen       80;
    listen  [::]:80;
    # 修改为宿主机的 IP地址
    server_name  172.16.1.180;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
            # 添加代理配置
        proxy_pass http://nacos;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        add_header Cache-Control no-cache;
        
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

编排 Nginx

version: "3"

services: 
    nacos-nginx: 
        container_name: nacos-nginx
        image: nginx:1.21.1
        volumes: 
            - /Users/shengyao/worker/environment/nacos-nginx/conf:/etc/nginx
            - /Users/shengyao/worker/environment/nacos-nginx/www:/usr/share/nginx
        ports: 
            - 8845:80
        restart: on-failure

重要说明:

数据卷挂载 - 本例中分别将 Nginx 的配置文件目录和静态文件资源目录挂载到了宿主机,如果不需要提供静态资源访问,可以不用挂载此目录。

端口 - 本例中,为了避免与其他 Nginx 端口冲突,我们暴露的端口为 8845,其中 80 端口为容器内部端口。

使用编排部署 Nginx

$ docker-compose -f <编排文件路径> up -d

访问测试

打来浏览器输入:http://:8845/nacos,如果显示如下界面,则说明部署成功。

image-20210727161413697.png

部署成功后,多刷新几次页面,如果每次显示的都是同一个页面则说明 Nginx 可以正常提供负载。因为我们在配置 Nginx 时,使用的是轮询负载策略。

你可能感兴趣的:(Docker Compose 部署 Nacos 集群)