docker-compose部署多环境apollo配置中心(无需修改java代码)

1,190 阅读3分钟

docker-compose部署多环境apollo配置中心

apollo 要部署三个模块:apollo-configservice,apollo-adminservice,apollo-portal
其中apollo-configservice,apollo-adminservice要分环境部署,
各个环境下apollo-configservice,apollo-adminservice公用一个数据库(参考官网)
apollo-portal独用一个数据库
共五个个数据库,apollo-configservice,apollo-adminservice分别在dev,fat,uat,pro一个数据库,apollo-portal一个数据库,如下图所示:

image.png

  1. 下载docker快速部署yml文件 地址:官网docker快速部署yml文件&msysql数据文件

image.png

2.参照官方快速部署方案部署 官方单环镜快速部署方案 在当前docker-compose.yml文件目录新建各个环境得目录

    sudo mkdir ./dev
    sudo mkdir ./pro

启动容器 docker-compose up 容器启动后使用docker ps 查看已启动得容器标识

image.png 执行

#拷贝快速部署文件到本地
docker cp 780f:/apollo-quick/start ./appolo-quick-start 
#快速部署文件拷贝各个环境
#对应dev环境service执行脚本
sudo cp ./apollo-quick-start/* ./dev/
#对应pro环境service执行脚本
sudo cp ./apollo-quick-start/* ./pro/
#对应portal执行脚本
sudo cp ./apollo-quick-start/* ./portal/

#修改各个config-service配置得demo.sh文件
#!/bin/bash

#apollo config db info

########此处修改service【测试环境|生产环境等】为对应环境得config数据库地址#######
##### ApolloConfigDBPRO | ApolloConfigDBDEV | ApolloConfigDBUAT | ApolloConfigDBFAT
apollo_config_db_url="jdbc:mysql://apollo-db:3306/ApolloConfigDBPRO?characterEncoding=utf8&serverTimezone=Asia/Shanghai"

apollo_config_db_username=root
apollo_config_db_password=

# apollo portal db info

########此处portal随意数据库各个环境统一使用一个#######
apollo_portal_db_url="jdbc:mysql://apollo-db:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"

apollo_portal_db_username=root
apollo_portal_db_password=

# =============== Please do not modify the following content =============== #

if [ "$(uname)" == "Darwin" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then
    windows="1"
else
    windows="0"
fi

# meta server url
config_server_url=http://localhost:8080
admin_server_url=http://localhost:8090
eureka_service_url=$config_server_url/eureka/
portal_url=http://localhost:8070

# JAVA OPTS
BASE_JAVA_OPTS="-Denv=dev"
CLIENT_JAVA_OPTS="$BASE_JAVA_OPTS -Dapollo.meta=$config_server_url"
SERVER_JAVA_OPTS="$BASE_JAVA_OPTS -Dspring.profiles.active=github -Deureka.service.url=$eureka_service_url"
PORTAL_JAVA_OPTS="$BASE_JAVA_OPTS -Ddev_meta=$config_server_url -Dspring.profiles.active=github,auth -Deureka.client.enabled=false -Dhibernate.query.plan_cache_max_size=192"

# executable
JAR_FILE=apollo-all-in-one.jar
SERVICE_DIR=./service
SERVICE_JAR_NAME=apollo-service.jar
SERVICE_JAR=$SERVICE_DIR/$SERVICE_JAR_NAME
SERVICE_LOG=$SERVICE_DIR/apollo-service.log
PORTAL_DIR=./portal
PORTAL_JAR_NAME=apollo-portal.jar
PORTAL_JAR=$PORTAL_DIR/$PORTAL_JAR_NAME
PORTAL_LOG=$PORTAL_DIR/apollo-portal.log
CLIENT_DIR=./client
CLIENT_JAR=$CLIENT_DIR/apollo-demo.jar

# go to script directory
cd "${0%/*}"

function checkJava {
  if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
      if [ "$windows" == "1" ]; then
        tmp_java_home=`cygpath -sw "$JAVA_HOME"`
        export JAVA_HOME=`cygpath -u "$tmp_java_home"`
        echo "Windows new JAVA_HOME is: $JAVA_HOME"
      fi
      _java="$JAVA_HOME/bin/java"
  elif type -p java > /dev/null; then
    _java=java
  else
      echo "Could not find java executable, please check PATH and JAVA_HOME variables."
      exit 1
  fi

  if [[ "$_java" ]]; then
      version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
      if [[ "$version" < "1.8" ]]; then
          echo "Java version is $version, please make sure java 1.8+ is in the path"
          exit 1
      fi
  fi
}

function checkServerAlive {
  declare -i counter=0
  declare -i max_counter=24 # 24*5=120s
  declare -i total_time=0

  SERVER_URL="$1"

  until [[ (( counter -ge max_counter )) || "$(curl -X GET --silent --connect-timeout 1 --max-time 2 --head $SERVER_URL | grep "HTTP")" != "" ]];
  do
    printf "."
    counter+=1
    sleep 5
  done

  total_time=counter*5

  if [[ (( counter -ge max_counter )) ]];
  then
    return $total_time
  fi

  return 0
}

checkJava

if [ "$1" = "start" ] ; then
  echo "==== starting service ===="
  echo "Service logging file is $SERVICE_LOG"
  export APP_NAME="apollo-service"
  export JAVA_OPTS="$SERVER_JAVA_OPTS -Dlogging.file.name=./apollo-service.log -Dspring.datasource.url=$apollo_config_db_url -Dspring.datasource.username=$apollo_config_db_username -Dspring.datasource.password=$apollo_config_db_password"

  if [[ -f $SERVICE_JAR ]]; then
    rm -rf $SERVICE_JAR
  fi

  ln $JAR_FILE $SERVICE_JAR
  chmod a+x $SERVICE_JAR

  $SERVICE_JAR start --configservice --adminservice

  rc=$?
  if [[ $rc != 0 ]];
  then
    echo "Failed to start service, return code: $rc. Please check $SERVICE_LOG for more information."
    exit $rc;
  fi

  printf "Waiting for config service startup"
  checkServerAlive $config_server_url

  rc=$?
  if [[ $rc != 0 ]];
  then
    printf "\nConfig service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.\n"
    exit 1;
  fi

  printf "\nConfig service started. You may visit $config_server_url for service status now!\n"

  printf "Waiting for admin service startup"
  checkServerAlive $admin_server_url

  rc=$?
  if [[ $rc != 0 ]];
  then
    printf "\nAdmin service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.\n"
    exit 1;
  fi

  printf "\nAdmin service started\n"


#===========================注释掉portal 模块===================================

#  echo "==== starting portal ===="
#  echo "Portal logging file is $PORTAL_LOG"
#  export APP_NAME="apollo-portal"
#  export JAVA_OPTS="$PORTAL_JAVA_OPTS -Dlogging.file.name=./apollo-portal.log -Dserver.port=8070 -Dspring.datasource.url=$apollo_portal_db_url -Dspring.datasource.username=$apollo_portal_db_username -Dspring.datasource.password=$apollo_portal_db_password"
#
#  if [[ -f $PORTAL_JAR ]]; then
#    rm -rf $PORTAL_JAR
#  fi
#
#  ln $JAR_FILE $PORTAL_JAR
#  chmod a+x $PORTAL_JAR
#
#  $PORTAL_JAR start --portal
#
#  rc=$?
#  if [[ $rc != 0 ]];
#  then
#    echo "Failed to start portal, return code: $rc. Please check $PORTAL_LOG for more information."
#    exit $rc;
#  fi
#
#  printf "Waiting for portal startup"
#  checkServerAlive $portal_url
#
#  rc=$?
#  if [[ $rc != 0 ]];
#  then
#    printf "\nPortal failed to start in $rc seconds! Please check $PORTAL_LOG for more information.\n"
#    exit 1;
#  fi
#
#  printf "\nPortal started. You can visit $portal_url now!\n"

 #======================================================================

  tail -f /dev/null
elif [ "$1" = "client" ] ; then
  if [ "$windows" == "1" ]; then
    java -classpath "$CLIENT_DIR;$CLIENT_JAR" $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
  else
    java -classpath $CLIENT_DIR:$CLIENT_JAR $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
  fi

elif [ "$1" = "stop" ] ; then
#  echo "==== stopping portal ===="
#  export APP_NAME="apollo-portal"
#  cd $PORTAL_DIR
#  ./$PORTAL_JAR_NAME stop
#
#  cd ..

  echo "==== stopping service ===="
  export APP_NAME="apollo-service"
  cd $SERVICE_DIR
  ./$SERVICE_JAR_NAME stop

else
  echo "Usage: demo.sh ( commands ... )"
  echo "commands:"
  echo "  start         start services-PRO"
  echo "  client        start client demo program"
  echo "  stop          stop services - PRO"
  exit 1
fi
对应每个环境configDb都修改成对应得数据库链接地址

修改portal配置脚本demo.sh得配置 
ApolloPortalDB各个环境分别建立一个数据库
ApolloPortalDB各个环境公用一个
#!/bin/bash

#apollo config db info
#apollo_config_db_url="jdbc:mysql://apollo-db:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
#apollo_config_db_username=root
#apollo_config_db_password=

# apollo portal db info
apollo_portal_db_url="jdbc:mysql://apollo-db:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_portal_db_username=root
apollo_portal_db_password=

# =============== Please do not modify the following content =============== #

if [ "$(uname)" == "Darwin" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then
    windows="1"
else
    windows="0"
fi

# meta server url
#config_server_url=http://localhost:8080
#admin_server_url=http://localhost:8090
#eureka_service_url=$config_server_url/eureka/
portal_url=http://localhost:8070

# JAVA OPTS
BASE_JAVA_OPTS="-Denv=dev"
CLIENT_JAVA_OPTS="$BASE_JAVA_OPTS -Dapollo.meta=$config_server_url"
#SERVER_JAVA_OPTS="$BASE_JAVA_OPTS -Dspring.profiles.active=github -Deureka.service.url=$eureka_service_url"
PORTAL_JAVA_OPTS="$BASE_JAVA_OPTS -Ddev_meta=$config_server_url -Dspring.profiles.active=github,auth -Deureka.client.enabled=false -Dhibernate.query.plan_cache_max_size=192"

# executable
JAR_FILE=apollo-all-in-one.jar
SERVICE_DIR=./service
SERVICE_JAR_NAME=apollo-service.jar
SERVICE_JAR=$SERVICE_DIR/$SERVICE_JAR_NAME
SERVICE_LOG=$SERVICE_DIR/apollo-service.log
PORTAL_DIR=./portal
PORTAL_JAR_NAME=apollo-portal.jar
PORTAL_JAR=$PORTAL_DIR/$PORTAL_JAR_NAME
PORTAL_LOG=$PORTAL_DIR/apollo-portal.log
CLIENT_DIR=./client
CLIENT_JAR=$CLIENT_DIR/apollo-demo.jar

# go to script directory
cd "${0%/*}"

function checkJava {
  if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
      if [ "$windows" == "1" ]; then
        tmp_java_home=`cygpath -sw "$JAVA_HOME"`
        export JAVA_HOME=`cygpath -u "$tmp_java_home"`
        echo "Windows new JAVA_HOME is: $JAVA_HOME"
      fi
      _java="$JAVA_HOME/bin/java"
  elif type -p java > /dev/null; then
    _java=java
  else
      echo "Could not find java executable, please check PATH and JAVA_HOME variables."
      exit 1
  fi

  if [[ "$_java" ]]; then
      version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
      if [[ "$version" < "1.8" ]]; then
          echo "Java version is $version, please make sure java 1.8+ is in the path"
          exit 1
      fi
  fi
}

function checkServerAlive {
  declare -i counter=0
  declare -i max_counter=24 # 24*5=120s
  declare -i total_time=0

  SERVER_URL="$1"

  until [[ (( counter -ge max_counter )) || "$(curl -X GET --silent --connect-timeout 1 --max-time 2 --head $SERVER_URL | grep "HTTP")" != "" ]];
  do
    printf "."
    counter+=1
    sleep 5
  done

  total_time=counter*5

  if [[ (( counter -ge max_counter )) ]];
  then
    return $total_time
  fi

  return 0
}

checkJava

if [ "$1" = "start" ] ; then
#  echo "==== starting apollo-protal ===="
#  echo "Service logging file is $SERVICE_LOG"
#  export APP_NAME="apollo-protal"
#  #export JAVA_OPTS="$SERVER_JAVA_OPTS -Dlogging.file.name=./apollo-service.log -Dspring.datasource.url=$apollo_config_db_url -Dspring.datasource.username=$apollo_config_db_username -Dspring.datasource.password=$apollo_config_db_password"
#
#  if [[ -f $SERVICE_JAR ]]; then
#    rm -rf $SERVICE_JAR
#  fi
#
#  ln $JAR_FILE $SERVICE_JAR
#  chmod a+x $SERVICE_JAR



####=============================================================================
#  $SERVICE_JAR start --configservice --adminservice
#
#
#
#  rc=$?
#  if [[ $rc != 0 ]];
#  then
#    echo "Failed to start service, return code: $rc. Please check $SERVICE_LOG for more information."
#    exit $rc;
#  fi
#
#  printf "Waiting for config service startup"
#  checkServerAlive $config_server_url
#
#  rc=$?
#  if [[ $rc != 0 ]];
#  then
#    printf "\nConfig service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.\n"
#    exit 1;
#  fi
#
#  printf "\nConfig service started. You may visit $config_server_url for service status now!\n"
#
#  printf "Waiting for admin service startup"
#  checkServerAlive $admin_server_url
#
#  rc=$?
#  if [[ $rc != 0 ]];
#  then
#    printf "\nAdmin service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.\n"
#    exit 1;
#  fi
#
#  printf "\nAdmin service started\n"
#
#  ####=============================================================================


#==============================================================

  echo "==== starting portal ===="
  echo "Portal logging file is $PORTAL_LOG"
  export APP_NAME="apollo-portal"
  export JAVA_OPTS="$PORTAL_JAVA_OPTS -Dlogging.file.name=./apollo-portal.log -Dserver.port=8070 -Dspring.datasource.url=$apollo_portal_db_url -Dspring.datasource.username=$apollo_portal_db_username -Dspring.datasource.password=$apollo_portal_db_password"

  if [[ -f $PORTAL_JAR ]]; then
    rm -rf $PORTAL_JAR
  fi

  ln $JAR_FILE $PORTAL_JAR
  chmod a+x $PORTAL_JAR

  $PORTAL_JAR start --portal

  rc=$?
  if [[ $rc != 0 ]];
  then
    echo "Failed to start portal, return code: $rc. Please check $PORTAL_LOG for more information."
    exit $rc;
  fi

  printf "Waiting for portal startup"
  checkServerAlive $portal_url

  rc=$?
  if [[ $rc != 0 ]];
  then
    printf "\nPortal failed to start in $rc seconds! Please check $PORTAL_LOG for more information.\n"
    exit 1;
  fi

  printf "\nPortal started. You can visit $portal_url now!\n"

 #======================================================================

  tail -f /dev/null
elif [ "$1" = "client" ] ; then
  if [ "$windows" == "1" ]; then
    java -classpath "$CLIENT_DIR;$CLIENT_JAR" $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
  else
    java -classpath $CLIENT_DIR:$CLIENT_JAR $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
  fi

elif [ "$1" = "stop" ] ; then
  echo "==== stopping portal ===="
  export APP_NAME="apollo-portal"
  cd $PORTAL_DIR
  ./$PORTAL_JAR_NAME stop

#  echo "==== stopping service ===="
#  export APP_NAME="apollo-service"
#  cd $SERVICE_DIR
#  ./$SERVICE_JAR_NAME stop

else
  echo "Usage: demo.sh ( commands ... )"
  echo "commands:"
  echo "  start         start services"
  echo "  client        start client demo program"
  echo "  stop          stop services"
  exit 1
fi
对应docker-compose.yml文件
version: '2'

services:
  apollo-protal:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-protal
    depends_on:
      - apollo-db
    volumes:
      - ./portal:/apollo-quick-start
    ports:
      - "9070:8070"
    links:
      - apollo-db

  apollo-service-dev:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-service-dev
    depends_on:
      - apollo-db
    volumes:
      - ./dev:/apollo-quick-start
    ports:
      - "9200:8080"
      - "9300:8090"
    links:
      - apollo-db

  apollo-service-pro:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-service-pro
    depends_on:
      - apollo-service-dev
      - apollo-db
    volumes:
      - ./pro:/apollo-quick-start
    ports:
      - "9201:8080"
      - "9301:8090"
    links:
      - apollo-db


  apollo-db:
    image: mysql:5.7
    container_name: apollo-db
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    depends_on:
      - apollo-dbdata
    ports:
      - "13306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    volumes_from:
      - apollo-dbdata

  apollo-dbdata:
    image: alpine:latest
    container_name: apollo-dbdata
    volumes:
      - /var/lib/mysql

启动容器可以直接访问: http://192.168.33.66:9200/ http://192.168.33.66:9201/

image.png

http://192.168.33.66:9070

image.png 账号: apollo 密码: admin

image.png 右侧环境dev | pro

主要部署思路在于部署脚本demo.sh得修改再绑定到容器内部
各个环境容器注释掉了demo.sh的portal启动代码,只启动了config-service和admin-service
apollo-portal注释掉了config-service和admin-service得启动部分,只启动了portal部分