Nacos集群使用docker构建和部署

xysgo / 2024-02-26 / 原文

使用Dockers部署Nacos集群

前置条件:

  • 已经安装docker

  • 已经有Mysql服务保存Nacos配置数据

  • Docker Swarm集群已经初始化

    [root@swarm nacos]# docker node ls
    ID                            HOSTNAME          STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    lbrj80f4queyxowvqgoxq4e21 *   swarm.manager14   Ready     Active         Leader           24.0.6
    dglfv8gqgxqebfrjvfyqv5lju     swarm.work15      Ready     Active                          24.0.6
    ycbtvvg2vh82bjghkeqjl5rvz     swarm.work16      Ready     Active                          24.0.6
    k7k9dg4lx12g7vz1d9f59y2up     swarm.work17      Ready     Active                          24.0.6
    
  • Nacos稳定版本和Linux版本的Jdk稳定版本

  • 私有镜像仓库可以正常使用(可选)

构建私有镜像

准备

创建目录

[root@swarm nacos]# pwd
/app/nacos
## 目录层级和目录中文件如下
/app/nacos/
/app/nacos/nacos.Dockerfile 
/app/nacos/nacos.yml

/app/nacos/asset/
/app/nacos/asset/nacos-server-2.3.0.tar.gz
/app/nacos/asset/jdk-8u144-linux-x64.tar.gz 

/app/nacos/asset/bin/
/app/nacos/asset/bin/docker-startup.sh

/app/nacos/asset/conf/
/app/nacos/asset/conf/application.properties
/app/nacos/asset/conf/cluster.conf
/app/nacos/asset/conf/console-guide.conf
/app/nacos/asset/conf/nacos-logback.xml

tar.gz包

从官方网站下载 jdk-8u144-linux-x64.tar.gz nacos-server-2.3.0.tar.gz

docker-startup.sh

获取方式:解压nacos-server-*.tar.gz包后,复制里面的 bin/startup.sh ,修改最后的启动脚本,将后台启动修改为前台启动,

具体修改: nohup 修改为 exec ,最后的 & 符号去掉。

#!/bin/bash
## 此处省略内容
******************
******************

if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
 exec  "$JAVA" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1
else
 exec  "$JAVA" "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1
fi
echo "nacos is starting. you can check the ${BASE_DIR}/logs/start.out"

application.properties

conf目录中的所有配置文件都是从nacos-server-*.tar.gz包里面复制来,只是按需求做了一定修改

## 动态从环境变量中获取配置来替换
server.port=${NACOS_APPLICATION_PORT:8848}
## 直接写死配置
db.num=1
db.url.0=jdbc:mysql://10.2.1.14:3336/nacos_mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

修改集群配置文件

cat asset/conf/cluster.conf
#it is ip
#example
10.2.1.15:8848
10.2.1.16:8848
10.2.1.17:8848

nacos.Dockerfile

FROM centos:centos7
# 构建一个自定义的nacos镜像,需要的jdk和nacos-server自行下载

WORKDIR /home
# identity、gzip、bzip2 或 xz 这些文件会自动解压
ADD ../asset/jdk-8u144-linux-x64.tar.gz      jdk
ADD ../asset/nacos-server-2.3.0.tar.gz       .
#  nacos-server-2.3.0.tar.gz 解压后
#  直接从解压后的配置中复制后修改
ADD ../asset/conf/*                          nacos/conf
#   复制 startup.sh 文件为 docker-startup.sh 修改最后的启动命令为 exec 方式,让nacos进程成为容器内的 pid=1 的进程 。
ADD ../asset/bin/*                           nacos/bin

ENV NACOS_HOME /home/nacos

ENV JAVA_HOME /home/jdk/jdk1.8.0_144
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $PATH:${JAVA_HOME}/bin

# 这里使用环境变量来覆盖配置文件里面的默认配置
ENV NACOS_APPLICATION_PORT 8848

EXPOSE 8848
WORKDIR $NACOS_HOME
ENTRYPOINT ["bin/docker-startup.sh"]
# CMD [ "/bin/startup.sh" ]

nacos.yml

version: '3.8'
services:
  nacos:
    image: 10.2.1.14:8082/nacos:2.3.0
    ports:
    ## 端口相关文件  https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html  
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
      - "7848:7848"
    volumes:
      - nacos_volume:/home/nacos
    networks:
      - swarm_net
    deploy:
      replicas: 3
networks:
  swarm_net:
    # external: true 时 要手动创建这个网络  docker network create -d overlay swarm_net
    external: true
volumes:
  nacos_volume:

构建

# 在 swarm 集群主节点上执行以下命令
# 创建网络,如果没有的话
docker network create -d overlay swarm_net
# 进入目录
cd  /app/nacos/
# 构建镜像
docker build -t 10.2.1.14:8082/nacos:2.3.0 -f nacos.Dockerfile .
# 推送到私有仓库
docker login 10.2.1.14:8082 -u admin -p pass
docker push 10.2.1.14:8082/nacos:2.3.0

启动

# 通过docker stack 发布启动 
docker stack deploy -c nacos.yml  nacos
# 查看服务 
docker service ls 
# 查看日志 
docker service logs qv2msyp8z

问题

  • 启动过程报错

    1. 检查数据库配置是否正确,并且正常连接
  • 无法拉取镜像

    1. 检查docker的配置文件是否正确 /etc/docker/daemon.json

      {"default-address-pools":[{"base":"10.30.0.0/16","size":24}],"insecure-registries":["10.2.1.14:8082","10.2.1.14:5000"],"registry-mirrors":["http://10.2.1.14:5000"]}
      
    2. 检查私有仓库的镜像是否是最新

  • 启动后无法访问

  • 集群节点IP注册不对