开始使用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"
《架构文摘》天天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。