docker-compose部署Apollo多环境高可用集群

  1. 架构

  1. 四大核心模块

  1. 三个辅助模块

这里部署包含dev、prod两个环境单集群

一、MySQL

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
MySQL数据库 128.0.255.96 3306 测试环境复用了mysql-archery
  1. 目录规划
1
2
mysql/ #docker-compose
mysql/script/ #数据库初始化脚本
  1. 多环境数据库脚本
1
2
#github 获取'apolloportaldb.sql''apolloconfigdb.sql' 放置script文件夹下
#apolloconfigdb.sql复制一份,并分别命名为apolloconfigdbdev.sql、apolloconfigdbprod.sql;并修改里面数据库名分别为'_dev''_prod'
  1. 编写docker-compose.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: '3.5'
services:
mysql:
image: mysql:5.7.42
container_name: mysql
restart: always
ports:
- '3306:3306' # 这里需要暴露端口,用mysql客户端修改apollo一些配置
environment:
MYSQL_ROOT_PASSWORD: "Apollo"
deploy:
resources:
limits:
cpus: '1'
memory: '512M'
networks:
- apollo
volumes:
- ./data:/var/lib/mysql
- ./script:/docker-entrypoint-initdb.d/
healthcheck:
test: ["CMD","mysqladmin","-uroot","-pApollo123","ping","-h","localhost"]
timeout: 2s
interval: 10s
retries: 5
start_period: 5s
networks:
apollo:
name: apollo
driver: bridge
ipam:
driver: default
config:
- subnet: 10.88.30.0/24
  1. 启动容器
1
docker-compose up -d
  1. 验证部署是否成功

使用mysql客户端连接

  1. 部署完后目录结构

二、Eureka

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Eureka-Dev 128.0.255.96 8761/18761 服务治理(注册和发现)
Eureka-prod 128.0.255.96 28761/38761 服务治理(注册和发现)
  1. 目录规划
1
2
eureka/eureka-dev #docker-cpomse
eureka/eureka-prod #docker-cpomse
  1. 编写docker-compose.yml文件
1
vim eureka/eureka-dev/docker-cpomse.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
version: '3.5'
services:
eureka-dev-1:
container_name: eureka-dev-1
image: lhstack/eureka
ports:
- 8761:8761
deploy:
resources:
limits:
cpus: '1'
memory: '256M'
logging:
driver: json-file
options:
max-size: "1k"
max-file: "1"
environment:
JAVA_OPTS: "-Xmx128m -Xms128m"
SECURITY_ENABLE: "true"
SECURITY_USERNAME: admin
SECURITY_PASSWORD: admin
EUREKA_SERVER_URLS: "http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka"
networks:
- apollo
eureka-dev-2:
container_name: eureka-dev-2
image: lhstack/eureka
ports:
- 18761:8761
deploy:
resources:
limits:
cpus: '1'
memory: '256M'
logging:
driver: json-file
options:
max-size: "1k"
max-file: "1"
environment:
JAVA_OPTS: "-Xmx128m -Xms128m"
SECURITY_ENABLE: "true"
SECURITY_USERNAME: admin
SECURITY_PASSWORD: admin
EUREKA_SERVER_URLS: "http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka"
networks:
- apollo
networks:
apollo:
name: apollo
1
vim eureka/eureka-prod/docker-cpomse.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
version: '3.5'
services:
eureka-prod-1:
container_name: eureka-prod-1
image: lhstack/eureka
ports:
- 28761:8761
deploy:
resources:
limits:
cpus: '1'
memory: '256M'
logging:
driver: json-file
options:
max-size: "1k"
max-file: "1"
environment:
JAVA_OPTS: "-Xmx128m -Xms128m"
SECURITY_ENABLE: "true"
SECURITY_USERNAME: admin
SECURITY_PASSWORD: admin
EUREKA_SERVER_URLS: "http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka"
networks:
- apollo
eureka-prod-2:
container_name: eureka-prod-2
image: lhstack/eureka
ports:
- 38761:8761
deploy:
resources:
limits:
cpus: '1'
memory: '256M'
logging:
driver: json-file
options:
max-size: "1k"
max-file: "1"
environment:
JAVA_OPTS: "-Xmx128m -Xms128m"
SECURITY_ENABLE: "true"
SECURITY_USERNAME: admin
SECURITY_PASSWORD: admin
EUREKA_SERVER_URLS: "http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka"
networks:
- apollo
networks:
apollo:
name: apollo

将数据库ApolloConfigDB-dev、ApolloConfigDB-prod中ServerConfig表中的eureka.service.url值分别修改为如下内容

http://admin:admin@eureka-dev-1:8761/eureka,http://admin:admin@eureka-dev-2:8761/eureka
http://admin:admin@eureka-prod-1:8761/eureka,http://admin:admin@eureka-prod-2:8761/eureka

  1. 启动容器
1
docker-compose up -d
  1. 验证部署是否成功

查看Eureka状态

如果部署了eureka多实例,”DS Replicas”将显示”eureka-dev-1”、”eureka-dev-2”

  1. 部署完后目录结构

三、ConfigService

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Configservice-Dev 128.0.255.96 8080 Client接口服务
Configservice-prod 128.0.255.96 18080 Client接口服务
  1. 目录规划
1
2
3
4
5
configservice
configservice/configservice-dev #docker-compose
configservice/configservice-dev/conf.d #nginx.config
configservice/configservice-prod #docker-compose
configservice/configservice-prod/conf.d #nginx.config
  1. 编写dev环境configservice
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
version: '3.5'
services:
configservice-dev-ha:
image: nginx:alpine
container_name: configservice-dev-ha
restart: always
ports:
- '8080:8080'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
deploy:
resources:
limits:
memory: '16M'
#cpus: '16k'
volumes:
- ./conf.d:/etc/nginx/conf.d
networks:
- apollo
depends_on:
- configservice-dev-1
- configservice-dev-2
configservice-dev-1:
image: apolloconfig/apollo-configservice:2.0.0
container_name: configservice-dev-1
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
#cpus: '50m'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
configservice-dev-2:
image: apolloconfig/apollo-configservice:2.0.0
container_name: configservice-dev-2
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
#cpus: '50m'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
networks:
apollo:
name: apollo
  • configservice.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream configservice{
server configservice-dev-1:8080;
server configservice-dev-2:8080;
}
server {
listen 8080;
listen [::]:8080;
server_name configservice.lhstack.com;
root /usr/share/nginx/html;
client_max_body_size 50m;
location / {
proxy_pass http://configservice;
}
}
  1. 编写prod环境configservice
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
version: '3.5'
services:
configservice-prod-ha:
image: nginx:alpine
container_name: configservice-prod-ha
restart: always
ports:
- '18080:8080'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
deploy:
resources:
limits:
memory: '16M'
#cpus: '16k'
volumes:
- ./conf.d:/etc/nginx/conf.d
networks:
- apollo
depends_on:
- configservice-prod-1
- configservice-prod-2
configservice-prod-1:
image: apolloconfig/apollo-configservice:2.0.0
container_name: configservice-prod-1
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
#cpus: '50m'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
configservice-prod-2:
image: apolloconfig/apollo-configservice:2.0.0
container_name: configservice-prod-2
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
#cpus: '50m'
logging:
driver: json-file
options:
max-file: '2'
max-size: '32k'
networks:
apollo:
name: apollo
  • configservice.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream configservice{
server configservice-prod-1:8080;
server configservice-prod-2:8080;
}
server {
listen 8080;
listen [::]:8080;
server_name configservice.lhstack.com;
root /usr/share/nginx/html;
client_max_body_size 50m;
location / {
proxy_pass http://configservice;
}
}
  1. 启动容器
1
docker-compose up -d
  1. 验证部署是否成功

查看configservice状态

如果configservice部署了多个实例,则”Status”列会显示多个实例

  1. 部署完后目录结构

四、AdminService

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Adminservice-Dev 128.0.255.96 8090 UI界面接口服务
Adminservice-prod 128.0.255.96 18090 UI界面接口服务
  1. 目录规划
1
2
3
4
5
adminservice
adminservice/adminservice-dev #docker-compose
adminservice/adminservice-dev/conf.d #nginx.config
adminservice/adminservice-prod #docker-compose
adminservice/adminservice-prod/conf.d #nginx.config
  1. 编写dev环境adminservice
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
version: '3.5'
services:
adminservice-dev-ha:
image: nginx:alpine
container_name: adminservice-dev-ha
restart: always
ports:
- '8090:8090'
logging:
driver: json-file
deploy:
resources:
limits:
memory: '16M'
volumes:
- ./conf.d:/etc/nginx/conf.d
networks:
- apollo
depends_on:
- adminservice-dev-1
- adminservice-dev-2
adminservice-dev-1:
image: apolloconfig/apollo-adminservice:2.0.0
container_name: adminservice-dev-1
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
logging:
driver: json-file
options:
max-size: '32k'
adminservice-dev-2:
image: apolloconfig/apollo-adminservice:2.0.0
container_name: adminservice-dev-2
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_dev?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
logging:
driver: json-file
options:
max-size: '32k'
networks:
apollo:
name: apollo
  • adminservice.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream adminservice{
server adminservice-dev-1:8080;
server adminservice-dev-2:8080;
}
server {
listen 8090;
listen [::]:8090;
server_name adminservice.lhstack.com;
root /usr/share/nginx/html;
client_max_body_size 50m;
location / {
proxy_pass http://adminservice;
}
}
  1. 编写prod环境adminservice
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
version: '3.5'
services:
adminservice-prod-ha:
image: nginx:alpine
container_name: adminservice-prod-ha
restart: always
ports:
- '18090:8090'
logging:
driver: json-file
deploy:
resources:
limits:
memory: '16M'
volumes:
- ./conf.d:/etc/nginx/conf.d
networks:
- apollo
depends_on:
- adminservice-prod-1
- adminservice-prod-2
adminservice-prod-1:
image: apolloconfig/apollo-adminservice:2.0.0
container_name: adminservice-prod-1
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
logging:
driver: json-file
options:
max-size: '32k'
adminservice-prod-2:
image: apolloconfig/apollo-adminservice:2.0.0
container_name: adminservice-prod-2
restart: always
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloConfigDB_prod?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
networks:
- apollo
healthcheck:
test: ["CMD-SHELL","wget --no-cache --spider 'http://localhost:8080/health' || exit 1"]
timeout: 2s
interval: 10s
retries: 5
start_period: 15s
deploy:
resources:
limits:
memory: "384M"
logging:
driver: json-file
options:
max-size: '32k'
networks:
apollo:
name: apollo
  • adminservice.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream adminservice{
server adminservice-prod-1:8080;
server adminservice-prod-2:8080;
}
server {
listen 8090;
listen [::]:8090;
server_name adminservice.lhstack.com;
root /usr/share/nginx/html;
client_max_body_size 50m;
location / {
proxy_pass http://adminservice;
}
}
  1. 启动容器
1
docker-compose up -d
  1. 验证部署是否成功

查看adminservice状态

如果adminservice部署了多个实例,则”Status”列会显示多个实例

  1. 部署完后目录结构

五、Portal

  1. 机器规划

mysql为基础存储库,可复用其他现存mysql数据库。

服务器名称 IP Address Port 说明
Portal 128.0.255.96 8090 UI界面服务
  1. 目录规划
1
portal #docker-compose
  1. 编写docker-compose.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.5'
services:
portal:
image: apolloconfig/apollo-portal
container_name: portal
restart: always
ports:
- '8070:8070'
environment:
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "Apollo"
SPRING_DATASOURCE_URL: "jdbc:mysql://128.0.255.96:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
#APOLLO_PORTAL_ENVS: "dev,prod"
#DEV_META: "http://configservice-dev-ha:8080 -e PRO_META=http://configservice-prod-ha:8080"
networks:
- apollo
deploy:
resources:
limits:
memory: "384M"
logging:
driver: json-file
options:
max-size: '32k'
privileged: true
networks:
apollo:
name: apollo

在数据库ApolloPortalDB的ServerConfig表中修改以下字段内容如下

apollo.portal.envs
添加开发和测试环境
dev,prod

apollo.portal.meta.servers
补充各环境的meta地址

{“dev”:”http://configservice-dev-ha:8080","prod":"http://configservice-prod-ha:8080"}

  1. 启动容器
1
docker-compose up -d
  1. 验证部署是否成功

访问apollo网站

  1. 部署完后目录结构

  1. 使用
  • 环境列表、命名空间、集群

环境:同一应用的多个环境
命名空间:后者覆盖前者,私有覆盖共有,共有可多个应用使用
集群:同一环境的不同地区或场景集群

  • 系统信息

系统的部署信息

  • 开放平台授权
    • 第三方应用调用的是portal服务
    • 一个第三方应用appid可以管理多个appid(逐个添加)

创建第三方应用,支持第三方应用操作apollo配置


docker-compose部署Apollo多环境高可用集群
https://johnnysxy.github.io/2023/10/19/docker-compose部署Apollo多环境高可用集群/
作者
Johnny Song
发布于
2023年10月19日
许可协议