M2 Pro 本地docker部署apollo
本文记录了利用 Docker 部署 Apollo 配置中心的操作步骤。
1. 环境说明
硬件: MacBook Pro 14 M2 pro
Apollo版本:2.1.0
建议在阅读本文前,先了解下Apollo 配置中心官方文档。
2. 部署前准备
安装docker,并配置好镜像源:否则拉取可能会失败
能够科学上网:最好能够正常访问docker hub官网,便于搜索并确定拉取镜像版本
3. 部署整体步骤说明
- Apollo依赖于MySQL数据库,因此首先会部署MySQL
- 执行Apollo的SQL初始化脚本apolloconfigdb.sql和apolloportaldb.sql
- 部署apollo-configservice
- 部署apollo-adminservice
- 部署apollo-portal
4. 部署流程
4.1 部署MySQL(如果本地已部署,直接跳到4.2步骤)
拉取mysql镜像,指定版本号:8.0.31,官网要求版本号大于等于 MySQL 5.6.5即可
注意我这里是M2 Pro芯片,因此要拉取指定arm架构的版本
docker pull arm64v8/mysql:8.0.31
启动容器
docker run --name apollo-mysql \
-p 3308:3306 \ #映射端口 3306 到宿主机 3308 端,注意这里根据自己的情况设置,我的3306端口已被之前部署的mysql占用
-e MYSQL_ROOT_PASSWORD=root \ #数据库密码
-d arm64v8/mysql:8.0.31
4.2 执行Apollo的SQL初始化脚本
前面提到本次部署采用的Apollo版本是2.1.0,这里最好去官方仓库搜对应的版本下载SQL初始化脚本。
需要下载(官方 Apollo-2.1.0 gitee仓库链接)并执行两个脚本,分别是ApolloPortalDB.sql和ApolloConfigDB.sql。两个脚本缺一不可。
两个SQL脚本执行后,对应的数据库库名:
ApolloPortalDB.sql对应数据库 schema:ApolloPortalDB
ApolloConfigDB.sql对应数据库 schema:ApolloConfigDB
4.3 部署apollo-configservice
拉取apollo-configservice镜像
注意:
一定要拉取Apollo2.1.0版本的镜像,避免出现意想不到的问题,且最好科学上网,否则即使docker配置了国内镜像源也大概率会出现拉取超时失败的问题。
docker hub 搜索Apollo,前三个即我们要部署的三个子服务
- 先进入第三个apollo-configservice,点击Tags
- 找到对应的2.1.0版本,复制docker命令
docker pull apolloconfig/apollo-configservice:2.1.0 #M系列芯片不要使用这个
重点:
如果是M系列芯片这里一定要指定arm架构的版本,否则拉取的可能是linux/amd64版本,虽然docker能够启动,但是没有显示日志,并且无法正常访问。
docker pull --platform linux/arm64 apolloconfig/apollo-portal:2.1.0 #M系列芯片
#在Docker中,--platform 参数用于指定构建或运行容器时的目标平台。
#Docker 容器可以跨多个平台构建和运行,包括不同的操作系统和架构。
#例如,您可以为Linux的x86_64架构构建一个容器,并在ARM64架构的设备上运行它,只要Docker镜像支持该平台。
#使用 --platform 参数可以确保Docker镜像是为特定平台构建的,
#这有助于避免在不支持的平台上运行容器时出现问题。
启动容器
- 启动前请确保前面部署的mysql是运行状态且本地客户端能够测试通过正常连接,这里使用idea自带的数据库连接测试
创建deploy_apollo_configservice.sh脚本,复制下面的脚本指令,执行
注意:
- 因为我都是本机docker部署,为了防止IP抖动,可以使用host.docker.internal代替具体的ip。
在Docker中,host.docker.internal 是一个特殊的DNS名称,它用于容器之间或容器与宿主机之间的网络通信。当你在Docker容器内需要引用宿主机的IP地址时,可以使用这个名称。
以下是 host.docker.internal 的几个关键点:
1.容器到宿主机的连接:容器可以通过 host.docker.internal 访问宿主机的内部网络接口,实现容器与宿主机之间的网络通信。
2.容器之间的连接:如果容器需要互相通信,并且它们都在同一个宿主机上运行,它们可以使用 host.docker.internal 来互相引用。
3.网络隔离:host.docker.internal 只在Docker的默认网络中有效,这意味着它不适用于自定义网络或跨宿主机的容器。
- 比如下面脚本设定JDBC URL 时使用的该指令代替主机IP(使用127.0.0.1或者localhost docker容器之间无法正常通信)。
- 当然你也可以直接使用ifconfig查询到的宿主机的内网 IP
- 建议使用host.docker.internal,否则切换网络时,IP地址出现抖动需要重新配置
deploy_apollo_configservice.sh脚本如下
version=2.1.0 #apollo版本
db_user=root #MySQL 用户名
db_pass=root # 这个数据库密码应该是你部署 MySQL 的时候设置的 root 用户的密码
app_name=apollo-configservice
docker run --name ${app_name} \
-p 7080:8080 \ # 映射端口 8080 到宿主机 7080 端口
-e SERVER_PORT=8080 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://host.docker.internal:3308/ApolloConfigDB?characterEncoding=utf8" \ #设定 JDBC URL 使用的 host 为 host.docker.internal,注意端口号修改为自己前面配置的,我这里使用的是3308
-e SPRING_DATASOURCE_USERNAME=${db_user} \
-e SPRING_DATASOURCE_PASSWORD=${db_pass} \
-d apolloconfig/${app_name}:${version}
访问http://localhost:7080/
显示如下eureka页面表示部署成功!
端口映射更改带来的配置变动
- apollo-configservice 服务同时承担 meta server 职责,如果要修改端口,注意要同时同步到ApolloConfigDB.ServerConfig 表中的eureka.service.url配置项以及 apollo-portal 和 apollo-client 中的使用到的 meta server 信息
- 你可以理解为,apollo-adminservice和apollo-portal要向apollo-configservice注册自己的信息,因此需要知道apollo-configservice的地址,而apollo-adminservice和apollo-portal是可以通过读取对应数据库中apollo-configservice的url的信息的,我们可以在数据库中直接更改即可,这一点在官方文档2.2.1.1.2.4 配置 apollo-portal 的 meta service 信息中有指出
因此在部署另外两个服务前需要做以下两个表信息变动。
1. ApolloConfigDB.ServerConfig 表变动——apollo-adminservice读取这个表获取apollo-configservice URL
修改ApolloConfigDB数据库中ServerConfig表中eureka.service.url的值为
http://host.docker.internal:7080/eureka/ #注意端口跟你前面映射的宿主机端口保持一致
2. ApolloPortalDB.ServerConfig 表变动——apollo-portal读取这个表获取apollo-configservice URL
修改ApolloPortalDB数据库中ServerConfig表中apollo.portal.meta.servers的值为
{
"DEV":"http://host.docker.internal:7080"
}
4.4 部署apollo-adminservice
前提:保证apollo-configservice部署运行成功
拉取镜像
docker pull --platform linux/arm64 apolloconfig/adminservice:2.1.0 #M系列芯片,指定平台为 arm架构类型
启动容器
创建deploy_apollo_adminservice.sh脚本,复制下面的指令,执行
version=2.1.0
db_user=root
db_pass=root # 这个数据库密码应该是你部署 MySQL 的时候设置的 root 用户的密码
app_name=apollo-adminservice
docker run --name ${app_name} \
-p 7090:8090 \ # 映射端口 8090 到宿主机 8090 端
-e SERVER_PORT=8090 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://host.docker.internal:3308/ApolloConfigDB?characterEncoding=utf8" \ # 注意对应本机部署的MySQL
-e SPRING_DATASOURCE_USERNAME=${db_user} \
-e SPRING_DATASOURCE_PASSWORD=${db_pass} \
-d apolloconfig/${app_name}:${version}
-
访问 http://localhost:7090/出现下面页面部署成功!
-
查看运行日志,没有报错
4.5 部署apollo-portal
前提:保证apollo-configservice部署运行成功
拉取镜像
docker pull --platform linux/arm64 apolloconfig/portal:2.1.0 #M系列芯片,指定平台为 arm架构类型
启动容器
创建deploy_apollo_portal.sh脚本,复制下面的指令,执行
version=2.1.0
db_user=root
db_pass=root # 这个数据库密码应该是你部署 MySQL 的时候设置的 root 用户的密码
app_name=apollo-portal
docker run --name ${app_name} \
-p 7070:8070 \
-e SERVER_PORT=8070 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://host.docker.internal:3308/ApolloPortalDB?characterEncoding=utf8" \ # 注意对应本机部署的MySQL
-e SPRING_DATASOURCE_USERNAME=${db_user} \
-e SPRING_DATASOURCE_PASSWORD=${db_pass} \
-e APOLLO_PORTAL_ENVS=dev \
-d apolloconfig/${app_name}:${version}
-
访问http://localhost:7070/signin,
-
默认账号apollo,密码:admin 成功!!
-
查看运行日志