docker部署nacos2.2

Posted 小吉猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker部署nacos2.2相关的知识,希望对你有一定的参考价值。

docker-startup.sh

#!/bin/bash
# Copyright 1999-2018 Alibaba Group Holding Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -x
export CUSTOM_SEARCH_NAMES="application"
export CUSTOM_SEARCH_LOCATIONS=file:$BASE_DIR/conf/
export MEMBER_LIST=""
PLUGINS_DIR="/home/nacos/plugins/peer-finder"
function print_servers() 
   if [[ ! -d "$PLUGINS_DIR" ]]; then
    echo "" >"$CLUSTER_CONF"
    for server in $NACOS_SERVERS; do
      echo "$server" >>"$CLUSTER_CONF"
    done
  else
    bash $PLUGINS_DIR/plugin.sh
    sleep 30
  fi

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "$MODE" == "standalone" ]]; then

  JAVA_OPT="$JAVA_OPT -Xms$JVM_XMS -Xmx$JVM_XMX -Xmn$JVM_XMN"
  JAVA_OPT="$JAVA_OPT -Dnacos.standalone=true"
else
  if [[ "$EMBEDDED_STORAGE" == "embedded" ]]; then
    JAVA_OPT="$JAVA_OPT -DembeddedStorage=true"
  fi
  JAVA_OPT="$JAVA_OPT -server -Xms$JVM_XMS -Xmx$JVM_XMX -Xmn$JVM_XMN -XX:MetaspaceSize=$JVM_MS -XX:MaxMetaspaceSize=$JVM_MMS"
  if [[ "$NACOS_DEBUG" == "y" ]]; then
    JAVA_OPT="$JAVA_OPT -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
  fi
  JAVA_OPT="$JAVA_OPT -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$BASE_DIR/logs/java_heapdump.hprof"
  JAVA_OPT="$JAVA_OPT -XX:-UseLargePages"
  print_servers
fi

#===========================================================================================
# Setting system properties
#===========================================================================================
# set  mode that Nacos Server function of split
if [[ "$FUNCTION_MODE" == "config" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.functionMode=config"
elif [[ "$FUNCTION_MODE" == "naming" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.functionMode=naming"
fi
# set nacos server ip
if [[ ! -z "$NACOS_SERVER_IP" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.server.ip=$NACOS_SERVER_IP"
fi

if [[ ! -z "$USE_ONLY_SITE_INTERFACES" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.inetutils.use-only-site-local-interfaces=$USE_ONLY_SITE_INTERFACES"
fi

if [[ ! -z "$PREFERRED_NETWORKS" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.inetutils.preferred-networks=$PREFERRED_NETWORKS"
fi

if [[ ! -z "$IGNORED_INTERFACES" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.inetutils.ignored-interfaces=$IGNORED_INTERFACES"
fi

### If turn on auth system:
if [[ ! -z "$NACOS_AUTH_ENABLE" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.core.auth.enabled=$NACOS_AUTH_ENABLE"
fi

if [[ "$PREFER_HOST_MODE" == "hostname" ]]; then
  JAVA_OPT="$JAVA_OPT -Dnacos.preferHostnameOverIp=true"
fi
JAVA_OPT="$JAVA_OPT -Dnacos.member.list=$MEMBER_LIST"

JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n \'s/.* version "([0-9]*).*$/\\1/p\')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]]; then
  JAVA_OPT="$JAVA_OPT -Xlog:gc*:file=$BASE_DIR/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
else
  JAVA_OPT_EXT_FIX="-Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/ext"
  JAVA_OPT="$JAVA_OPT -Xloggc:$BASE_DIR/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi

JAVA_OPT="$JAVA_OPT -Dloader.path=$BASE_DIR/plugins,$BASE_DIR/plugins/health,$BASE_DIR/plugins/cmdb,$BASE_DIR/plugins/selector"
JAVA_OPT="$JAVA_OPT -Dnacos.home=$BASE_DIR"
JAVA_OPT="$JAVA_OPT -jar $BASE_DIR/target/nacos-server.jar"
JAVA_OPT="$JAVA_OPT $JAVA_OPT_EXT"
JAVA_OPT="$JAVA_OPT --spring.config.additional-location=$CUSTOM_SEARCH_LOCATIONS"
JAVA_OPT="$JAVA_OPT --spring.config.name=$CUSTOM_SEARCH_NAMES"
JAVA_OPT="$JAVA_OPT --logging.config=$BASE_DIR/conf/nacos-logback.xml"
JAVA_OPT="$JAVA_OPT --server.max-http-header-size=524288"

echo "Nacos is starting, you can docker logs your container"
exec $JAVA $JAVA_OPT

application.properties

# spring
server.servlet.contextPath=$SERVER_SERVLET_CONTEXTPATH:/nacos
server.contextPath=/nacos
server.port=$NACOS_APPLICATION_PORT:8848
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %User-Agenti %Request-Sourcei
server.tomcat.accesslog.enabled=$TOMCAT_ACCESSLOG_ENABLED:false
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=$SPRING_DATASOURCE_PLATFORM:
spring.sql.init.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=1
db.url.0=jdbc:mysql://xxxxx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user.0=nacos
db.password.0=xxxxx
### The auth system to use, currently only \'nacos\' and \'ldap\' is supported:
nacos.core.auth.system.type=nacos
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=$NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567490123456789
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=$NACOS_AUTH_CACHE_ENABLE:false
nacos.core.auth.enable.userAgentAuthWhite=$NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false
nacos.core.auth.server.identity.key=$NACOS_AUTH_IDENTITY_KEY:serverIdentity
nacos.core.auth.server.identity.value=$NACOS_AUTH_IDENTITY_VALUE:security
## spring security config
### turn off security
nacos.security.ignore.urls=$NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

dockerfile

FROM centos:7.9.2009

# set environment
ENV MODE="standalone" \\
    PREFER_HOST_MODE="ip"\\
    BASE_DIR="/home/nacos" \\
    CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \\
    CLUSTER_CONF="/home/nacos/conf/cluster.conf" \\
    FUNCTION_MODE="all" \\
    JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \\
    NACOS_USER="nacos" \\
    JAVA="/usr/lib/jvm/java-1.8.0-openjdk/bin/java" \\
    JVM_XMS="1g" \\
    JVM_XMX="1g" \\
    JVM_XMN="512m" \\
    JVM_MS="128m" \\
    JVM_MMS="320m" \\
    NACOS_DEBUG="n" \\
    TOMCAT_ACCESSLOG_ENABLED="false" \\
    TIME_ZONE="Asia/Shanghai"

ARG NACOS_VERSION=2.2.2
ARG HOT_FIX_FLAG=""

WORKDIR $BASE_DIR

RUN set -x \\
    && yum update -y \\
    && yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc vim libcurl
RUN wget --no-check-certificate https://github.com/alibaba/nacos/releases/download/$NACOS_VERSION$HOT_FIX_FLAG/nacos-server-$NACOS_VERSION.tar.gz -P /home
RUN tar -xzvf /home/nacos-server-$NACOS_VERSION.tar.gz -C /home \\
    && rm -rf /home/nacos-server-$NACOS_VERSION.tar.gz /home/nacos/bin/* /home/nacos/conf/*.properties /home/nacos/conf/*.example /home/nacos/conf/nacos-mysql.sql
RUN yum autoremove -y wget \\
    && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \\
    && yum clean all




ADD bin/docker-startup.sh bin/docker-startup.sh
ADD conf/application.properties conf/application.properties


# set startup log dir
RUN mkdir -p logs \\
	&& cd logs \\
	&& touch start.out \\
	&& ln -sf /dev/stdout start.out \\
	&& ln -sf /dev/stderr start.out
RUN chmod +x bin/docker-startup.sh

EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]

docker-compose.yaml

version: "3.8"
services:
  nacos:
    image: nacos/nacos-server:v2.2.2
    container_name: nacos-standalone
    environment:
      - PREFER_HOST_MODE=ip
      - MODE=standalone
      - SPRING_DATASOURCE_PLATFORM=mysql
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./conf/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"

参考文档

https://nacos.io/zh-cn/docs/quick-start-docker.html

Nacos Server Docker部署集群踩坑

参考技术A 我们的应用是AWS云原生环境,之前在美国区域使用的是nacos-server.jar进行安装(ec2),后面开展新的区域部署时准备将所有的ec2应用全部转换为ecs部署,包括Nacos。我们参考Naocs官网Docker镜像集群默认方式部署,控制台能够正常方式并创建Namespace和congfig。但是到了应用注册时就报错了:

最后还因为Nacos之间也无法互相注册成功,导致大量日志输出,频繁GC,最后Nacos服务宕机。

查询网络以及官网issu也没统一的处理意见,大多是说版本问题,我们从1.4.0降级到1.3.0也都没法解决问题。

通过仔细的排查日志、Nacos Server日志,经过小一个小时,最终找到问题,原来是因为:

改成Docker-standalone模式。数据持久化用mysql,使用aws负载均衡器能保证高可用,从而达到Nacos 集群的效果。

以上是关于docker部署nacos2.2的主要内容,如果未能解决你的问题,请参考以下文章

docker安装nacos2.2详细手册

nacos2.2.1启动教程

Nacos2.2使用PostgreSQL数据源插件存储数据手把手教程

Nacos2.2使用PostgreSQL数据源插件存储数据手把手教程

Nacos学习笔记 Nacos集群部署

Nacos学习笔记 Nacos集群部署