開始使用Docker部署Apollo配置中心以前,首先須要機器安裝Docker環境本文使用Vresion: 2.0.0.0-mac81 (29211)
測試部署,並使用如下鏡像:node
由於本文爲純部署目的,所以不在這裏講解Apollo的一些知識,若有須要可查看官方GitHub地址(https://github.com/ctripcorp/apollo)。mysql
上面提到的鏡像除了Mysql
之外其他三個都須要自行編譯成Docker鏡像,因爲最初是打算部署到k8s中的,因此是按照K8s的部署文檔來編譯相應的鏡像的。本文使用使用dockre-compose
部署dev、fat、uat、pro等環境,僅供測試時使用,詳細生產環境部署可查看官方指導,這裏先給出官方的分佈式部署方案圖。git
關於如何編譯apollo-configservice
、apollo-adminsrevice
、apollo-portal
這三個docker鏡像可點擊鏈接查看 K8s的部署文檔 來編譯Docker鏡像。github
Apollo使用的是Spring Cloud微服務架構,主要包括如下服務:sql
Apollo主要使用Mysql存儲應用的配置以及自已的運行配置,Apollo使用如下數據庫完成存儲:docker
使用關係以下:shell
服務 | ApolloPortalDB | ApolloConfigDB |
---|---|---|
配置服務 | Y | |
管理服務 | Y | |
管理門戶 | Y |
下面準備使用Dockere在dev
環境部署Apollo。數據庫
從Github來拉取最新的Apollo代碼:tomcat
git clone git@github.com:ctripcorp/apollo.git
檢查啓動Docker是否啓動:服務器
docker info
因爲使用dockre-compose
部署,須要有一個dockre-compose
配置文件,這裏假設有一個apollo-compose.yaml
配置文件,以後的部署都會更新這個文件。若是你的機器還未安裝dockre-compose
可查看 docker-compose安裝指導
部署以前先將對應環境的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
mysql服務啓動完成以後,須要將apolloconfigdb.sql
與apolloportaldb.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-configservice
與apollo-apolloportaldb
的話只須要導入/sql/apolloconfigdb.sql
就好了,相應的部署apollo-portal
只須要導入/sql/apolloportaldb.sql
,方便演示這裏就兩個同時導入了。
導入完成後數據中如今應該有ApolloConfigDB
與ApolloPortalDB
兩個數據庫,首先須要對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配置服務(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
服務,而且注入了一些環境變量:
服務添加完成後執行如下命令啓動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_1
是apollo-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-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
同樣定義幾個環境變量:
添加服務完成後開始啓動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-CONFIGSERVICE
和APOLLO-ADMINSERVICE
服務。
成功部署配置服務(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-dev
和apollo-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"
《架構文摘》天天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性 能、高穩定)、大數據、機器學習等各個熱門領域。