Docker Compose 部署 Nacos 集群

Docker Compose 部署 Nacos 集群

节点规划

主机名 IP 地址 端口号
nacos-nginx 172.16.1.180 8045
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.2.0
mysql 5.7.33

拉取命令

拉取 Nginx 镜像

1
docker pull nginx:1.21.1

拉取 Nacos 镜像

1
docker pull nacos/nacos-server:2.2.0

拉取 MySQL 镜像

1
docker pull mysql:5.7.33

部署容器

部署 MySQL

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

编排 MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: "3"

services:
mysql:
container_name: MySQL5.7.33
image: mysql:5.7.33
environment:
- MYSQL_ROOT_PASSWORD=ok
volumes:
- ~/mysql/conf:/etc/mysql
- ~/mysql/logs:/var/log/mysql
- ~/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

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

初始化 Nacos 数据库

创建数据库
1
create database nacos-db;

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

nacos-db 表初始化

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

1
curl https://raw.githubusercontent.com/alibaba/nacos/2.2.0/distribution/conf/mysql-schema.sql

也可以复制以下脚本执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/*
* 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(128) 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,
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
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(128) 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 '租户字段',
`encrypted_data_key` text NOT NULL 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(20) 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 '租户字段',
`encrypted_data_key` text NOT NULL 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 集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
version: "3"

services:
nacos1:
container_name: nacos-server01
hostname: nacos-server01
image: nacos/nacos-server:2.2.0
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:
- ~/nacos/cluster-logs/nacos-server01:/home/nacos/logs
- ~/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.2.0
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:
- ~/nacos/cluster-logs/nacos-server02:/home/nacos/logs
- ~/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.2.0
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:
- ~/nacos/cluster-logs/nacos-server03:/home/nacos/logs
- ~/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 集群

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

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

1
docker logs -f <容器ID>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
         ,--.
,--.'|
,--,: : | 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://<ip>:8846/nacoshttp://<ip>:8847/nacoshttp://<ip>:8848/nacos,如果显示如下页面,则说明集群部署并启动成功。

登录页

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

集群节点列表

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

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

部署 Nginx

拷贝 Nginx 配置

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

  • 运行 Nginx 容器

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

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

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

    1
    2
    docker stop <Nginx容器ID>
    docker rm <Nginx容器ID>

修改 Nginx 配置文件

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

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

完整配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 添加负载均衡配置
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

1
2
3
4
5
6
7
8
9
10
11
12
version: "3"

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

重要说明:

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

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

使用编排部署 Nginx

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

访问测试

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

Nginx负载Nacos

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


Docker Compose 部署 Nacos 集群
https://kael.52dev.fun/2023/04/19/DockerCompose部署Nacos集群/
作者
Kael
发布于
2023年4月19日
许可协议
BY (KAEL)