首先阅读本文需要掌握的知识点:mysql、docker、apollo、linux的常用命令。
我使用的时cenos7操作系统,这个安装就不说了,要么用服务器要么用虚拟机。
我使用的版本是version19.03.5,安装和配置的详情请看我前面的文章Docker的入门理解、Docker安装与配置、Docker常用命令。
MySql数据库,可docker化,我使用docker化的mysql,这里有个小坑,坑了我一天时间。下面介绍Docker化mysql的安装。
获取镜像命令:
(原Docker镜像官方仓库,有可能网络会卡住)
docker pull mysql
或者
(网易云的Docker镜像仓库)
docker pull hub.c.163.com/library/mysql:latest
启动mysql镜像命令:
docker pull hub.c.163.com/library/mysql:latest
pull后面跟的是镜像名或者id
首先从github上下载apollo项目
开源地址:https://github.com/ctripcorp/apollo
下载后得到一个这样的项目结构
图1
连接刚刚docker化的mysql数据库。
把项目中路径为scripts/db/docker-quick-start/sql/apolloconfigdb.sql和scripts/db/docker-quick-start/sql/apolloportaldb.sql(图1中红色框)的两个sql文件里的代码复制或者导入到你的数据库管理软件中执行,执行后得到ApolloConfigDB和ApolloPortalDB两个数据库。
可修改图中红框地址为你的eureka注册中心地址
这里可修改环境的名字和个数,用逗号分隔,例如:dev,fat,uat,pro
分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。
Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。
所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice和apollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。
如下面这个例子就是对于apollo-configservice,把docker0和veth.* 的网卡在注册到Eureka时忽略掉。
spring:
application:
name: apollo-configservice
profiles:
active: ${apollo_profile}
cloud:
inetutils:
ignoredInterfaces:
- docker0
- veth.*
在apollo-configservice\src\main\resources\application.yml和apollo-adminservice\src\main\resources\application.yml里加入这个忽略规则。
随后双击编辑build.sh执行文件(图1中黄色框)。
图2
修改图2中红框的数据,第一个为ApolloConfigDB数据的连接信息,第二个为ApolloPortalDB数据的连接信息。第三个为各个环境下对应的configservice服务地址。我这里测试只设了一个dev测试地址,所以只改了一个dev的。
使用windows下使用cmd命令或者直接在idea的Terminal下进入到项目中的scripts目录下执行可执行文件build.sh(或者打开文件夹双击执行也行)。
等待执行完后把项目中apollo-adminservice、apollo-configservice、apollo-portal三个文件夹通过文件传输工具传入虚拟机的cenos7操作系统中
随后把三个文件夹各自对应的路径/apollo-adminservice/target、/apollo-configservice/target、/apollo-portal/target中的zip包拷贝到对应目录分别为/apollo-adminservice/src/main/docker、/apollo-configservice/src/main/docker、/apollo-portal/src/main/docker中。
然而这里还有一个要注意的点,毕竟8080端口太常用,所以我希望把三个服务的端口都改一改,所以这里需要把每个服务对应的Dockerfile文件里对应的端口都改一下。
像这样,把8070改为9070,另外的两个Dockerfile也改一下。
随后到刚刚的apollo-adminservice、apollo-configservice、apollo-portal三个文件夹的同级目录下创建一个docker-compose.yml文件:
文件内容是:
version: "3"
services:
apollo-configservice: ##容器服务名
container_name: apollo-configservice ##容器名
build: apollo-configservice/src/main/docker/ ##Dockerfile路径
image: apollo-configservice:1.6.0 ##镜像名
ports:
- "9080:9080"
volumes:
- "/opt/logs/100003171:/opt/logs/100003171" ##将/opt/logs/100003171目录挂载到宿主机的/opt/logs/100003171方便在宿主机上查看日志
environment:
- spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=123456
- eureka.instance.ip-address=192.168.241.10
restart: always
apollo-adminservice:
container_name: apollo-adminservice
build: apollo-adminservice/src/main/docker/
image: apollo-adminservice:1.6.0
ports:
- "9090:9090"
depends_on:
- apollo-configservice
volumes:
- "/opt/logs/100003172:/opt/logs/100003172"
environment:
- spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=123456
- eureka.instance.ip-address=192.168.241.10
restart: always
apollo-portal:
container_name: apollo-portal
build: apollo-portal/src/main/docker/
image: apollo-portal:1.6.0
ports:
- "9070:9070"
depends_on:
- apollo-adminservice
volumes:
- "/opt/logs/100003173:/opt/logs/100003173"
environment:
- spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloPortalDB?characterEncoding=utf8
- spring_datasource_username=root
- spring_datasource_password=123456
restart: always
在此目录下执行命令:
docker-compose up -d
利用docker compose命令直接一步做到构建三个镜像,docker运行三个镜像(也可以一个个来自己构建和运行,通过他自带的那个Dockerfile一个命令就能构建镜像)。
docker compose需要安装,安装方法就不说了,忘了,请移步自行百度。
构建和启动成功!!
随后在我高兴了不到一分钟,发现这三个apollo的docker容器都停了!
查看日志发现报错just quit unexpectedly, please check logs under /opt/logs/100003171 and /tmp for more information!
然后再进入对应目录查看运行日志发现原因是连不上数据库?我数据库明明都开了,在我windows上都能通过数据库管理软件连上去进行建表操作,所以排除了数据库没运行起来的可能。
辗转反侧,到处查资料,发现原因是需要关闭linux防火墙。。。
命令:
systemctl stop firewalld.service
然后再重新启动镜像,运行成功,值得一提的是,一个个运行镜像的话按照configservice、adminservice、portal顺序启动。
运行成功!