使用docker(不是docker-compose)去部署dolphinscheduler 3.0.0版本。
本来以为dolphin的镜像应该和其他组件一样的流程(下载 -> 改配置 -> 运行),结果去docker官网下载镜像的时候发现,刚好从3.0.0开始,dolphin的镜像就是分开的了
官网推荐使用docker-compose去部署,但是,我要部署到鲸云上,就必须用docker,而网上直接docker部署的文章少,所以自己部署完后来记录一下。
因为我使用mysql数据库,所以需要在镜像的libs目录中添加一个支持mysql的jar包,我添加的是mysql-connector-java-8.0.16.jar(需要的网上找一下应该就可以找到)
(1) api镜像
FROM apache/dolphinscheduler-api:3.0.0
COPY mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
RUN apt-get update
api组件也是访问ui的组件,如果要访问dolphin的webUI的话,就要安装api
(2)master镜像
FROM apache/dolphinscheduler-master:3.0.0
COPY mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
RUN apt-get update
(3) worker镜像
FROM apache/dolphinscheduler-worker:3.0.0
COPY mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
# 安装python3环境
RUN sudo apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update && \
apt-get install -y --no-install-recommends python3 && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update && \
apt-get install -y --no-install-recommends python3-pip && \
rm -rf /var/lib/apt/lists/*
worker镜像必须要有python镜像,不然跑不了,会报错
(4)alert镜像
FROM apache/dolphinscheduler-alert-server:3.0.0
COPY mysql-connector-java-8.0.16.jar /opt/dolphinscheduler/libs
RUN apt-get update
alert是负责告警的组件,不安装这个告警的功能就用不了
(5)tools
这个组件是初始化数据库的,也是需要放入mysql的jar包,修改mysql配置,但是我没用这个运行起来(这个镜像的bin目录下有一个upgrade-schema.sh的脚本,运行这个就行)
我是用的之前本地dolphin用的mysql数据库,所以不用初始化,之前的数据也都在,迁移到鲸云的时候,也是直接导出之前mysql的数据为一个sql脚本;
(1) api
在api的Dockerfile文件目录下面执行命令
docker build -t api:3.0.0 .
master:3.0.0 表示的是打包出来的镜像的名字,最末尾的 “ . ” 表示的是是当前目录下的Dockerfile文件
(2)master
在master的Dockerfile文件目录下面执行命令
docker build -t master:3.0.0 .
master:3.0.0 表示的是打包出来的镜像的名字,最末尾的 “ . ” 表示的是是当前目录下的Dockerfile文件
(3)worker
docker build -t worker:3.0.0 .
(4)alter
docker build -t alter:3.0.0 .
4个组件下主要修改application.yaml、dolphinscheduler_env.sh两个配置文件即可
application.yaml:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5432/dolphinscheduler
username: root
password: root
registry:
type: zookeeper
zookeeper:
namespace: dolphinscheduler
connect-string: localhost:2181
retry-policy:
base-sleep-time: 60ms
max-sleep: 300ms
max-retries: 5
session-timeout: 30s
connection-timeout: 9s
block-until-connected: 600ms
digest: ~
将上述的数据库地址改为自己的mysql数据库,例如
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler
username: root
password: root
registry:
type: zookeeper
zookeeper:
namespace: dolphinscheduler
connect-string: localhost:2181
retry-policy:
base-sleep-time: 60ms
max-sleep: 300ms
max-retries: 5
session-timeout: 30s
connection-timeout: 9s
block-until-connected: 600ms
#如果你的zk开启了认证,则修改下面的zkName和zkPassword
digest: zookeeperName:zookeeperPass
如果最下面有一个Spring里面也有数据库地址的话,并且你报错连接不到数据库,就把最下面的也改掉就行;
dolphinscheduler_env.sh:
# Database related configuration, set database type, username and password
export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://mysqlUrl:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=root
# Registry center configuration, determines the type and link of the registry center
export REGISTRY_TYPE=${REGISTRY_TYPE:-zookeeper}
export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-zkUrl:2181}
将上面几个配置修改为自己的mysql和zk地址即可,其他的环境变量,看自己需求修改,如果没其他需求就用默认的就行
(1) api
docker run -d --name dolphinscheduler-api \
-v /usr/local/docker/dolphin/api/conf:/opt/dolphinscheduler/conf \
-p 12345:12345 \
-d api:3.0.0
(2) master
docker run -d --name dolphinscheduler-master \
-v /usr/local/docker/dolphin/master/conf:/opt/dolphinscheduler/conf \
-d master:3.0.0
(3) worker
docker run -d --name dolphinscheduler-worker \
-v /usr/local/docker/dolphin/worker/conf:/opt/dolphinscheduler/conf \
-d worker:3.0.0
(4) alter
docker run -d --name dolphinscheduler-alter \
-v /usr/local/docker/dolphin/alter/conf:/opt/dolphinscheduler/conf \
-d alter:3.0.0
5.登录
到这里,docker部署就已经完成了,接下来登录 http://localhost:12345/dolphinscheduler 就可以去使用了,默认用户admin,默认密码dolphinscheduler123
问题1: dolphin的4个组件是怎么关联起来的
这里一开始我以为要配置什么ip地址,因为在本地使用jar包部署的时候,就有一个配置文件中,需要配置master的ip,worker的ip等。
但是,其实docker部署是不需要这个配置的,我们配置的zk就是用来管理和关联这些组件的;每启动一个组件,这个组件就会去zk的指定的namespace下面注册自己的信息,注册内容是“ip:端口”,所以master要找worker的时候,就会去zk里面找worker注册的信息,就可以找到ip和端口去访问了
问题2: 鲸云上部署的时候,必须要设置暴露出来的端口,和检查健康的地址
api:
端口:12345
健康地址:http://localhost:12345/dolphinscheduler/actuator/health
master:
端口:5679
健康地址:http://localhost:12345/dolphinscheduler/actuator/healthhttp://localhost:5679/actuator/healthhttp://localhost:12345/dolphinscheduler/actuator/health
worker:
端口:1235
健康地址:http://localhost:12345/dolphinscheduler/actuator/healthhttp://localhost:1235/actuator/healthhttp://localhost:12345/dolphinscheduler/actuator/health
alert:
端口:50053
健康地址:http://localhost:50053/actuator/health
问题3: 本地docker部署成功后,转移到鲸云上部署时候发现,master和worker访问使用的是容器名字(hostname),但是这个容器是是不知道这些hostname代表的ip是什么的,所以就报错不能识别hostname;去zk查看注册信息就会发现,注册的时候,就是用hostname注册的
解决:
因为鲸云底层其实是k8s,从启动的容器中执行命令env发现有两个env参数:
KUBERNETES_POD_NAME=app-e1d5b6be5f6c4d0a876d26cc-1-7866dc6fd-mw7ht
KUBERNETES_POD_IP=10.172.131.105
这里他明显是拿 KUBERNETES_POD_NAME去注册了,所以我们需要去源码中简单修改一下,使代码用KUBERNETES_POD_IP去zk里面注册
类地址:org.apache.dolphinscheduler.common.utils.NetUtils
然后在使用dolphin已经写好的dockerfile重新打包一个master和worker镜像出来即可;
--如果你是新手,可以按照下面来执行:
1.去下载源码
2.编译:mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
3.修改好源码,具体就是添加上面图片的第一个if语句即可;
4.找到master和worker的dockerfile文件
这里执行的时候 “ADD ./target/master-server $DOLPHINSCHEDULER_HOME”会去target文件下找master-server,然后添加到容器中,但是我执行的时候,一直说找不到这个地址,所以我直接把mastr-server这个目录放到了和我的Dockerfile同一个目录下了,然后把这个地方改成了“ADD ./master-server $DOLPHINSCHEDULER_HOME”;(这里targer下面的master-server、worker-server是在第二步编译的时候生成的,如果你清空了找不到,就再去编译一次)
5. 修改docker镜像的名字
6.运行
你发现本地产生了你的docker镜像后,就大功告成了,然后和一开始的步骤一样给这个镜像添加好mysql的jar包,修改mysql地址,zk地址就可以用了;