此文意在记录自己利用 docker 站在巨人的肩膀上构建 zookeeper + dubbo-admin + apollo 环境时的一些重要点, 供以后查阅回顾
对应的资源仓库 Docker-Zookeeper-DubboOps-Apollo
前提条件
为保证构建效果, 建立使用全新的 Linux 环境做测试, 本文的系统环境是最新的 CentOS 7
Docker
安装 参考文档
使用 sudo 或 root 权限登录 CentOS
确保 yum 包更新到最新。
$ sudo yum update
执行 Docker 安装脚本。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
执行这个脚本会添加 docker.repo 源并安装 Docker。
启动 Docker 进程。
sudo systemctl start docker
验证 docker 是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world
docker ps
到此,Docker 在 CentOS 系统的安装完成。
Docker Compose
安装 参考文档
执行此命令获取最新版本的 Docker Compose
注意此命令中获取的 docker-compose 版本为1.22.0, 执行之前请获取最新的版本号 Compose repository release page on GitHub
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 命令 赋可执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试 docker-compose 是否安装成功
$ docker-compose --version
docker-compose version 1.22.0, build 1719ceb
Bin
为方便后续终端操作, 制作了一些bash脚本
在 root 用户 目录下建立 bin 目录, 存放bash脚本
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
vi /root/.bashrc
# 添加一下脚本,并保存
alias vi='vim'
source /root/bin/bashmarks.sh
保存并使其生效
source /root/.bashrc
Portainer
安装
复制此内容, 并命文件名称为 docker-compose.yml
此 stack 会绑定主机的 19000(Portainer web) 端口, 此自行修改
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,
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 集群, 若生产部署, 建议分离部署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, 以前台进程启动,
docker-compose up -d
访问 SERVER_IP:18080, 查看 Dubbo Admin 管理界面
- 管理员: root 密码: root
- 游客: guest 密码 guest
Apollo
利用 Docker 构建 Apollo 配置中心 参考文档
准备数据库文件 参考文档
本文利用官方提供的数据库初始化文件, 进行改造, 达到几个目的
- 官方的文件会删除原有的数据库数据, 修改所有建表语句, 确保只新增, 不删除
-
官方提供的两个文件, 是两个数据库 Portal 和 Config, 本文提供的容器文档配置需两个 Config 数据库, 因此在原有的基础上, 复制一份, 并修改原有数据库名称, 最终会生成三个数据库文件 Portal(Apollo Portal管理数据库) Dev Config(Dev环境数据库) Fat Config(Fat环境数据库)
-
apolloportaldb.sql
-
apolloconfigdbdev.sql
-
apolloconfigdbfat.sql
-
将上述文件制作的几个文件放在一个名为 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, 大家可根据自己的需要, 对应配置相应的参数
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, 以前台进程启动,
docker-compose up -d
待启动后, 利用 Navicat 访问 Apollo 数据库, 修改相关配置
- ApolloPortalDB.ServerConfig
- apollo.portal.envs = dev,fat
- ApolloConfigDBDev.ServerConfig
- eureka.service.url = http://localhost:28080/eureka/
- ApolloConfigDBFat.ServerConfig
- eureka.service.url = http://localhost:28081/eureka/
修改后, 重启 Apollo
docker-compose down && docker-compose up -d
待启动以后, 访问 SERVER_IP:28070, 查看 Apollo Portal 管理界面
- 管理员: apollo 密码: admin
至此服务器端, 必备的环境已经搭建完毕.
Pinpoint (可选)
介绍一个 Dubbo 平台推荐的一个APM工具 Pinpoint, 用于后续线上环境性能分析 介绍文档
利用 Docker 构建 Pinpoint, 官方文档提供了很详细的说明介绍, 在此就不在赘述, 只说明几个关键的几个地方
- 因 stack 会绑定多个主机端口, 例如启用的 zookeeper 会占用 2181 端口, 在不完全了解的情况下, 不建议修改其默认配置, 请在一个全新的服务器环境下进行安装
- 默认提供的配置, 会启动 pinpoint-quickstart 和 pinpoint-agent, 这两个只是官方提供的例子, 实际使用过程中, 请注释掉这两个容器, 可直接使用我修改后的 docker-compose.yml
- 容器启动以后, 需要手动上传 Flink Job, 可按照官方文档进行操作
- 容器主要对外提供的端口有
- Flink: 8081
- 采集: 9994,9995,9996
- WEB UI: 8079
pinpoint-agent 本身只需要配置 pinpoint-colletor 的 IP 即可, 参考官方文档
pinpoint.config 是默认的 pinpoint-agent 配置文件, pinpoint-colletor 的 IP 是 127.0.0.1, 请按照上述配置的 pinpoint 主机 IP, 修改以下文件
profiler.collector.ip=$your-pinpoint-pinpoint-host-ip
tomcat-startup-with-pinpoint.sh 是利用 Tomcat 的 startup.sh 制作的启动脚本(不属于 pinpoint-agent)
AGENT_PATH 是需要配置代理的服务器上 pinpoint-agent 的根目录
AGENT_ID 是针对当前需要配置的 Tomcat 定义的 pinpoint 全局唯一 ID(不建议重复)
APPLICATION_NAME 是针对当前需要配置的 Tomcat 定义的 pinpoint 全局唯一名称(不建议重复)
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