1、前言
apollo 的详细介绍我就不在这里多说了,官网上 https://github.com/ctripcorp/… 已经说的非常明白了,我就不在这班门弄斧了,还不了解的小伙伴可以去官网上去了解下。
本篇文章只是记录我在使用 docker 部署的 Apollo 以及其集群的方式,给大家分享出来也自我做一个记录。
注意:我是直接部署开始的,有关数据库的创建和初始化自己根据官网搞定。
2、源码编译
2.1 网络策略
网络策略直接使用官网描述的就可以,具体就是分别编辑 apollo-configservice/src/main/resources/application.yml 和 apollo-adminservice/src/main/resources/application.yml,然后把需要忽略的网卡加进去。
如下面这个例子就是对于 apollo-configservice,把 docker0 和 veth.* 的网卡在注册到 Eureka 时忽略掉。
spring:
application:
name: apollo-configservice
profiles:
active: ${apollo_profile}
cloud:
inetutils:
ignoredInterfaces:
- docker0
- veth.*
注意,对于 application.yml 修改时要小心,千万不要把其它信息改错了,如 spring.application.name 等。
2.2 动态指定注册网络
在使用 docker 搭建集群是,adminservice、configservice 都需要向注册中心注册地址,如果不指定注册 IP,注册的是 docker 内部的网络,导致网络不通。
在 apollo-configservice/src/main/resources/bootstrap.yml 和 apollo-adminservice/src/main/resources/bootstrap.yml 添加如下代码。
eureka:
instance:
ip-address: ${eureka.instance.ip-address}
这个地方取值从环境变量中取,容器外部来配置这样给部署带来了更大的灵活性。
到这源码的修改已经完成,直接 build 打包就可以了,拿到对应三个服务的 zip 包。
如果懒得修改,也可以直接从 https://github.com/yuelicn/ap… 拉下我修改好的源码直接打包即可。
3、dockerfile 编写
Apollo 的 Dockerfile 非常简单,直接使用官方提供的即可。下方是 adminservice 示例。
# Dockerfile for apollo-adminservice
# Build with:
# docker build -t apollo-adminservice .
# Run with:
# docker run -p 8090:8090 -d --name apollo-adminservice apollo-adminservice
FROM java:8-jre
MAINTAINER Louis
ENV VERSION 1.5.0
RUN apt-get install unzip
ADD apollo-adminservice-${VERSION}-github.zip /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip
RUN unzip /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip -d /apollo-adminservice \
&& rm -rf /apollo-adminservice/apollo-adminservice-${VERSION}-github.zip \
&& sed -i '$d' /apollo-adminservice/scripts/startup.sh \
&& echo "tail -f /dev/null" >> /apollo-adminservice/scripts/startup.sh
EXPOSE 8090
CMD ["/apollo-adminservice/scripts/startup.sh"]
需要注意的,
1: version 需要根据自己打包的版本来修改
2: ADD zip 包时修改你路径
三个服务的 dockerfile 文件基本相同,我就不在这多说了。需要的小伙伴直接从 https://github.com/yuelicn/do…clone 就可以了。
4 docker-compose 的编写
4.1 apollo-configservice-compose.yml
version: "3"
services:
apollo-configservice:
container_name: apollo-configservice
build: apollo-configservice/
image: apollo-configservice
ports:
- 8080:8080
volumes:
- "/docker/apollo/logs/100003171:/opt/logs/100003171"
environment:
- spring_datasource_url=jdbc:mysql://127.0.0.1:8306/ApolloConfigDB_TEST?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=mysql2019*
- eureka.instance.ip-address=172.11.11.11
restart: always
注意事项,
1: build: 中指定你 Dockerfile 文件的位置
2: environment 环境变量中指定你数据库的配置信息
3: eureka.instance.ip-address 指定注册到 eureka 地址,这个最好使用你物理机的内网地址。
特别注意:启动前最好先修改 ApolloConfigDB 数据库中 ServerConfig 中的 eureka.service.url 值,改为具体的 IP
启动:
docker-compose -f apollo-configservice-compose.yml up --build -d
3.2 apollo-adminservice-compose.yml
apollo-adminservice-compose.yml 的内容基本和 apollo-configservice-compose.yml 相同,在这我就不一一说明了。
3.3 apollo-portal-compose.yml
version: "3"
services:
apollo-portal:
container_name: apollo-portal
build: apollo-portal/
image: apollo-portal
ports:
- 8070:8070
volumes:
- "/docker/apollo/logs/100003173:/opt/logs/100003173"
- "/apollo-portal/config/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
environment:
- spring_datasource_url=jdbc:mysql://127.0.0.1:8306/ApolloPortalDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=mysql2019*
restart: always
注意事项:
1: 需要注意的和上述 configservice 基本相同
2: 特别需要注意的事项 重要!重要!重要!重要!重要!volumes:中我将
apollo-env.properties 文件映射到容器外面了,将自己的 apollo-env.properties 文件配置后将自己的挂载地址填上,冒号前的地址“/apollo-portal/config/apollo-env.properties”修改成自己的。必须在启动前将此配置文件指定好。
启动
docker-compose -f apollo-configservice-compose.yml up --build -d
3.3.1 apollo-env.properties
local.meta=http://localhost:8080
dev.meta=${dev_meta}
fat.meta=${fat_meta}
uat.meta=${uat_meta}
lpt.meta=${lpt_meta}
pro.meta=${pro_meta}
将自己的 meta 地址配置上,没有的可以直接删除。有不明白的可以去官网上了解,环境配置完后修改对应的数据库中 ApolloPortalDB.ServerConfig
中 apollo.portal.envs 值,填上你的配置的环境。否则我们在 portal 管理页面只能看到默认 dev 环境。
4 完整的 docker-compose.yml
如果嫌弃一个个启动麻烦也以使用一个完整的 compose 来启动。
version: "3"
services:
apollo-configservice:
container_name: apollo-configservice
build: apollo-configservice/
image: apollo-configservice
ports:
- 8080:8080
volumes:
- "/docker/apollo/logs/100003171:/opt/logs/100003171"
environment:
- spring_datasource_url=jdbc:mysql://47.xx.xx.209:8306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=Tusdao@xx*
- eureka.instance.ip-address=172.11.11.11
restart: always
apollo-adminservice:
container_name: apollo-adminservice
build: apollo-adminservice/
image: apollo-adminservice
ports:
- 8090:8090
volumes:
- "/docker/apollo/logs/100003172:/opt/logs/100003172"
environment:
- spring_datasource_url=jdbc:mysql://47.xx.xx.209:8306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=Tusdao@xx*
- eureka.instance.ip-address=172.11.11.11
depends_on:
- apollo-configservice
restart: always
apollo-portal:
container_name: apollo-portal
build: apollo-portal/
image: apollo-portal
ports:
- 8070:8070
volumes:
- "/docker/apollo/logs/100003173:/opt/logs/100003173"
- "/Apollo/docker-image/apollo-portal/config/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
environment:
- spring_datasource_url=jdbc:mysql://47.xx.xx.209:8306/ApolloPortalDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=Tusdao@xx*
depends_on:
- apollo-adminservice
restart: always
注意:需要修改的地方和单个基本相同,我在这就不唠叨了。
到这 docker 部署 Apoll 基本搞定,如有小伙伴需要完整的 docker 部署文件请移步 https://github.com/yuelicn/do…
5 集群的搭建
Apollo 集群的搭建非常简单,只需要修改两个地方就可以了,我们就以正式环境 (pro) 来说明,
在 pro 环境我们搭建了两套 adminservice、configservice, 数据库都是同一个 ApolloConfigDB,
1: 将 ServerConfig 中的 eureka.service.url 值 eureka 连接信息两个都写上用逗号分隔:http://IP-1:port/eureka,http://IP-2:port/eureka
2: 修改 apollo-env.properties 中对应环境的连接信息如:pro.meta=http://IP-1:port,http://IP-2:port 地址用逗号分隔就可以了。
之后重启服务就搞定了。
最后强调,adminservice、configservice 需要每个环境单独部署,包括数据库。portal 只需要部署一套就可以了。
OK! 完成,上述是指个人搭建记录,希望对你有帮助,如果不对的地方欢迎指正。
修改后的源码地址:https://github.com/yuelicn/ap…
整理好的 Docker-Apollo:https://github.com/yuelicn/do…