3. Apollo环境搭建:Docker Compose部署Apollo、数据库初始化、Portal与Config Service配置

好,咱们直接进入实战环节。这一章我会带你亲手把Apollo跑起来。说实话,配置中心这东西,光看文档不实操,永远学不会。我见过太多人卡在环境搭建这一步,其实没那么复杂。

3.1 为什么选Docker Compose?

你可能会问:为啥非要用Docker Compose?直接下载个安装包不香吗?

嗯,这里有个坑。Apollo依赖Eureka做服务发现,还依赖MySQL存配置数据。手动装的话,你得先装MySQL、建库、初始化表结构,再启动Config Service、Admin Service、Portal三个服务。光配置文件的修改就能让你折腾半天。

我个人习惯用Docker Compose,原因很简单:一条命令拉起所有服务。而且环境隔离,不会污染你的开发机。我在项目中遇到过好几次,因为本地装了不同版本的MySQL导致Apollo启动失败,用Docker就再没出过这种问题。

核心组件一览:

  • Config Service — 配置读取入口,客户端连的就是它
  • Admin Service — 配置管理入口,Portal后台调的就是它
  • Portal — 可视化配置管理界面
  • Eureka — 服务注册与发现,Apollo内部用
  • MySQL — 持久化配置数据
Apollo Docker Compose 部署架构 Apollo Portal 配置管理界面 (8070) Config Service 配置读取 (8080) Admin Service 配置管理 (8090) Eureka 服务注册中心 MySQL 配置数据持久化 Apollo服务 注册中心 数据库

3.2 准备工作:目录结构与配置文件

先创建项目目录。我习惯把Apollo相关的文件都放在一个文件夹里,方便管理。

mkdir apollo-docker-compose
cd apollo-docker-compose

然后创建 docker-compose.yml。这是核心文件,定义了所有服务的启动参数。直接上代码:

version: '3.8'

services:
  apollo-db:
    image: mysql:5.7
    container_name: apollo-db
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: ApolloConfigDB
    ports:
      - "3306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
      - apollo-db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  apollo-configservice:
    image: apolloconfig/apollo-configservice:2.1.0
    container_name: apollo-configservice
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloConfigDB?useSSL=false
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root123
      EUREKA_INSTANCE_IP: apollo-configservice
    depends_on:
      apollo-db:
        condition: service_healthy

  apollo-adminservice:
    image: apolloconfig/apollo-adminservice:2.1.0
    container_name: apollo-adminservice
    ports:
      - "8090:8090"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloConfigDB?useSSL=false
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root123
    depends_on:
      apollo-db:
        condition: service_healthy

  apollo-portal:
    image: apolloconfig/apollo-portal:2.1.0
    container_name: apollo-portal
    ports:
      - "8070:8070"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloPortalDB?useSSL=false
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root123
      APOLLO_PORTAL_ENVS: dev
      DEV_META: http://apollo-configservice:8080
    depends_on:
      apollo-db:
        condition: service_healthy

volumes:
  apollo-db-data:

小提示:这里我用了MySQL 5.7,因为Apollo对MySQL 8.x的兼容性在早期版本有点小问题。如果你非要用8.x,记得加 ?useSSL=false&allowPublicKeyRetrieval=true 参数。

3.3 数据库初始化:别小看这一步

Apollo需要两个数据库:ApolloConfigDB 和 ApolloPortalDB。前者存配置数据,后者存Portal的用户、权限等信息。

官方提供了初始化SQL脚本。你需要下载它们放到 ./sql 目录下:

mkdir sql
cd sql
wget https://github.com/apolloconfig/apollo/raw/master/scripts/db/migration/configdb/V1.0.0__initialization.sql
wget https://github.com/apolloconfig/apollo/raw/master/scripts/db/migration/portaldb/V1.0.0__initialization.sql

注意文件名。Docker启动时,MySQL容器会自动执行 /docker-entrypoint-initdb.d 目录下的所有SQL文件。但有个细节:文件是按字母顺序执行的。所以如果你有多个SQL文件,记得命名好顺序。

我曾经踩过的坑:有一次我直接把两个SQL文件丢进去,结果ApolloConfigDB还没初始化完,Portal就去连了,导致启动失败。后来我改成在docker-compose里加 healthcheck,等数据库完全就绪再启动其他服务。上面代码里已经加上了,你直接用就行。

3.4 启动服务:见证奇迹的时刻

一切准备就绪,执行启动命令:

docker-compose up -d

第一次启动会拉取镜像,大概需要几分钟。你可以用 docker-compose logs -f 查看实时日志。

看到类似下面的日志,说明启动成功了:

apollo-configservice  | Started ApolloConfigServiceApplication in 25.3 seconds
apollo-adminservice   | Started ApolloAdminServiceApplication in 18.7 seconds
apollo-portal         | Started ApolloPortalApplication in 22.1 seconds

验证一下服务是否正常:

服务 地址 验证方法
Eureka http://localhost:8080/eureka 浏览器打开,看到注册的服务列表
Config Service http://localhost:8080 返回JSON格式的健康检查信息
Admin Service http://localhost:8090 返回JSON格式的健康检查信息
Portal http://localhost:8070 浏览器打开,看到登录页面

Portal的默认账号密码是 apollo / admin。登录后你会看到一个清爽的管理界面。

3.5 配置Portal与Config Service的关联

这里有个关键点:Portal需要知道Config Service的地址,才能拉取配置列表。在docker-compose里,我们通过环境变量 APOLLO_PORTAL_ENVS 和 DEV_META 来配置。

说白了,就是告诉Portal:「嘿,开发环境的Config Service在 http://apollo-configservice:8080 这个地址」。如果你有多个环境(比如dev、test、prod),可以这样配:

APOLLO_PORTAL_ENVS: dev,test,prod
DEV_META: http://apollo-configservice:8080
TEST_META: http://test-configservice:8080
PROD_META: http://prod-configservice:8080

注意,这里的 apollo-configservice 是Docker容器内的服务名,不是IP。Docker Compose会自动做DNS解析,容器之间用服务名通信就行。

核心要点:

  • Config Service和Admin Service共用 ApolloConfigDB
  • Portal单独使用 ApolloPortalDB
  • Portal通过 DEV_META 等环境变量找到Config Service
  • Config Service内置了Eureka,不需要额外部署注册中心

3.6 验证整体链路

启动完成后,我建议你做一次完整的链路验证:

  1. 打开 Eureka控制台 (http://localhost:8080/eureka),确认 CONFIG-SERVICE 和 ADMIN-SERVICE 都已注册
  2. 打开 Portal (http://localhost:8070),用 apollo/admin 登录
  3. 创建一个测试项目,比如叫 demo-app
  4. 添加一个配置项,比如 timeout=5000
  5. 发布配置
  6. 通过API验证配置是否生效:curl http://localhost:8080/configs/demo-app/default/application

如果第6步能返回你刚设置的配置,恭喜你,环境搭建成功了!

一个小技巧:我习惯在Portal里先创建一个 application 命名空间(Namespace),然后把公共配置放进去。这样所有客户端都能继承这些配置,不用每个应用都重复配一遍。后面章节会详细讲Namespace的设计。

嗯,环境搭建就到这里。你可能会觉得步骤有点多,但说白了就是「配好数据库 → 启动容器 → 验证链路」这三步。第一次搭可能花半小时,熟练了五分钟搞定。