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单机起来很容易,接下来我们搭建集群,搭建其集群相对比较复杂。
默认Nocos使用嵌入式数据库实现数据的存储,所以,ru'guo
我们的架构图如下:
在这里插入图片描述
这里我们就不搭建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 ;登录之后查看节点即可看到如下效果.
在这里插入图片描述
特别说明:我们前面说过的,nacos默认是集群模式启动且未指定单机模式启动时是无法访问此页面的,如此,进一步说明我们的nacos集群已经搭建成功了。
**若你遇到页面无响应的情况,那就是集群未启动成功,nacos集群启动成功的条件如下:

  • 集群内的三个nacos容器都成功启动
  • 三个容器指定的mysql容器成功启动
  • 防火墙关闭(或者开发指定端口)

异常查看

// 如果出现异常,可以在/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搭建的集群,已经完成了。

2.4 使用不同端口实现naocs集群

参考:https://blog.csdn.net/weixin_48255807/article/details/111755510

2.4.1 docker 集群命令

docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38848:8848 \
--name nacos48 \
--restart=always \
nacos/nacos-server:1.3.2
 



docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38849:8848 \
--name nacos49 \
--restart=always \
nacos/nacos-server:1.3.2




docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=192.168.229.128:38848,192.168.229.128:38849,192.168.229.128.130:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.229.128 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.229.128 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38850:8848 \
--name nacos50 \
--restart=always \
nacos/nacos-server:1.3.2

2.4.2 命令参数说明

MODE=cluster 集群模式

NACOS_APPLICATION_PORT=8848 容器nacos端口

NACOS_SERVERS=ip:38848,ip:38849,ip:38850 集群每个nacos-server服务

SPRING_DATASOURCE_PLATFORM=mysql 独立支持mysql

NACOS_SERVER_IP=ip 可选值hostname/ip 默认ip

MYSQL_* 相关

MYSQL_SERVICE_DB_NAME=nacos_config 数据库初始化脚本数据库名称

数据库初始化脚本:https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql

JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m

-p 38850:8848 38850宿主机端口:8848 nacos访问端口

–restart=always 重启docker服务会启动该容器

nacos/nacos-server:1.3.2 nacos镜像版本

2.4.3 提示

若遇到页面无法响应的情况,要学会看naocs的日志,根据日志就能解决一切问题了。

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,默认是集群访问。

3.4 nacos搭建完成后,访问无响应

排查问题:

  1. 防火墙未关闭(关闭防火墙即可)
  2. 查看naocs日志
    进入容器:docker exec -it 容器id /bin/bash
    查看后两百行日志:tail -n 200 /home/nacos/logs/nacos.log
    从日志可以看到错误信息,有可能是mysql服务未开启,也有可能是数据库名有误。
  3. 若是日志无报错,那就等一等,刚启动的nacos,访问会出现网络延迟,我遇到的不是一次两次了。

4. 参考的文章

  1. VMware 下快速克隆出多个 Linux
    系统:https://www.linuxidc.com/Linux/2017-06/144719.htm
  2. CentOS
    7虚拟机下设置固定IP详解:https://www.linuxidc.com/Linux/2017-12/149910.htm
  3. 基于Docker搭建Nacos集群:https://lupengfei.blog.csdn.net/article/details/107414969
  4. 【个人笔记】基于Docker的Nacos的安装与启动:https://blog.csdn.net/qq_37964378/article/details/109411783
  5. Docker容器做端口映射报错:https://blog.csdn.net/qq_41545647/article/details/102679560
  6. 使用docker搭建Nginx服务:https://blog.csdn.net/qq_40140473/article/details/98632019
  7. docker搭建mysql+nacos+nginx集群:https://blog.csdn.net/weixin_48255807/article/details/111755510
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐