刚到一个新公司,注册中心用的consul
,配置中心用的Apollo
。公司服务器有个问题,都部署到一个外网环境,公司的人也很多都出差,用的都是这个环境。就会导致我自己做测试的时候,服务注册到consul
上,其他人也会调用到你的服务,你的调用也可能调用的其他人的服务,比较麻烦,我就想着在自己本地做一套注册配置中心。
之前是没有用过Apollo
的,但是用过consul
,所以就只搭一个Apollo
的环境就可以了。
为了方便起见,也为了以后能够搭一套Apollo
的集群,我就直接在docker
上搞了。
关于Apollo
关于Apollo
这一部分我就不赘述了,有兴趣的可以去GitHub上了解一下,毕竟官方已经说的很明白了,而且我也是第一次用,小白一个。
本篇文章只是记载了我使用Docker部署Apollo的过程,有用的同学可以参考一下,我自己也做个记录。
环境
系统
-
macOS Catalina 10.15.7
-
处理器 i5
-
内存 8G
Docker
- Version 19.03.5, build 633a0ea
- docker-compose version 1.25.2, build 698e284
下面正式开始记录创建过程。
1. 源码
直接从GitHub上clone了一份,版本 1.8.0-SNAPSHOT,版本比较新。下载下来的代码基本上不用动。
2. 数据库
我docker上已经有一个MySQL5.7的数据库了,可以直接用,这一部分就简单说一下。
-
拉取数据库镜像
docker pull mysql:5.7
-
启动容器
docker run -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
-
将源码中的两个数据文件导入到数据库
apollo/script/sql/apolloconfigdb.sql
和apollo/script/sql/apolloportaldb.sql
-
更新ApolloConfigDB库中的
ServerConfig
表,把 key 为eureka.service.url
的value 的IP,就是eureka的注册地址,更新成本机的IP。我本机的IP是192.168.0.145,端口的映射我也不准备改了。update ApolloConfigDB.ServiceConfig set value = 'http://192.168.0.145:8080/eureka' where id = 1
数据库基本上就完成了,下一步是docker的部分。
3. Dockerfile
Dockerfile
直接用官方提供的就行,我们需要将三个项目打成镜像,apollo-adminservice、apollo-configservice、apollo-portal。
这三个项目的src/main/docker/ 文件夹下都有官方写好的Dockerfile,现在以apollo-adminservice 的Dockerfile
为例,说一下内容:
# Dockerfile for apollo-adminservice
# 1. ./scripts/build.sh
# 2. Build with: mvn docker:build -pl apollo-adminservice
# 3. Run with: docker run -p 8090:8090 -e SPRING_DATASOURCE_URL="jdbc:mysql://fill-in-the-correct-server:3306/ApolloConfigDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=FillInCorrectUser -e SPRING_DATASOURCE_PASSWORD=FillInCorrectPassword -d -v /tmp/logs:/opt/logs --name apollo-adminservice apolloconfig/apollo-adminservice
FROM openjdk:8-jre-alpine
MAINTAINER ameizi <sxyx2008@163.com>
ENV APOLLO_RUN_MODE "Docker"
ENV VERSION 1.8.0-SNAPSHOT
ENV SERVER_PORT 8090
RUN echo "http://mirrors.aliyun.com/alpine/v3.8/main" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.8/community" >> /etc/apk/repositories \
&& apk update upgrade \
&& apk add --no-cache procps unzip curl bash tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
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 \
&& chmod +x /apollo-adminservice/scripts/startup.sh
EXPOSE $SERVER_PORT
CMD ["/apollo-adminservice/scripts/startup.sh"]
需要注意的,
- version 需要根据自己打包的版本来修改,我的就是 1.8.0-SNAPSHOT
- ADD zip包时修改你的路径,这个也不用动
三个项目的Dockerfile文件都差不多,就不过多描述了。
4. docker-compose 文件编写
4.1 apollo-configservice-compose.yml
version: "3"
services:
apollo-configservice:
container_name: apollo-configservice
build: /Users/moriarty/source/github/apollo/apollo-configservice/src/main/docker/
image: apollo-configservice
ports:
- 8080:8080
volumes:
- "/Users/moriarty/docker/apollo/logs/100003171:/opt/logs/100003171"
environment:
- spring_datasource_url=jdbc:mysql://192.168.0.145:3306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=root
- eureka.instance.ip-address=192.168.0.145
restart: always
需要注意的点:
- build 标签:此为
apollo-configservice
模块的Dockerfile所在路径,要绝对路径 - volumes 标签: 分号前的部分是我本机的一个文件夹路径,用来存储日志的,分号后面的路径是容器中的路径。就是把容器中的日志路径挂载到物理机上,方便日志查询
- environment 标签: 这个主要是配置数据库连接的。标签中最后一个元素
eureka.instance.ip-address
,指定注册到eureka的地址,最好是物理机的地址。我这里用的是物理机的地址,因为没有为容器配置IP,所以每次启动IP可能是不同的,所以直接指定到物理机的IP比较方便,毕竟是要把容器的端口映射到物理机上来的。 - 启动命令
docker-compose -f apollo-configservice-compose.yml up --build -d
#--build是构建镜像,第一次启动的时候要加上这个参数。
注: apollo-adminservice-compose.yml 和本案例基本相同,不做赘述。
4.2 apollo-portal-compose.yml
apollo-portal:
container_name: apollo-portal
build: /Users/moriarty/source/github/apollo/apollo-portal/src/main/docker/
image: apollo-portal
ports:
- 8070:8070
volumes:
- "/Users/moriarty/docker/apollo/logs/100003173:/opt/logs/100003173"
- "/Users/moriarty/docker/apollo/envs/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
environment:
- spring_datasource_url=jdbc:mysql://192.168.0.145:3306/ApolloPortalDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=root
restart: always
这个配置基本上跟 apollo-configservice-compose.yml相同。注意一下不同点:
- volumes 标签: 我把 apollo-env.properties 文件放到外面了,这样启动的时候可以配置。同样也要**绝对路径****:容器内路径
- environment 标签:不需要 eureka.instance.ip-address 元素
- 启动命令
docker-compose -f apollo-configservice-compose.yml up --build -d
4.2.1 apollo-env.properties
local.meta=http://localhost:8080
dev.meta=http://192.168.0.145:8080
#fat.meta=${fat_meta}
#uat.meta=${uat_meta}
#lpt.meta=${lpt_meta}
#pro.meta=${pro_meta}
配置自己的环境,不需要的可以注掉或者删掉。这个环境对应的是 ApolloPortalDB 库中ServerConfig 表的 apollo.portal.envs
。我这里只是一个开发环境,所以只有dev。
5. apollo-compose.yml
如果你觉得搞三个文件太麻烦的话,可以把这三个docker-compose
文件合并成一个。
#### apollo-configservice 配置
version: "3"
services:
apollo-configservice:
container_name: apollo-configservice
build: /Users/moriarty/source/github/apollo/apollo-configservice/src/main/docker/
image: apollo-configservice
ports:
- 8080:8080
volumes:
- "/Users/moriarty/docker/apollo/logs/100003171:/opt/logs/100003171"
environment:
- spring_datasource_url=jdbc:mysql://192.168.0.145:3306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=root
- eureka.instance.ip-address=192.168.0.145
restart: always
##############################################
##### apollo-adminservice 配置
apollo-adminservice:
container_name: apollo-adminservice
build: /Users/moriarty/source/github/apollo/apollo-adminservice/src/main/docker/
image: apollo-adminservice
ports:
- 8090:8090
volumes:
- "/Users/moriarty/docker/apollo/logs/100003172:/opt/logs/100003172"
environment:
- spring_datasource_url=jdbc:mysql://192.168.0.145:3306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=root
- eureka.instance.ip-address=192.168.0.145
depends_on:
- apollo-configservice
restart: always
##############################################
#### apollo-portal 配置
apollo-portal:
container_name: apollo-portal
build: /Users/moriarty/source/github/apollo/apollo-portal/src/main/docker/
image: apollo-portal
ports:
- 8070:8070
volumes:
- "/Users/moriarty/docker/apollo/logs/100003173:/opt/logs/100003173"
- "/Users/moriarty/docker/apollo/envs/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
environment:
- spring_datasource_url=jdbc:mysql://192.168.0.145:3306/ApolloPortalDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=root
depends_on:
- apollo-adminservice
restart: always
注意 apollo-portal 配置的 depends_on 元素。
6. 关于集群
Apollo 的集群搭建其实比较简单,只需要修改两个地方:
- ApolloConfigDB 库的 ServerConfig 表,把eureka的连接信息都加上,就是更新
eureka.service.url
这一行。数据用逗号分隔,如:http://192.168.0.145:8080/eureka,http://192.168.0.146:8080/eureka
update ServerConfig set value='http://192.168.0.145:8080/eureka,http://192.168.0.146:8080/eureka' where id = 1
-
修改 apollo-env.properties 文件中的meta信息 ,如:
local.meta=http://localhost:8080 dev.meta=http://192.168.0.145:8080,http://192.168.0.146:8080
之后重启服务。
有一点需要注意,如果你要部署不同的环境,比如要部署dev和fat两套环境,adminservice、configservice 需要每个环境单独部署,包括数据库。portal只需要部署一套就可以了