1. nacos单机安装

搜索镜像:docker search nacos

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker


第一个便是我们需要的。// 下载最新版本的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

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_02

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打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_03


最后测试Nacos是否启动成功

浏览器访问http://<nacos所在服务器的IP>:8848/nacos,并输入用户名和密码进行登录。(默认的用户名和密码都是nacos,远程访问的话不要忘记开启端口,可以直接关闭防火墙:systemctl stop firewalld)

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_mysql_04


nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_mysql_05

2. nacos集群搭建

单机的nacos单机起来很容易,接下来我们搭建集群,搭建其集群相对比较复杂。

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_06


我们的架构图如下:

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_mysql_07


这里我们就不搭建nginx的集群了。

我们先拉取以下镜像:

nginx,mysql,nacos

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_spring boot_08

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

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_spring boot_09


查看容器文件目录:ls(不支持ll)

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_10

进入容器:docker exec -it 容器ID /bin/bash

并登录mysql,密码是123456

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_11


退出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打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_12


从截图可以看到,我们进入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打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_spring boot_13


到此,我们先理一理:

我们有三台机子,都分别启动了一个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打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_spring boot_14


特别说明:我们前面说过的,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 简单安装

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 修改配置文件实现反向代理集群

我们先看看本地文件:

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_15


nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_16


我们可以看到一行配置:

include /etc/nginx/conf.d/*.conf;

可以知道,这里包含了conf.d文件夹下的文件

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_17

我们先拷贝一份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

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_mysql_18


到此,我们的基于docker搭建nginx+nacos搭建的集群,已经完成了。

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

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的日志:

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_19

没有发现报错。

再看三个容器的日志:

nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_20


nacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_nginx_21

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.HttpParsernacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_mysql_22ConnectionHandler.process(AbstractProtocol.java:791)
at org.apache.tomcat.util.net.NioEndpointnacos打包docker镜像怎么设置启动脚本类型 docker安装nacos集群_docker_23Worker.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