使用 docker-compose 部署 nacos(单机和集群)

之前已经编写过有关 nacos 的单机部署和集群部署,是直接在 CentOS7 上直接部署的,之前的博客链接如下:

单机版 nacos 部署:https://www.cnblogs.com/studyjobs/p/17380184.html

集群版 nacos 部署:https://www.cnblogs.com/studyjobs/p/17383397.html

为了进一步简化部署,本篇博客介绍如何采用 docker-compose 进行部署,与之前博客重复的细节,这里就不再赘述。

我的 CentOS7 虚拟机 ip 地址是 192.168.136.128,已经安装好了 docker 和 docker-compose


一、单机版部署

nacos 默认使用自带的 derby 数据库(类似于 sqlite 的文件型数据库),在开发环境部署单机版 nacos ,可以直接使用。

在虚拟机上创建 /app/nacos-single1 目录,里面放置一个 logs 目录和 docker-compose.yml

编写 docker-compose.yml 文件内容如下:

version: '3.5'
services:
  nacos:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos
    restart: always
    ports:
      # web 界面访问端口
      - 8848:8848
      # 程序使用 grpc 连接的端口
      - 9848:9848
    environment:
      - MODE=standalone
    volumes:
      - /app/nacos-single1/logs:/home/nacos/logs

然后运行 docker-compose up -d 命令启动服务,访问 http://192.168.136.128:8848/nacos 即可

下面列出使用 mysql 数据库的 docker-compose.yml 内容,我的虚拟机上已经安装过了 mysql。首先需要在 mysql 中随便创建一个数据库(比如数据库名叫做 nacos),然后运行 nacos 提供的 sql 脚本初始化数据库,具体细节可参考上面贴出来的之前博客内容。

在虚拟机上创建 /app/nacos-single2 目录,里面放置一个 logs 目录和 docker-compose.yml

编写 docker-compose.yml 文件内容如下:

version: '3.5'
services:
  nacos:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos
    restart: always
    ports:
      # web 界面访问端口
      - 8848:8848
      # 程序使用 grpc 连接的端口
      - 9848:9848
    environment:
      - MODE=standalone
      # 使用 mysql 作为数据库
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.136.128
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
      # 设置连接 mysql 的连接参数
      - MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai"
    volumes:
      - /app/nacos-single2/logs:/home/nacos/logs

然后运行 docker-compose up -d 命令启动服务,访问 http://192.168.136.128:8848/nacos 即可


二、集群版部署

集群版部署主要满足以下几个条件即可:(注意:nacos 集群至少需要 3 个节点)

  • 必须使用 mysql 数据库,每个节点需要连接同一个 mysql 数据库
  • 每个节点都需要把所有节点的访问 ip 和端口配置上
  • 如果启用了用户名和密码验证,则必须每个节点的安全配置内容一致

在虚拟机上创建 /app/nacos-cluster 目录,里面放置 3 个 logs 目录、nginx.conf、docker-compose.yml

编写 docker-compose.yml 文件内容如下:

version: '3.5'
services:
  nacos1:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos1
    hostname: nacos1
    restart: always
    ports:
      # web 界面访问端口
      - 8841:8848
      # 程序使用 grpc 连接的端口
      - 9841:9848
    environment:
      - MODE=cluster
      - PREFER_HOST_MODE=hostname
      - NACOS_SERVERS=nacos1:8848,nacos2:8848,nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.136.128
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
      - MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai"
    volumes:
      - /app/nacos-cluster/logs1:/home/nacos/logs
    networks:
      - nacos_net

  nacos2:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos2
    hostname: nacos2
    restart: always
    ports:
      # web 界面访问端口
      - 8842:8848
      # 程序使用 grpc 连接的端口
      - 9842:9848
    environment:
      - MODE=cluster
      - PREFER_HOST_MODE=hostname
      - NACOS_SERVERS=nacos1:8848,nacos2:8848,nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.136.128
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
      - MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai"
    volumes:
      - /app/nacos-cluster/logs3:/home/nacos/logs
    networks:
      - nacos_net

  nacos3:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos3
    hostname: nacos3
    restart: always
    ports:
      # web 界面访问端口
      - 8843:8848
      # 程序使用 grpc 连接的端口
      - 9843:9848
    environment:
      - MODE=cluster
      - PREFER_HOST_MODE=hostname
      - NACOS_SERVERS=nacos1:8848,nacos2:8848,nacos3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.136.128
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
      - MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai"
    volumes:
      - /app/nacos-cluster/logs3:/home/nacos/logs
    networks:
      - nacos_net

  nginx:
    image: nginx
    container_name: nginx
    privileged: true
    restart: always
    volumes:
      - /app/nacos-cluster/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
      - 1080:1080
    networks:
      - nacos_net
    depends_on:
      - nacos1
      - nacos2
      - nacos3

# 网络配置
networks:
  nacos_net:
    driver: bridge

下面列出 nginx 的配置文件内容,由于 nginx 跟 3 个 nacos 节点在相同的网络 nacos_net,因此可以直接通过服务名称访问 3 个 nacos 节点,并直接对 3 个容器内部的 8848 和 9848 端口进行转发,其中 8848 采用 http 转发,9848 采用 tcp 转发,nginx 在 1.19 版本开始支持 tcp 的转发。

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

# 配置 http 服务
http {
    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;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream nacos-cluster {
        server nacos1:8848;
        server nacos2:8848;
        server nacos3:8848;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://nacos-cluster;
        }
    }
}

# 配置 tcp 服务
stream {
    upstream grpc-cluster {
        server nacos1:9848;
        server nacos2:9848;
        server nacos3:9848;
    }

    server {
        listen     1080;
        proxy_pass grpc-cluster;
    }
}

然后运行 docker-compose up -d 命令启动服务,由于我们既把每个节点的端口都映射出来,也采用 nginx 对容器内部的端口进行了转发,因此以下 4 个地址都可以访问 nacos 网站:

  • nginx 转发统一后的地址:http://192.168.136.128/nacos
  • nacos1 的访问地址:http://192.168.136.128:8841/nacos
  • nacos2 的访问地址:http://192.168.136.128:8842/nacos
  • nacos3 的访问地址:http://192.168.136.128:8843/nacos

三、启用账号密码访问

默认情况下,nacos 不需要用户名和密码验证,以上部署后的成果,直接访问就会进入 nacos 配置界面中。

对于 nacos 来说,一般情况下都是在内网使用,所以可以不启用账号密码验证。

如果想要启动账号密码访问,只需要在上面的 docker-compose.yml 中的 environment 下面增加以下环境变量配置即可:

# 设置以下环境变量时,启用账号密码登录(默认的账号和密码都是 nacos)
environment:
  # 启用账号密码验证
  - NACOS_AUTH_ENABLE=true
  # 随便使用一个32个字符组成的字符串,生成 base64 字符串,填写到这里即可
  - NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
  # 随便填写
  - NACOS_AUTH_IDENTITY_KEY=JobsKey
  # 随便填写
  - NACOS_AUTH_IDENTITY_VALUE=JobsValue

对于 nacos 集群来说,以上环境变量的配置内容必须保持一致。


OK,以上就是采用 docker-compose 部署单机 nacos 和 集群 nacos 的全部内容,有关 java 的连接操作,可以参考我之前发布的博客。

posted @ 2024-02-12 23:09  乔京飞  阅读(6921)  评论(0编辑  收藏  举报