Docker 部署 Apollo

刚到一个新公司,注册中心用的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.sqlapollo/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-adminserviceapollo-configserviceapollo-portal

这三个项目的src/main/docker/ 文件夹下都有官方写好的Dockerfile,现在以apollo-adminserviceDockerfile为例,说一下内容:

# 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只需要部署一套就可以了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值