1、前言
apollo的详细介绍我就不在这里多说了,官网上https://github.com/ctripcorp/apollo 已经说的非常明白了,我就不在这班门弄斧了,还不了解的小伙伴可以去官网上去了解下。
本篇文章只是记录我在使用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/apollo.拉下我修改好的源码直接打包即可。
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-adminserviceFROM java:8-jreMAINTAINER LouisENV VERSION 1.5.0RUN apt-get install unzipADD apollo-adminservice-${VERSION}-github.zip /apollo-adminservice/apollo-adminservice-${VERSION}-github.zipRUN 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.shEXPOSE 8090CMD ["/apollo-adminservice/scripts/startup.sh"]
需要注意的,
1: version 需要根据自己打包的版本来修改
2: ADD zip包时修改你路径
三个服务的dockerfile文件基本相同,我就不在这多说了。需要的小伙伴直接从https://github.com/yuelicn/docker-apollo就可以了。
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