Zookeeper&Dubbo&Apollo In Docker

此文意在记录自己利用 docker 站在巨人的肩膀上构建 zookeeper + dubbo-admin + apollo 环境时的一些重要点, 供以后查阅回顾

Architecture

对应的资源仓库 Docker-Zookeeper-DubboOps-Apollo

前提条件

为保证构建效果, 建立使用全新的 Linux 环境做测试, 本文的系统环境是最新的 CentOS 7

Docker

安装 参考文档

使用 sudoroot 权限登录 CentOS

确保 yum 包更新到最新。

1
$ sudo yum update

执行 Docker 安装脚本。

1
2
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

执行这个脚本会添加 docker.repo 源并安装 Docker

启动 Docker 进程。

1
sudo systemctl start docker

验证 docker 是否安装成功并在容器中执行一个测试的镜像。

1
2
$ sudo docker run hello-world
docker ps

到此,DockerCentOS 系统的安装完成。

Docker Compose

安装 参考文档

执行此命令获取最新版本的 Docker Compose

注意此命令中获取的 docker-compose 版本为1.22.0, 执行之前请获取最新的版本号 Compose repository release page on GitHub

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose 命令 赋可执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

测试 docker-compose 是否安装成功

1
2
$ docker-compose --version
docker-compose version 1.22.0, build 1719ceb

Bin

为方便后续终端操作, 制作了一些bash脚本

root 用户 目录下建立 bin 目录, 存放bash脚本

1
2
3
4
5
6
7
8
9
10
mkdir -p /root/bin
mv bashmarks.sh dkclean dkin dkps dkrm fport net /root/bin
ls -ll /root/bin
-rwxr-xr-x. 1 root root 5056 Sep 11 03:18 bashmarks.sh
-rwxr-xr-x. 1 root root 61 Sep 11 03:15 dkclean
-rwxr-xr-x. 1 root root 43 Sep 11 03:15 dkin
-rwxr-xr-x. 1 root root 27 Sep 11 03:15 dkps
-rwxr-xr-x. 1 root root 44 Sep 11 03:15 dkrm
-rwxr-xr-x. 1 root root 141 Sep 11 03:15 fport
-rwxr-xr-x. 1 root root 1269 Sep 11 03:15 net

bashmarks.sh 一个终端书签脚本, 提供快速切换目录的功能, 具体使用请查看其 Github Repo

dkclean 清理 docker 未打标签的一些镜像

dkin $container_name 进入容器内部终端, $container_name 是需要进入的镜像名称

dkps 查看所有的容器

dkrm $container_name 停止容器,并删除此容器

fport $port 查看某个端口是否被占用, 以及列出一些必要信息

net 查看网络的配置情况

修改 .bashrc

1
2
3
4
vi /root/.bashrc
# 添加一下脚本,并保存
alias vi='vim'
source /root/bin/bashmarks.sh

保存并使其生效

1
source /root/.bashrc

Portainer

安装

复制此内容, 并命文件名称为 docker-compose.yml

stack 会绑定主机的 19000(Portainer web) 端口, 此自行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '2'

services:
portainer:
image: portainer/portainer
ports:
- "19000:9000"
command: -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data

volumes:
portainer_data:

在此文件存放的目录下, 执行此命令, 以后台进程的形式启动 Portainer

如果要测试, 可以不加参数 -d, 以前台进程启动 Portainer,

1
docker-compose up -d

访问 SERVER_IP:19000, 查看 Portainer 管理界面

Zookeeper + Dubbo Admin

利用 Docker 构建 Zookeeper 集群 参考文档

利用 Docker 构建 Dubbo-Admin 参考文档

复制此内容, 并命文件名称为 docker-compose.yml

stack 会绑定主机的 2181(Zookeeper),2182(Zookeeper),2183(Zookeeper),18080(Dubbo admin) 端口, 若需要修改, 请确保了解的端口之间的关系并对后续 Dubbo 服务注册非常了解, 确保修改无误
Dubbo Admin 放在此 stack 中, 原因是方便 Dubbo Admin 访问 Zookeeper 集群, 若生产部署, 建议分离部署

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
version: '2'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
container_name: zookeeper_1
#domainname:
ports:
- 2181:2181
volumes:
- /usr/local/docker_app/zookeeper/zoo1/data:/data
- /usr/local/docker_app/zookeeper/zoo1/datalog:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
- zookeeper_net

zoo2:
image: zookeeper
restart: always
hostname: zoo2
container_name: zookeeper_2
ports:
- 2182:2181
volumes:
- /usr/local/docker_app/zookeeper/zoo2/data:/data
- /usr/local/docker_app/zookeeper/zoo2/datalog:/datalog
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
- zookeeper_net

zoo3:
image: zookeeper
restart: always
hostname: zoo3
container_name: zookeeper_3
ports:
- 2183:2181
volumes:
- /usr/local/docker_app/zookeeper/zoo3/data:/data
- /usr/local/docker_app/zookeeper/zoo3/datalog:/datalog
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
- zookeeper_net
admin:
image: chenchuxin/dubbo-admin
ports:
- 18080:8080
links:
- zookeeper_1
- zookeeper_2
- zookeeper_3
networks:
- zookeeper_net
environment:
- dubbo.registry.address=zookeeper://zookeeper_1:2181|zookeeper://zookeeper_2:2181|zookeeper://zookeeper_3:2181
depends_on:
- zoo1
- zoo2
- zoo3
networks:
zookeeper_net:
driver: bridge

在此文件存放的目录下, 执行此命令, 以后台进程的形式启动 Zookeeper 集群 和 Dubbo Admin

如果要测试, 可以不加参数 -d, 以前台进程启动,

1
docker-compose up -d

访问 SERVER_IP:18080, 查看 Dubbo Admin 管理界面

  • 管理员: root 密码: root
  • 游客: guest 密码 guest

Apollo

利用 Docker 构建 Apollo 配置中心 参考文档

准备数据库文件 参考文档

本文利用官方提供的数据库初始化文件, 进行改造, 达到几个目的

  • 官方的文件会删除原有的数据库数据, 修改所有建表语句, 确保只新增, 不删除
  • 官方提供的两个文件, 是两个数据库 PortalConfig, 本文提供的容器文档配置需两个 Config 数据库, 因此在原有的基础上, 复制一份, 并修改原有数据库名称, 最终会生成三个数据库文件 Portal(Apollo Portal管理数据库) Dev Config(Dev环境数据库) Fat Config(Fat环境数据库)

将上述文件制作的几个文件放在一个名为 sql 的文件夹,之后复制此内容, 并命文件名称为 docker-compose.yml, 放在与 sql 文件夹同级的目录

此 stack 会绑定主机 28070 (Apollo Portal), 28080 (FAT Config),28081 (FAT Config), 28090 (Dev Admin), 28091 (FAT Admin), 23306(MYSQL) 以及会在当前文件夹的创建 log 目录(容器运行时的日志), data 目录(数据库运行时的数据)

此文件会开启两个运行环境: DEV,FAT, 大家可根据自己的需要, 对应配置相应的参数

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
version: '2'
services:
apollo:
image: idoop/docker-apollo:latest
container_name: apollo
restart: always
volumes:
- ./logs:/opt
# 启动前,确认对应环境的数据库已经建立,否则apollo无法启动.
# 默认端口:portal:8070; dev:8080,8090; fat:8081,8091; uat:8082,8092; pro:8083,8093
environment:
PORTAL_DB: jdbc:mysql://apollo-db:3306/ApolloPortalDB?characterEncoding=utf8
PORTAL_DB_USER: root
PORTAL_DB_PWD: password
PORTAL_PORT: 28070

DEV_DB: jdbc:mysql://apollo-db:3306/ApolloConfigDBDev?characterEncoding=utf8
DEV_DB_USER: root
DEV_DB_PWD: password
# DEV_IP: 10.1.11.217
DEV_ADMIN_PORT: 28090
DEV_CONFIG_PORT: 28080

FAT_DB: jdbc:mysql://apollo-db:3306/ApolloConfigDBFat?characterEncoding=utf8
FAT_DB_USER: root
FAT_DB_PWD: password
# FAT_IP: 10.1.11.217
FAT_ADMIN_PORT: 28091
FAT_CONFIG_PORT: 28081

#UAT_DB: jdbc:mysql://apollo-db:3306/ApolloConfigDBUat?characterEncoding=utf8
UAT_DB_USER: root
UAT_DB_PWD: password
UAT_IP: localhost

#PRO_DB: jdbc:mysql://apollo-db:3306/ApolloConfigDBPro?characterEncoding=utf8
PRO_DB_USER: root
PRO_DB_PWD: password
PRO_IP: localhost
depends_on:
- apollo-db
links:
- apollo-db
ports:
- "28070:28070"
- "28090:28090"
- "28080:28080"
- "28081:28081"
- "28091:28091"

apollo-db:
image: mysql:5.7
container_name: apollo-db
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: password
depends_on:
- apollo-dbdata
ports:
- "23306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
volumes_from:
- apollo-dbdata

apollo-dbdata:
image: alpine:latest
container_name: apollo-dbdata
volumes:
- ./data:/var/lib/mysq

在此文件存放的目录下, 执行此命令, 以后台进程的形式启动 Apollo

如果要测试, 可以不加参数 -d, 以前台进程启动,

1
docker-compose up -d

待启动后, 利用 Navicat 访问 Apollo 数据库, 修改相关配置

修改后, 重启 Apollo

1
docker-compose down && docker-compose up -d

待启动以后, 访问 SERVER_IP:28070, 查看 Apollo Portal 管理界面

  • 管理员: apollo 密码: admin

至此服务器端, 必备的环境已经搭建完毕.

Pinpoint (可选)

介绍一个 Dubbo 平台推荐的一个APM工具 Pinpoint, 用于后续线上环境性能分析 介绍文档

利用 Docker 构建 Pinpoint, 官方文档提供了很详细的说明介绍, 在此就不在赘述, 只说明几个关键的几个地方

  • 因 stack 会绑定多个主机端口, 例如启用的 zookeeper 会占用 2181 端口, 在不完全了解的情况下, 不建议修改其默认配置, 请在一个全新的服务器环境下进行安装
  • 默认提供的配置, 会启动 pinpoint-quickstartpinpoint-agent, 这两个只是官方提供的例子, 实际使用过程中, 请注释掉这两个容器, 可直接使用我修改后的 docker-compose.yml
  • 容器启动以后, 需要手动上传 Flink Job, 可按照官方文档进行操作
  • 容器主要对外提供的端口有
    • Flink: 8081
    • 采集: 9994,9995,9996
    • WEB UI: 8079

pinpoint-agent 本身只需要配置 pinpoint-colletorIP 即可, 参考官方文档

pinpoint.config 是默认的 pinpoint-agent 配置文件, pinpoint-colletorIP127.0.0.1, 请按照上述配置的 pinpoint 主机 IP, 修改以下文件

1
profiler.collector.ip=$your-pinpoint-pinpoint-host-ip

tomcat-startup-with-pinpoint.sh 是利用 Tomcatstartup.sh 制作的启动脚本(不属于 pinpoint-agent)

AGENT_PATH 是需要配置代理的服务器上 pinpoint-agent 的根目录

AGENT_ID 是针对当前需要配置的 Tomcat 定义的 pinpoint 全局唯一 ID(不建议重复)

APPLICATION_NAME 是针对当前需要配置的 Tomcat 定义的 pinpoint 全局唯一名称(不建议重复)

1
2
3
4
5
6
7
8
AGENT_PATH="/home/root/pinpoint-agent"
VERSION="1.7.3"
AGENT_ID="oss_pd"
APPLICATION_NAME="oss_pd"
JAVA_OPTS="$JAVA_OPTS -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar"
JAVA_OPTS="$JAVA_OPTS -Dpinpoint.agentId=$AGENT_ID"
JAVA_OPTS="$JAVA_OPTS -Dpinpoint.applicationName=$APPLICATION_NAME"
export JAVA_OPTS