1. nacos单机安装
搜索镜像:docker search nacos 第一个便是我们需要的。
// 下载最新版本的Nacos镜像 docker pull nacos/nacos-server 按理,不写版本号,默认会来取最新的,但是本人拉取启动后进入页面,发现其是1.1.4版本的,与spring-cloud-alibaba-dependencies(2.1.0.RELEASE)不兼容,于是我重新拉取了新的镜像: docker pull nacos/nacos-server:1.3.2
docker run -d -p 8848:8848 -e MODE=standalone -v /opt/nacos/logs:/home/nacos/logs -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties --network=host --restart=always --name nacos-node nacos/nacos-server:1.3.2
-d:后台服务启动 -p:指定映射端口 -e MODE=standalone :单机模式启动(nacos默认集群启动,集群启动是无法访问页面的) -v:指定挂载文件(不熟悉的,去学习一下docker) –name:指定容器名
查看一下我们的容器是否启动成功 docker ps 最后测试Nacos是否启动成功 浏览器访问http://<nacos所在服务器的IP>:8848/nacos,并输入用户名和密码进行登录。(默认的用户名和密码都是nacos,远程访问的话不要忘记开启端口,可以直接关闭防火墙:systemctl stop firewalld)
2. nacos集群搭建
单机的nacos单机起来很容易,接下来我们搭建集群,搭建其集群相对比较复杂。 我们的架构图如下: 这里我们就不搭建nginx的集群了。 我们先拉取以下镜像: nginx,mysql,nacos
2.1 docker安装mysql
安装mysql,并启动容器: docker run -p 3306:3306 --name mysql -v /usr/local/dockerData/mysql/conf:/etc/mysql/conf.d -v /usr/local/dockerData/mysql/logs:/logs -v /usr/local/dockerData/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest 查看容器文件目录:ls(不支持ll)
进入容器:docker exec -it 容器ID /bin/bash 并登录mysql,密码是123456 退出mysql:exit
容器不停止推出:ctrl+P+Q
我们已经安装好了mysql,下面我们就可以初始化我们的nacos的sql脚本了。 初始化sql sql脚本入口: https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql 创建一个自己的数据库,把该脚本复制粘贴执行即可。到此,我们的数据库就安装完成了。
2.2 docker安装nacos
准备机器3台 192.168.1.160 192.168.1.161 192.168.1.162 linux设置固定ip:https://www.linuxidc.com/Linux/2017-12/149910.htm linux虚拟机克隆:https://www.linuxidc.com/Linux/2017-06/144719.htm
2.2.1 创建Nacos的工作目录
// 每个节点都创建 mkdir -p /usr/local/docker/nacos-server mkdir -p /usr/local/docker/nacos-server/env mkdir -p /usr/local/docker/nacos-server/logs mkdir -p /usr/local/docker/nacos-server/init.d
为啥要创建这些目录呢?怎么知道要创建这些目录文件? 我们学习docker可以知道文件挂载的概念,我们创建的这些目录就是为了映射容器内的相应文件。 从截图可以看到,我们进入nacos的容器后,可以看到容器内含有我们上述创建的目录,我们创建的目录就是为了映射这些文件。我们启动nacos时,指定这些映射文件,就可以读取到我们linux本机的配置而非容器内的配置。(这只是简单解释,基础差的赶紧的去学习docker了)。
2.2.2 修改我们的配置文件
custom.properties
vim /usr/local/docker/nacos-server/init.d/custom.properties
// 添加以下配置
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*
# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
nacos-hostname.env
vim /usr/local/docker/nacos-server/env/nacos-hostname.env
#nacos dev env
# 首选主机模式
PREFER_HOST_MODE=hostname
# 当前主机的IP
NACOS_SERVER_IP=192.168.1.160
# 集群的各个节点
NACOS_SERVERS=192.168.1.160:8848 192.168.1.161:8848 192.168.1.162:8848
# 数据库的配置
MYSQL_SERVICE_HOST=192.168.1.160
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
# 从节点 这里就使用单节点测试,因此就不配置从节点
#MYSQL_SLAVE_SERVICE_HOST=xxx
#MYSQL_SLAVE_SERVICE_PORT=3306
# JVM参数 默认是2G 如果使用虚拟机,内存没有2G,就需要调整这里的参数,否则将无法启动
JVM_XMS=256m
JVM_XMX=256m
JVM_XMN=256m
将我们创建的工作目录拷贝到另外两个机子:
scp -r /usr/local/docker/nacos-server root@192.168.1.161:/usr/local/docker/nacos-server
scp -r /usr/local/docker/nacos-server root@192.168.1.162:/usr/local/docker/nacos-server
2.2.3 docker启动(3个节点)
docker run \
-p 8848:8848 \
--restart=always \
--name nacos-node \
--env-file=/usr/local/docker/nacos-server/env/nacos-hostname.env \
-v /usr/local/docker/nacos-server/logs:/home/nacos/logs \
-v /usr/local/docker/nacos-server/init.d/custom.properties:/home/nacos/init.d/custom.properties \
-d nacos/nacos-server
分别在我们的三个机子启动: 到此,我们先理一理: 我们有三台机子,都分别启动了一个nacos容器 192.168.1.160:8848 192.168.1.161:8848 192.168.1.162:8848 这三个容器是集群模式启动,且使用的数据库都是同一个 192.168.1.160:3306(简单说明,数据库可以是任意能远程访问的数据库) 测试 访问任意节点的8848端口; 如: 192.168.1.160:8848/nacos 默认用户名和密码为: nacos/nacos ;登录之后查看节点即可看到如下效果.
异常查看
// 如果出现异常,可以在/usr/local/docker/nacos-server/logs目录下查看
tail -f /usr/local/docker/nacos-server/logs/nacos.log
2.3 docker安装Nginx并实现代理Nacos集群
2.3.1 简单安装
参考:https://blog.csdn.net/qq_40140473/article/details/98632019
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
开始搭建:
# 拉取镜像
docker pull nginx
# 简单运行
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
是的,你没有看错,一个简单的Nginx服务器就这样搭建起来了,访问http://localhost即可看到Nginx的欢迎页。需要使用它我们必须进入到容器内部进行更改配置文件操作,第一不是很方便,第二容器内没有现有的文件编辑器。所以这个时候我们需要在宿主机中集中管理Nginx的配置及日志等文件,接下来继续。
拷贝简单运行的Nginx容器中的文件到宿主机将要映射的目录地址中,我选择映射的目录在/data/nginx下(文件目录需先创建)。
Nginx配置文件:/etc/nginx/nginx.conf
Nginx默认配置文件:/etc/nginx/conf.d/default.conf
Nginx日志文件:/var/log/nginx(默认路径,可以在nginx.conf中更改)
Nginx静态文件:/usr/share/nginx/html
# 复制some-nginx容器中的静态文件
docker cp some-nginx:/usr/share/nginx/html /data/nginx/html
# 复制some-nginx容器中的配置文件
docker cp some-nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf
# 复制some-nginx容器中的默认配置文件
docker cp some-nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/default.conf
接下来运行一个全新的Nginx容器并进行目录、端口的映射(目录映射必须和刚拷贝的地址一一对应)
docker run -it -d --name nginx --restart=on-failure:5 -p 8888:80 -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /data/nginx/log:/var/log/nginx --privileged nginx
至此安装完成,我们就可以直接在宿主机内对Nginx进行配置了,也可以查看日志等信息了
2.3.2 修改配置文件实现反向代理集群
我们先看看本地文件: 我们可以看到一行配置: include /etc/nginx/conf.d/*.conf; 可以知道,这里包含了conf.d文件夹下的文件
我们先拷贝一份default.conf 为default.conf.cp,这是初始化文件。然后我们修改default.conf如下:
upstream nacosserver {
server 192.168.1.160:8848;
server 192.168.1.161:8848;
server 192.168.1.162:8848;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nacosserver;
}
#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;
#}
}
注意:nacosserver 这个命名不能有下划线
温馨提示:对nginx不熟悉的,感觉去学了。
2.3.3 测试
完成上述配置,直接重启nginx容器。 访问:http://192.168.1.160:8888/nacos/#/login 到此,我们的基于docker搭建nginx+nacos搭建的集群,已经完成了。
3、搭建过程中遇到的问题
3.1 Docker容器做端口映射报错
Docker容器做端口映射报错 docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp3 (46b7917c940f7358948e55ec2df69a4dec2c6c7071b002bd374e8dbf0d40022c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 86 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name. 解决方法 docker服务启动时定义的自定义链DOCKER被清除 重启即可systemctl restart docker
3.2 搭建完成后,访问nginx出现404
查看一下路径:http://192.168.1.160:8888/nacos/#/login 必须加上/nacos/#/login
3.3 搭建完成后,访问nginx出现400
先查看nginx的日志:
没有发现报错。 再看三个容器的日志:
2021-09-02 16:22:43,754 INFO The host [nacos_server] is not valid Note: further occurrences of request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: The character [_] is never valid in a domain name. at org.apache.tomcat.util.http.parser.HttpParser
D
o
m
a
i
n
P
a
r
s
e
S
t
a
t
e
.
n
e
x
t
(
H
t
t
p
P
a
r
s
e
r
.
j
a
v
a
:
926
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
h
t
t
p
.
p
a
r
s
e
r
.
H
t
t
p
P
a
r
s
e
r
.
r
e
a
d
H
o
s
t
D
o
m
a
i
n
N
a
m
e
(
H
t
t
p
P
a
r
s
e
r
.
j
a
v
a
:
822
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
h
t
t
p
.
p
a
r
s
e
r
.
H
o
s
t
.
p
a
r
s
e
(
H
o
s
t
.
j
a
v
a
:
71
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
h
t
t
p
.
p
a
r
s
e
r
.
H
o
s
t
.
p
a
r
s
e
(
H
o
s
t
.
j
a
v
a
:
45
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
A
b
s
t
r
a
c
t
P
r
o
c
e
s
s
o
r
.
p
a
r
s
e
H
o
s
t
(
A
b
s
t
r
a
c
t
P
r
o
c
e
s
s
o
r
.
j
a
v
a
:
288
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
h
t
t
p
11.
H
t
t
p
11
P
r
o
c
e
s
s
o
r
.
p
r
e
p
a
r
e
R
e
q
u
e
s
t
(
H
t
t
p
11
P
r
o
c
e
s
s
o
r
.
j
a
v
a
:
809
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
h
t
t
p
11.
H
t
t
p
11
P
r
o
c
e
s
s
o
r
.
s
e
r
v
i
c
e
(
H
t
t
p
11
P
r
o
c
e
s
s
o
r
.
j
a
v
a
:
384
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
A
b
s
t
r
a
c
t
P
r
o
c
e
s
s
o
r
L
i
g
h
t
.
p
r
o
c
e
s
s
(
A
b
s
t
r
a
c
t
P
r
o
c
e
s
s
o
r
L
i
g
h
t
.
j
a
v
a
:
66
)
a
t
o
r
g
.
a
p
a
c
h
e
.
c
o
y
o
t
e
.
A
b
s
t
r
a
c
t
P
r
o
t
o
c
o
l
DomainParseState.next(HttpParser.java:926) at org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:71) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:45) at org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288) at org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol
DomainParseState.next(HttpParser.java:926)atorg.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822)atorg.apache.tomcat.util.http.parser.Host.parse(Host.java:71)atorg.apache.tomcat.util.http.parser.Host.parse(Host.java:45)atorg.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288)atorg.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809)atorg.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)atorg.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)atorg.apache.coyote.AbstractProtocolConnectionHandler.process(AbstractProtocol.java:791) at org.apache.tomcat.util.net.NioEndpoint
S
o
c
k
e
t
P
r
o
c
e
s
s
o
r
.
d
o
R
u
n
(
N
i
o
E
n
d
p
o
i
n
t
.
j
a
v
a
:
1417
)
a
t
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
u
t
i
l
.
n
e
t
.
S
o
c
k
e
t
P
r
o
c
e
s
s
o
r
B
a
s
e
.
r
u
n
(
S
o
c
k
e
t
P
r
o
c
e
s
s
o
r
B
a
s
e
.
j
a
v
a
:
49
)
a
t
j
a
v
a
.
u
t
i
l
.
c
o
n
c
u
r
r
e
n
t
.
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
.
r
u
n
W
o
r
k
e
r
(
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
.
j
a
v
a
:
1149
)
a
t
j
a
v
a
.
u
t
i
l
.
c
o
n
c
u
r
r
e
n
t
.
T
h
r
e
a
d
P
o
o
l
E
x
e
c
u
t
o
r
SocketProcessor.doRun(NioEndpoint.java:1417) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor
SocketProcessor.doRun(NioEndpoint.java:1417)atorg.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)atjava.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) 2021-09-02 16:27:36,397 INFO [capacityManagement] start correct usage
可以看到,我们的三个容器都报出这个错误,如果遇到这个错误,是因为我们配置nginx的时候定义如下配置信息时,nacos_server 命名含有下划线,把下划线去掉就好了。 upstream nacos_server { server 192.168.1.160:8848; server 192.168.1.161:8848; server 192.168.1.162:8848; } server { listen 80; listen [::]:80; server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nacos_server;
}
三个容器都报错,从另一个角度来说,我们的集群已经搭建成功了,nginx,默认是集群访问。
4. 参考的文章
- VMware 下快速克隆出多个 Linux
系统:https://www.linuxidc.com/Linux/2017-06/144719.htm - CentOS
7虚拟机下设置固定IP详解:https://www.linuxidc.com/Linux/2017-12/149910.htm - 基于Docker搭建Nacos集群:https://lupengfei.blog.csdn.net/article/details/107414969
- 【个人笔记】基于Docker的Nacos的安装与启动:https://blog.csdn.net/qq_37964378/article/details/109411783
- Docker容器做端口映射报错:https://blog.csdn.net/qq_41545647/article/details/102679560
- 使用docker搭建Nginx服务:https://blog.csdn.net/qq_40140473/article/details/98632019
|