简述

我又来水一篇了,在搭建的过程中,备受折磨,如果不把它记录下来,岂不是白难受了!
我的小服务器太差了,1核2G内存,容器一开起来,CPU和内存直接98%。。。
害,难受,直接去Vultr开了高性能的vps实验,下面进入正题

如果我们使用的是单机版nacos,则我们的数据存储在内置的derby数据库中,
如果我们使用nacos集群,那么就需要我们配置mysql,让所有nacos的配置都保存到mysql数据库中
以防数据库数据不一致的情况出现。

具体配置:

  • 拉取nacos,nginx,mysql的镜像,默认全部最新版的

    docker pull nacos/nacos-server
    docker pull nginx
    docker pull mysql
  • 创建各个挂载目录和必要的配置文件

    • 创建主目录用于存放各个挂载目录及配置文件:mkdir nacos-cluster,主目录直接在根目录创建即可
      主目录下创建三个配置目录:mkdir mysql nacos nginx

    • 在mysql目录下创建3个挂载目录:mkdir logs data conf

      logs目录挂载到:/var/log/mysql/
      data目录挂载到:/var/lib/mysql/
      conf目录挂载到:/etc/mysql/conf.d/
    • 将nacos的sql文件放在mysql目录下
      nacos数据库文件在nacos的conf目录下,nacos-mysql.sql
      我们可以在window版本的nacos中找到该sql文件再传到linux中

    • 在mysql目录下创建Dockerfile文件,该文件内容如下

      #设定初始镜像mysql版本
      FROM mysql
      #设定工作目录,用于处理初始化mysql的sql文件
      WORKDIR /docker-entrypoint-initdb.d
      #默认mysql无法输入中文,修改编码使其支持中文
      ENV LANG=C.UTF-8
      #加入需要初始化的sql文件
      ADD ./nacos-mysql.sql .
    • 在nacos目录下创建6个挂载目录

      mkdir nacos1-logs nacos2-logs nacos3-logs nacos1-config nacos2-config nacos3-config
      分别对应三个nacos容器的日志目录和配置目录
        logs目录挂载到/home/nacos/logs/
        config目录挂载到/home/nacos/init.d/
    • 在nginx目录下创建2个挂载目录:mkdir nginx-config nginx-logs

      nginx-config目录挂载到:/etc/nginx/conf.d/
      nginx-logs目录挂载到:/var/log/nginx/
    • 在nginx/nginx-config目录下创建nacos-cluster.conf文件,该文件内容如下:

      server {
      	listen 9000;
      	server_name 你的nginx的ip地址(也就是宿主机ip);
      	
      	location / {
              proxy_pass http://cluster;
          }
      }
    • 在nginx目录下创建nginx.conf文件,该文件将挂载到/etc/nginx/nginx.conf
      注意:这个文件创建后最好改一下该文件的权限,将该文件权限改成666,防止更新nginx.conf文件后
      容器内文件不能被及时修改,如果不改权限,则每次修改配置,需要重启容器才能生效。
      该文件内容如下:

      user  nginx;
      worker_processes  auto;
      
      error_log  /var/log/nginx/error.log notice;
      pid        /var/run/nginx.pid;
      
      events {
          worker_connections  1024;
      }
      
      http {
          include       /etc/nginx/mime.types;
          default_type  application/octet-stream;
      
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
      
          access_log  /var/log/nginx/access.log  main;
      
          sendfile        on;
          #tcp_nopush     on;
      
          keepalive_timeout  65;
      
          #gzip  on;
          #nacos1:8848,是通过容器名:容器内部端口来访问,你可以通过45.32.108.28:宿主机端口访问
          upstream cluster {
      	  server nacos1:8848 weight=1 max_fails=5 fail_timeout=30s;
      	  server nacos2:8848 weight=1 max_fails=5 fail_timeout=30s;
      	  server nacos3:8848 weight=1 max_fails=5 fail_timeout=30s;
          }
      
          include /etc/nginx/conf.d/*.conf;
      }

    上面众多文件结构如下:

    nacos-cluster/
    ├── docker-compose.yml
    ├── mysql
    │   ├── conf
    │   ├── data
    │   ├── Dockerfile
    │   ├── logs
    │   └── nacos-mysql.sql
    ├── nacos
    │   ├── nacos1-config
    │   ├── nacos1-logs
    │   ├── nacos2-config
    │   ├── nacos2-logs
    │   ├── nacos3-config
    │   └── nacos3-logs
    └── nginx
        ├── nginx.conf
        ├── nginx-config
        │   └── nacos-cluster.conf
        └── nginx-logs
  • 差点忘记我们的docker-compose文件,该文件内容如下:

    version: '3'
    services:
      mysql:
            container_name: mysql
            build: ./mysql
            environment:
                MYSQL_ROOT_PASSWORD: 123765
            ports:
                - "3306:3306"
            volumes:
            #    - /nacos-cluster/mysql/init:/docker-entrypoint-initdb.d/ #初始化nacos的数据库文件
                - /nacos-cluster/mysql/data/:/var/lib/mysql/   #mysql数据目录
                - /nacos-cluster/mysql/logs/:/var/log/mysql/   #mysql的日志目录
                - /nacos-cluster/mysql/conf/:/etc/mysql/conf.d/  #mysql的配置目录
            command: [
                '--character-set-server=utf8mb4',
                '--collation-server=utf8mb4_unicode_ci',
                '--lower_case_table_names=1'
                    ]
            restart: always
      nacos1:
            hostname: nacos1
            container_name: nacos1
            image: nacos/nacos-server
            environment:
            - MODE=cluster
            - NACOS_SERVERS=45.32.108.28:8000 45.32.108.28:8001 45.32.108.28:8002
            - PREFER_HOST_MODE=hostname
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=mysql #Mysql的主机号,同一台机器不能使用IP,直接使用容器名
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_DB_NAME=nacos_config
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123765
            - MYSQL_DATABASE_NUM=1
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000 #控制数据库连接时间
            - JVM_XMS=256m
            - JVM_XMX=256m
            - JVM_XMN=256m
            ports:
                - "8000:8848"
            volumes:
                - /nacos-cluster/nacos/nacos1-logs/:/home/nacos/logs/
                - /nacos-cluster/nacos/nacos1-config:/home/nacos/init.d/
            depends_on:
                - mysql
            restart: always
      nacos2:
            hostname: nacos2
            container_name: nacos2
            image: nacos/nacos-server
            environment:
            - MODE=cluster
            - NACOS_SERVERS=45.32.108.28:8000 45.32.108.28:8001 45.32.108.28:8002
            - PREFER_HOST_MODE=hostname
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=mysql
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_DB_NAME=nacos_config
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123765
            - MYSQL_DATABASE_NUM=1
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000
            - JVM_XMS=256m
            - JVM_XMX=256m
            - JVM_XMN=256m
            ports:
                - "8001:8848"
            volumes:
                - /nacos-cluster/nacos/nacos2-logs/:/home/nacos/logs/
                - /nacos-cluster/nacos/nacos2-config:/home/nacos/init.d/
            depends_on:
                - mysql
            restart: always
      nacos3:
            hostname: nacos3
            container_name: nacos3
            image: nacos/nacos-server
            environment:
            - MODE=cluster # 集群模式
            - NACOS_SERVERS=45.32.108.28:8000 45.32.108.28:8001 45.32.108.28:8002
            - PREFER_HOST_MODE=hostname
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=mysql
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_DB_NAME=nacos_config
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123765
            - MYSQL_DATABASE_NUM=1
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000
            - JVM_XMS=256m
            - JVM_XMX=256m
            - JVM_XMN=256m
            ports:
                - "8002:8848"
            volumes:
                - /nacos-cluster/nacos/nacos2-logs/:/home/nacos/logs/
                - /nacos-cluster/nacos/nacos2-config:/home/nacos/init.d/
            depends_on:
                - mysql
            restart: always
      nginx:
            container_name: nginx
            image: nginx
            ports:
                - "9000:9000"
            volumes:
                - /nacos-cluster/nginx/nginx-logs:/var/log/nginx/
                - /nacos-cluster/nginx/nginx-config:/etc/nginx/conf.d/
                - /nacos-cluster/nginx/nginx.conf:/etc/nginx/nginx.conf
            depends_on:
                - nacos1
                - nacos2
                - nacos3
            restart: always
            ulimits:
              nproc: 65535
              nofile:
                soft: 65535
                hard: 65535
  • 安装docker-compose并执行docker-compose.yml文件

    安装:apt install docker-compose
    在主目录nacos-cluster目录下执行:docker-compose -f docker-compose.yml up -d

    通过docker logs -f 容器名,查看各容器运行情况
    如果成功则浏览器访问:http://宿主机ip:9000/nacos,查看是否成功进入nacos登录页

  • 什么?你太懒了不想又是创建文件又是找sql文件?没关系,我就喜欢你这样的同学!
    我已经将上面所有文件全部放到github上了,你只需要下载仓库中的nacos-cluster目录
    拷贝到linux上,进入主目录直接执行:docker-compose -f docker-compose.yml up -d
    即可运行!还等什么?快去下载吧,nacos集群搭建资料

  • 以上就是配置的全部过程,下面是一些注意事项和命令

    • 注意:docker如果是挂载文件,一定要将该文件权限修改为666
      最好是挂载目录,就不会出现宿主机文件修改后,容器内文件没有修改的情况
      不改文件状态,只有容器重新启动,容器内的文件才会被重新加载。

    • 注意:如果重新执行docker-compose文件,需要把/nacos-cluster/mysql/data 中的所有文件全部删除
      当然其他目录中也会生成一些日志文件,以防万一可以一并删除。

    • 注意:访问nacos网站是:ip:端口号/nacos,例如http://xx.xx.xx.xx:8848/nacos
      当nginx配置好后,ip地址,端口号改成nginx的,当然请求后还是需要加上/nacos。

    • 停止所有容器:docker stop $(docker ps -a -q)
      重启容器:docker restart 容器名称 //如果重启不了,杀死进程再重启

    • 停止docker服务:systemctl stop docker
      开启docker服务:systemctl start docker

    • 查看所有端口信息:netstat -anp
      查看端口占用信息:lsof -i:端口号
      查看进程信息:ps -ef | grep java

    • 查看系统内存:free -m

    • 最后发现一个有意思的事,git上传不了空文件夹,我们可以通过命令为每个空文件夹
      创建gitignore文件来占位,命令:find . -type d -empty -exec touch {}/.gitignore \;
      如果你从github上直接拷贝下来nacos-cluster目录,记得把挂载目录中的gitignore文件去除哦!!!