采用Docker自建镜像部署Datax-web

Docker部署Datax-web

网上有采用Docker部署Datax-web的很多教程,采用的是linshellfeng/datax_web:3.0.1的镜像,部署简单快捷,但是在使用中发现创建任务以及执行都有问题,没有深究原因。而在宿主机器上直接部署Datax-web又出现无法访问的问题(具体原因是我的java版本太高了,跟datax-web不兼容)。于是决定采用基于下载的编译后的datax-web.tar.gz做出docker镜像,然后使用Docker compose部署。

先说下我这边背景情况:已经采用docker compose方式部署好了mysql,并且创建了datax_web数据库,并将datax-web项目对应的sql加载运行,初始化好datax_web数据库。已经将datax部署在了宿主服务器上,目录如下:/opt/datax。运行了命令,确认了datax已经成功部署。命令:python /opt/datax/bin/datax.py /opt/datax/job/job.json 。我的python版本是 3.9.13。

先从网上下载datax-web-2.1.2.tar.gz安装包,将其拷贝到部署Docker的目标服务器目录下。这边假设放在目录/home/docker/datax-web目录下,并在目录下创建Dockerfile文件,并配置。

Dockerfile配置如下:


FROM openjdk:8-jdk-alpine

#安装必要工具:bash、tar,以及 GNU grep(支持 -P)

RUN apk add --no-cache bash tar grep python3 py3-pip \

 && ln -sf python3 /usr/bin/python \

 && ln -sf pip3 /usr/bin/pip

#创建应用目录

RUN mkdir -p /opt/datax-web

#复制本地DataX-Web安装包到镜像

COPY datax-web-2.1.2.tar.gz /tmp/datax-web.tar.gz

WORKDIR /opt/datax-web

#解压并安装DataX-Web

RUN tar -zxvf /tmp/datax-web.tar.gz -C /opt/datax-web --strip-components=1 \

    && rm /tmp/datax-web.tar.gz \

    && chmod +x /opt/datax-web/bin/*.sh \

    && echo "Y" | ./bin/install.sh --force

#暴露端口

EXPOSE 9527 9999

#启动并保持容器运行

CMD ["/bin/sh", "-c", "/opt/datax-web/bin/start-all.sh && tail -f /dev/null"]


执行命令,从Dockerfile创建镜像:

docker build -f Dockerfile -t datax-web:latest .

注意最后的点号,不要漏了。

执行完命令,如果没有报错,那么一个datax-web的本地镜像就创建好了,可以通过命令查看到创建的镜像:

docker images | grep datax-web

编辑docker-compose.yml文件,加入下面关于datax-web 的配置信息:

datax-web-self:

    image: datax-web:latest

    container_name: datax-web-self

    ports:

      - "8888:9527"

      #- "19999:9999"

    environment:

      - JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk

      - TZ=Asia/Shanghai

#数据库连接配置 - 根据您的MySQL容器配置调整

      - spring.datasource.url=jdbc:mysql://mysql:3306/datax_web?useUnicode=true&characterEncoding=UTF-8&useSSL=false

      - spring.datasource.username=用户名

      - spring.datasource.password=密码

    volumes:

#挂载宿主机上的DataX目录

      - /opt/datax:/opt/datax

#挂载日志和配置文件

      - ./datax-docker/datax-web/logs:/opt/datax-web/logs

      - ./datax-docker/datax-web/conf:/opt/datax-web/conf

    networks:

      - datax-network

    depends_on:

      - mysql

#我的mysql配置,主要是新增了networks,跟datax-web保持一致。

mysql:

    image: mysql:8.0

    container_name: mysql

    environment:

      - MYSQL_ROOT_PASSWORD:密码

    ports:

      - "3306:3306"

    volumes:

      - /data/mysql:/var/lib/mysql

    restart: unless-stopped

    networks:

      - datax-network

#对应网络配置

networks:

  datax-network:

    driver: bridge


配置好后,先把mysql关闭:

Docker compose down mysql

然后启动datax-web(因为设置了depends_on:- mysql,会自动先启动mysql):

docker compose up datax-web-self

执行命令查看日志,看是否有错误:

docker logs datax-web-self

如果没有问题,那么就可以访问datax-web了。

网址:http://你的宿主服务器ip:8888/index.html

这边端口是8888,因为上面配置的是 "8888:9527",映射到了datax-web的9527端口。

至此,通过自建datax-web镜像,并通过docker compose部署的datax-web就成功搭建完成了!

下面大概描述下同步数据过程,着重说下Mongodb驱动过时的问题导致Mongodb连接失败的解决方法。

在datax-web页面里,我们可以创建数据源(源数据库和目标数据库),新建执行器(也就是对应的datax),见下图。

然后点击任务管理菜单,在展开的子菜单中,点击“DataX任务模板”,先创建一个任务模板,后面创建同步任务会用到:

再点击任务管理菜单下的“任务构建”子菜单,创建同步任务:

构建reader

构建writer

字段映射

构建任务


构建任务步骤,先点击“1.构建”,生成任务json,然后点击“2.选择模板”,选择之前创建的任务模板。最后点击下一步,一个同步任务就创建好了。

点击上面的任务管理,你将会看到你创建的同步任务:

至此,你就可以操作执行你创建的同步任务了。更多细节,需要后面自己仔细研究。

Mongodb连接问题

下面着重讲解下我遇到的Mongodb连接问题。

因为datax-web以及datax用到的mongo-java-driver驱动都是老旧的,而我的Mongodb版本是6.x的,在创建Mongodb数据源时,点击“测试连接”是不通过的。经过研究发现,需要升级Mongodb的驱动到mongo-java-driver-3.12.13.jar就能解决问题。

原本以为需要下载datax-web以及datax项目的源码,修改配置信息,重新编译替换之前的项目或者相关部件。后来发现,只要把原来部署的datax-web和datax里面对应的驱动文件替换掉就能解决问题。

先替换datax-web里的Mongodb驱动。

首先下载mongo-java-driver-3.12.13.jar驱动文件,然后上传到目标服务器。

执行命令,将服务器上的驱动文件拷贝到datax-web容器(这里容器名称为:datax-web-self):

docker cp /你的存放路径/mongo-java-driver-3.12.13.jar datax-web-self:/opt/datax-web/modules/datax-admin/lib

然后将容器中的原驱动改名:

登入容器:docker exec -it datax-web-self /bin/bash

进入容器中目录:cd /opt/datax-web/modules/datax-admin/lib

修改原来驱动名称:mv mongo-java-driver-3.4.2.jar mongo-java-driver-3.4.2.jar.bakup

效果图如下:

然后重启datax-web,后面再用datax-web新建mongodb数据源以及创建Mongodb相关的迁移任务用的就是mongo-java-driver-3.12.13.jar驱动了。

重启datax-web步骤:

容器中,进到目录: cd /opt/datax-web/bin

先执行停止datax-web脚本:./stop-all.sh

再执行开始脚本:./start-all.sh

完成以上操作,再登入datax-web页面,新建Mongodb数据源,就可以通过测试了。

同样的,后面需要把datax的老旧驱动也换掉。我这边的目录是:

/opt/datax/plugin/reader/mongodbreader/libs

writer对应的目录:/opt/datax/plugin/writer/mongodbwriter/libs

完成这些操作后,后面执行同步任务,仍然遇到问题!是生成的Mongodb相关json的连接信息有问题。

构建的json大概是下面这样的:

而我的Mongodb数据源是配置了用户名密码的

也就是说,datax-web并没有把配置的Mongodb数据源的信息正确配置到任务json中去!试了很多方法,都未能解决问题,大概报错如下:

后来查看datax-web相关源码后,做了如下配置修改,才让datax正确执行任务。

配置如下:

{

  "job": {

    "setting": {

      "speed": {

        "channel": 3

      },

      "errorLimit": {

        "record": 0,

        "percentage": 0.02

      }

    },

    "content": [

      {

        "reader": {

          "name": "mongodbreader",

          "parameter": {

            "dbName": "数据库名称",

            "username": "用户名",

            "password": "密码",

            "authDb": "admin",

            "address": ["你的mongDb服务器ip:端口"],

            "collectionName": "迁移到集合名",

            "column": [

              {

                "name": "colum1",

                "type": "String"

              },

              {

                "name": "colum2",

                "type": "String"

              },

              {

                "name": "colum3",

                "type": "String"

              }

            ]

          }

        },

……

说明:设置好"username"、"password"、"authDb"三个值,尤其是authDb,一定要设置。address一定要是数组类型[“ip:port”]。还有speed下面类似"byte": 1048576 这个要去掉,不然执行会报错。(注:datax-web将用户名和密码做了一层加密,可能需要你把用户名和密码转成加密后的字符才能正确执行)。

这样,Mongodb连接报认证错误的问题就解决了!

我将生成的json拷贝到宿主机器datax目录里面的job下(命名:mongoToClickHouse.json),执行下面命令

python /opt/datax/bin/datax.py ./mongoToClickHouse.json

执行结果:

最终问题解决,大功告成!

如有错误或问题,请留言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容