1. 程式人生 > >Docker部署Apollo配置中心

Docker部署Apollo配置中心

war nvi 點擊 aso fat 基本 查詢 最新 nta

開始使用Docker部署Apollo配置中心之前,首先需要機器安裝Docker環境本文使用Vresion: 2.0.0.0-mac81 (29211)測試部署,並使用以下鏡像:

  • mysql
  • apollo-configservice
  • apollo-adminsrevice
  • apollo-portal

因為本文為純部署目的,因此不在這裏講解Apollo的一些知識,如有需要可查看官方GitHub地址(https://github.com/ctripcorp/apollo)。

上面提到的鏡像除了Mysql以外其余三個都需要自行編譯成Docker鏡像,由於最初是打算部署到k8s中的,所以是按照K8s的部署文檔來編譯相應的鏡像的。本文使用使用dockre-compose

部署dev、fat、uat、pro等環境,僅供測試時使用,詳細生產環境部署可查看官方指導,這裏先給出官方的分布式部署方案圖。

技術分享圖片

關於如何編譯apollo-configserviceapollo-adminsreviceapollo-portal這三個docker鏡像可點擊連接查看 K8s的部署文檔 來編譯Docker鏡像。

Apollo使用的是Spring Cloud微服務架構,主要包括以下服務:

  • 註冊中心(與apollo-configservice運行在一起)
  • 配置服務(apollo-configservice)
  • 管理服務(apollo-adminservice)
  • 管理門戶(apollo-portal)

Apollo主要使用Mysql存儲應用的配置以及自已的運行配置,Apollo使用以下數據庫完成存儲:

  • ApolloPortalDB
  • ApolloConfigDB

使用關系如下:

服務 ApolloPortalDB ApolloConfigDB
配置服務 Y
管理服務 Y
管理門戶 Y

下面準備使用Dockere在dev環境部署Apollo。

準備工作

從Github來拉取最新的Apollo代碼:

git clone [email protected]:ctripcorp/apollo.git

檢查啟動Docker是否啟動:

docker info

由於使用dockre-compose

部署,需要有一個dockre-compose配置文件,這裏假設有一個apollo-compose.yaml配置文件,之後的部署都會更新這個文件。如果你的機器還未安裝dockre-compose可查看 docker-compose安裝指導

配置Mysql服務

部署之前先將對應環境的Mysql服務啟動起來,這裏使用docker-compose啟動Mysql服務.

version: "3"
services:
 mysql-dev:
  image: mysql
  # restart: always
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  expose:
   - "3306"
  volumes:
    - /Users/yjwfn/bin/apollo/scripts/sql:/sql      

上面的配置代碼,將在dev環境運行mysql服務,這裏掛載了一個目錄:/Users/yjwfn/bin/apollo/scripts/sql:/sql,該目錄裏面存放Apollo的數據庫文件,詳細文件可查看 Apollo Sql文件。

使用以下命令啟動dev環境的mysql服務:

 docker-compose -f apollo-compose.yaml up -d mysql-dev

apollo-compose.yaml是你機上docker-compose配置文件,mysql-dev是mysql服務的名稱。

啟動完成後查看容器是否已經運行:

docker container ps

配置Apollo數據庫

mysql服務啟動完成之後,需要將apolloconfigdb.sqlapolloportaldb.sql這兩個sql文件導入到數據庫中,首先連接上docker中的mysql服務:

docker exec -it kube_mysql-dev_1 sh

kube_mysql-dev_1是mysql服務的容器名稱,連接上容器後登陸到mysql服務導入sql文件:

mysql -p123456
source /sql/apolloconfigdb.sql
srouce /sql/apolloportaldb.sql

如果是部署apollo-configserviceapollo-apolloportaldb的話只需要導入/sql/apolloconfigdb.sql就行了,相應的部署apollo-portal只需要導入/sql/apolloportaldb.sql,方便演示這裏就兩個同時導入了。

導入完成後數據中現在應該有ApolloConfigDBApolloPortalDB兩個數據庫,首先需要對ApolloConfigDB裏面的ServerConfig做一些修改,主要是對發服服務的服務器地址做一點變更:

use ApolloConfigDB;
update ServerConfig set Value="http://apollo-configservice-dev:8080/eureka/" where `key`="eureka.service.url";

apollo-configservice-dev是稍後我們需要發布的apollo-configservice服務的名稱。修改完成之後可運行查詢語句是否修改成功:

select * from ServerConfig;

修改完成之前退出dockre容器的連接就行了, 接下來部署apollo-configservice

配置服務部署(apollo-configservice)

Apollo配置服務(apollo-configservice)註冊中心(Eureka)是運行在一起的,所以一般情況下是不需要再部署Eureka了。現在部署apollo-configservice服務,首先在apollo-compose.yaml添加apollo-configservice服務:

version: "3"
services:
 ... #省略其他服務 
 apollo-configservice-dev:  
  image:  <鏡像地址>
  environment: 
   DATASOURCES_URL: jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8
   DATASOURCES_USERNAME: root
   DATASOURCES_PASSWORD: 123456
   ENV: "dev"
  expose:
   - "8080"
  depends_on:
   - "mysql-dev"

註意apollo-configservice-dev依賴了上面部署的mysql-dev服務,並且註入了一些環境變量:

  • DATASOURCES_URL (mysql-dev連接地址)
  • DATASOURCES_USERNAME (mysql-dev連接用戶)
  • DATASOURCES_PASSWORD (mysql-dev的root密碼)
  • ENV (apollo-configservice)的運行環境

服務添加完成後執行以下命令啟動apollo-configservice-dev服務:

docker-compose -f apollo-compose.yaml up -d apollo-configservice-dev

執行啟動命令後等待幾秒,然後查看服務是否啟動成功。可通過在容器中查看啟動日誌來判斷服務是否啟動成功:

docker exec -it kube_apollo-configservice-dev_1 sh
cat /opt/logs/apollo-config-server/apollo-configservice.log

kube_apollo-configservice-dev_1apollo-configservice-dev的容器名稱可通過docker container ps查看,看到如下日誌基本可以確定服務已經成功啟動:

2018-12-27 21:45:51.889  INFO 40 --- [Thread-17] c.n.e.registry.AbstractInstanceRegistry  : Registered instance APOLLO-CONFIGSERVICE/f2b6896763d0:apollo-configservice:8080 with status UP (replication=true)
2018-12-27 21:45:51.889  INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl    : Got 1 instances from neighboring DS node
2018-12-27 21:45:51.889  INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl    : Renew threshold is: 1
2018-12-27 21:45:51.889  INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl    : Changing status to UP
2018-12-27 21:45:51.894  INFO 40 --- [Thread-17] e.s.EurekaServerInitializerConfiguration : Started Eureka Server

管理服務部署(apollo-adminservice)

管理服務的配置基本上與配置服務的配置基本相似,首先在apollo-compose中添加apollo-adminservice-dev服務:

version: "3"
services:
 ... #省略其他服務配置
 apollo-adminservice-dev: 
  image:  <鏡像名稱>
  environment: 
   DATASOURCES_URL: "jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8"
   DATASOURCES_USERNAME: root
   DATASOURCES_PASSWORD: 123456
   ENV: "dev"
  expose:
   - "8080"
  depends_on:
   - "mysql-dev"  #管理服務依賴之前配置的mysql-dev服務
   - "apollo-configservice-dev" #管理服務依賴配置服務

apollo-configservice-dev一樣定義幾個環境變量:

  • DATASOURCES_URL (mysql-dev連接地址)
  • DATASOURCES_USERNAME (mysql-dev連接用戶)
  • DATASOURCES_PASSWORD (mysql-dev的root密碼)
  • ENV (apollo-configservice)的運行環境

添加服務完成後開始啟動apollo-adminservice-dev服務:

docker-compose -f apollo-compose.yaml up -d apollo-adminservice-dev

然後使用docker container ps查看容器名稱,隨後執行命令查看Log文件:

docker exec -it kube_apollo-adminservice-dev_1 sh
cat /opt/logs/apollo-admin-server/apollo-adminservice.log | tail -n 50

部分日誌輸出如下所示:

...
2018-12-27 21:56:45.722  INFO 40 --- [DiscoveryClient-InstanceInfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_APOLLO-ADMINSERVICE/8578c069d388:apollo-adminservice:8090: registering service...
2018-12-27 21:56:45.804  INFO 40 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 (http) with context path ‘‘
2018-12-27 21:56:45.810  INFO 40 --- [main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8090
2018-12-27 21:56:45.810  INFO 40 --- [DiscoveryClient-InstanceInfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_APOLLO-ADMINSERVICE/8578c069d388:apollo-adminservice:8090 - registration status: 204

現在可以確定Eureka註冊中心中已經有兩個服務分別為APOLLO-CONFIGSERVICEAPOLLO-ADMINSERVICE服務。

管理控制臺部署(apollo-portal)

成功部署配置服務(apollo-configservice)管理服務(apollo-adminsrevice)並啟動成功後,現在可以部署管理控制臺服務(apollo-portal)了。首先在apollo-compose.yaml文件添加兩個服務:

 mysql-portal:
   image: mysql
   # restart: always
   environment:
    - MYSQL_ROOT_PASSWORD=123456
   expose:
    - "3306"
   volumes:
    - /Users/yjwfn/bin/apollo/scripts/sql:/sql 

 apollo-portal: 
   image: <鏡像名稱>
   environment: 
    DEV_META_SERVICE_NAME: apollo-configservice-dev
    DATASOURCES_URL: "jdbc:mysql://mysql-portal:3306/ApolloPortalDB?characterEncoding=utf8"
    DATASOURCES_USERNAME: root
    DATASOURCES_PASSWORD: 123456
   # expose:
   #  - "8070" 
   ports:
    - 8070:8070 #方便測試導出端口
   depends_on:
    - "mysql-portal"
    - "apollo-configservice-dev"
    - "apollo-adminservice-dev"
  

管理控制臺服務使用了單獨的mysql服務,沒有與apollo-configservice-devapollo-adminservice-dev共享一個mysql服務,同樣mysql-portal也需要初始化數據庫,這裏我們首先啟動mysql-portal服務:

#啟動服務 
docker-compose -f apollo-compose.yaml up -d mysql-portal
#連接到容器執行命令
docker exec -it kube_mysql-portal_1 sh
#登陸mysql
mysql -p123456
#導入sql文件
source /sql/apolloportaldb.sql

mysql-portal啟動並配置完成後開始啟動apollo-portal服務:

docker-compose -f apollo-compose.yaml up -d apollo-portal

啟動成功後可訪問 http://localhost:8070 啟動管理控制臺。

總結

由於現在公司也正在使用Apollo做為分布式配置中心,所以決定學習下Apollo的相關知識。 此文章只涉及到部署想著的知識,裏面提到的一些內容其實都可以在官方文檔中找到,這裏不得不提下Apollo的文檔資料還是非常全的。總的來說部署的過程還是有些坑的,但是經過一段時候的摸索,還是成功的在Docker中部署了,之後還會學習Apollo的使用相關的知識,後續再來分享。

最後附上完整的apollo-compose.yaml文件湊湊字數:

#坑一: mysql使用有對象設置環境變量無效

version: "3"
services:
 mysql-dev:
  image: mysql
  # restart: always
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  expose:
   - "3306"
  volumes:
    - /Users/yjwfn/bin/apollo/scripts/sql:/sql      

 apollo-configservice-dev:  
  image: harbor.rcntech.cn/apollo/apollo-configservice:v1.2.0
  environment: 
   DATASOURCES_URL: jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8
   DATASOURCES_USERNAME: root
   DATASOURCES_PASSWORD: 123456
   ENV: "dev"
  expose:
   - "8080"
  depends_on:
   - "mysql-dev"


 apollo-adminservice-dev: 
  image: harbor.rcntech.cn/apollo/apollo-adminservice:v1.2.0
  environment: 
   DATASOURCES_URL: "jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8"
   DATASOURCES_USERNAME: root
   DATASOURCES_PASSWORD: 123456
   ENV: "dev"
  expose:
   - "8080"
  depends_on:
   - "mysql-dev"
   - "apollo-configservice-dev"
 mysql-portal:
   image: mysql
   # restart: always
   environment:
    - MYSQL_ROOT_PASSWORD=123456
   expose:
    - "3306"
   volumes:
    - /Users/yjwfn/bin/apollo/scripts/sql:/sql 

 apollo-portal: 
   image: harbor.rcntech.cn/apollo/apollo-portal:v1.2.0
   environment: 
    DEV_META_SERVICE_NAME: apollo-configservice-dev
    DATASOURCES_URL: "jdbc:mysql://mysql-portal:3306/ApolloPortalDB?characterEncoding=utf8"
    DATASOURCES_USERNAME: root
    DATASOURCES_PASSWORD: 123456
   ports:
    - 8070:8070
   depends_on:
    - "mysql-portal"
    - "apollo-configservice-dev"
    - "apollo-adminservice-dev"

Docker部署Apollo配置中心