Nacos集群使用docker构建和部署
使用Dockers部署Nacos集群
前置条件:
-
(可选,第一版准备使用swarm模式部署,serverIP获取问题无法解决,切换为使用compose)
-
私有镜像仓库可以正常使用(可选)
构建私有镜像
准备
创建目录
[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}
nacos.inetutils.ip-address=${NACOS_APPLICATION_IP_ADDRESS}
## 直接写死配置
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:1
container_name: nacos
restart: always
environment:
- NACOS_APPLICATION_IP_ADDRESS=10.2.1.17 # 直接指定集群server的IP
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
- "7848:7848"
volumes:
- nacos_volume:/home/nacos
# nacos 使用swarm模式部署服务的IP无法自动获取,所以直接使用compose直接部署 k8s 有个 peer-finder 解决方案,待研究
# deploy:
# replicas: 3
volumes:
nacos_volume:
构建
# 在 swarm 集群主节点上执行以下命令
# 进入目录
cd /app/nacos/
# 构建镜像
docker build -t 10.2.1.14:8082/nacos.2.3.0:1 -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:1
启动
## 进入各个节点 创建目录 添加 nacos.yml 的内容 记得修改环境变量中 NACOS_APPLICATION_IP_ADDRESS 参数的值
mkdir -p /app/nacos && vi nacos.yml
# 通过docker-compose 启动服务
docker-compose -f nacos.yml up -d
# 查看服务
docker ps
问题
-
启动过程报错
- 检查数据库配置是否正确,并且正常连接
-
无法拉取镜像
-
检查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"]}
-
检查私有仓库的镜像是否是最新
-
-
启动后无法访问
-
集群节点IP注册不对
nacos.inetutils.ip-address=${NACOS_APPLICATION_IP_ADDRESS}