docker 搭建canal

一、参考文献

  1. Docker 安装 canal 详细步骤
  2. 乌班图安装java

二、环境

  1. 乌班图操作系统
  2. Docker 29.1.4
  3. Java 11.0.29
  4. rabbitMQ

三、前期准备

  1. 安装Java11

    # 先更新源	
    sudo apt-get update
    
    # 安装java11
    sudo apt-get install openjdk-11-jdk -y
    
  2. Ubuntu 安装 Docker 的方法

  3. docker换源的方法

  4. 拉取canal镜像

    1.  # 拉取canal管理页面镜像
       sudo docker pull canal/canal-admin
      
       # 拉取canal服务镜像
       sudo docker pull canal/canal-server
      
  5. 在rabbitMQ中创建好相关内容,因为本教程是将canal监听到的变化放到rabbitMQ中

    1. 创建Exchange;名称:canal-exchange

      1. 图像
    2. 创建Queue;名称:example_queue

      1. 图像 1
    3. 点击创建好的Queues; 绑定一下交换机:交换机名称:canal-exchange;Routing Key:example

      1. 图像 2

四、安装canal-admin

  1. 在官网 https://github.com/alibaba/canal/releases 的canal.admin-1.1.8-SNAPSHOT.tar.gz文件的解压包中找到canal_manager.sql,并在mysql中执行脚本。

    1. 图像 3
  2. 修改配置文件

    1.  # 新建目录/mydata/canal/admin/conf,并新建application.yml文件
       sudo mkdir -p /mydata/canal/admin/conf
       # 给权限
       sudo chown 777 /mydata/canal
       # 创建并修改配置文件
       sudo vim /mydata/canal/admin/conf/application.yml
      
       // application.yml 文件的内容
       server:
         port: 8089
       spring:
         jackson:
           date-format: yyyy-MM-dd HH:mm:ss
           time-zone: GMT+8
        
       spring.datasource:
         address: mysql:3306   // canal_manager.sql的数据库地址
         database: canal_manager  // canal_manager.sql的数据库
         username: root  // 数据库账号
         password: root  // 数据库密码
         driver-class-name: com.mysql.jdbc.Driver
         url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
         hikari:
           maximum-pool-size: 30
           minimum-idle: 1
        
       canal:
         adminUser: admin
         adminPasswd: 123456
      
  3. 创建canal-admin

    1.  # 创建docker网络
       sudo docker network create canal_net
      
       # 创建canal-admin
       sudo docker run -d --name canal-admin  \
       -v /mydata/canal/admin/conf/application.yml:/home/admin/canal-admin/conf/application.yml \
       -v /mydata/canal/admin/logs/:/home/admin/canal-admin/logs/ \
       --network canal_net -p 8089:8089 canal/canal-admin
      
  4. 打开界面: 主机地址:8089

    1. 图像 4

五、创建canal-server

  1.  # 创建配置文件
     sudo mkdir -p /mydata/canal/conf/example
     sudo mkdir -p /mydata/canal/conf
     sudo mkdir -p /mydata/canal/logs
    
     # 先创建容器,用来拉取配置文件到主机上配置
     docker run --name canal-server -d canal/canal-server
    
     # 拉取配置文件到主机上配置
     docker cp canal-server:/home/admin/canal-server/conf/canal.properties /mydata/canal/conf/canal.properties
     docker cp canal-server:/home/admin/canal-server/conf/example/instance.properties /mydata/canal/conf/example/instance.properties
    
  2. canal.properties配置文件说明

    1.  # 配置文件声明(只涉及到调整到的,其他保持默认即可)
       # register ip to zookeeper # canal-server 服务自身的IP,因为运行 docker 时使用了 dockers network 网络,所以这里直接配置了 canal-server 的服务名
       canal.register.ip = canal-server  
       canal.port = 11111
       canal.metrics.pull.port = 11112
        
       # canal admin config 这里配置 canal-admin 的IP和端口,以便 canal-admin 管理页面能显示和配置canal 服务,注意用户名和密码来自于 canal-admin 服务配置的 aplication.yml 中的adminUser、adminPassword,默认都为 admin(4ACFE3202A5FF5CF467898FC58AAB1D615029441是admin加密字符串)
       canal.admin.manager = canal-admin:8089  
       canal.admin.port = 11110
       canal.admin.user = admin
       # canal-admin的密码,用脚本创建的话默认是123456
       canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9  
       # admin auto register 自动注册
       canal.admin.register.auto = true  
       canal.admin.register.name = taskCanal # canal-server 的服务名
      
       # tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ   (canal服务模式,指监听到变化后发送到哪里)
       canal.serverMode = rabbitMQ
      
       # table meta tsdb info(数据库配置)
       canal.instance.tsdb.enable = true
       canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
       canal.instance.tsdb.url = jdbc:mysql://数据库地址:3306/taskdata?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false
       canal.instance.tsdb.dbUsername = root //数据库账号
       canal.instance.tsdb.dbPassword = 000000 //数据库密码
      
       #canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
       canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml
      
       canal.destinations = example
      
       # mq 配置
       rabbitmq.host = 192.168.1.107
       rabbitmq.virtual.host = /
       rabbitmq.exchange = canal-exchange
       rabbitmq.username = admin
       rabbitmq.password = admin123
       rabbitmq.queue = example_queue
       # 这里不配置的话,好像会用canal.destinations的内容,所以前面交换机的routing Key 填了example
       rabbitmq.routingKey =
       rabbitmq.deliveryMode = direct
      
  3. instance.properties配置文件说明(这个配置文件目前测试是没用的,要再admin管理页面上配置才生效,目前原因还不知道,有待研究)

    1.  # 监听的数据库消息
       canal.instance.master.address=192.168.1.132:33061  
       canal.instance.dbUsername=root
       canal.instance.dbPassword=abc123456
      
       # 监听的库名和表
       # canal.instance.filter.regex=testdb\\.tast
       canal.instance.filter.regex=.*\\..*
      
  4. 创建canal-server

    1.  # 创建容器
       sudo docker run --name canal-server -p 11111:11111 -d -v /mydata/canal/conf/example/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /mydata/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties -v /mydata/canal/logs/:/home/admin/canal-server/logs/  --network canal_net canal/canal-server
      
  5. 创建好后就会有服务

    1. 图像 5
  6. 在界面上创建一个instance配置

    1. 图像 6

    2. 图像 7

    3. 配置内容:

      1.  #################################################
         ## mysql serverId , v1.0.26+ will autoGen
         # canal.instance.mysql.slaveId=0
        
         # enable gtid use true/false
         canal.instance.gtidon=false
        
         # position info
         canal.instance.master.address=192.168.1.132:33061
         canal.instance.master.journal.name=
         canal.instance.master.position=
         canal.instance.master.timestamp=
         canal.instance.master.gtid=
        
         # rds oss binlog
         canal.instance.rds.accesskey=
         canal.instance.rds.secretkey=
         canal.instance.rds.instanceId=
        
         # table meta tsdb info
         canal.instance.tsdb.enable=true
         #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
         #canal.instance.tsdb.dbUsername=canal
         #canal.instance.tsdb.dbPassword=canal
        
         #canal.instance.standby.address =
         #canal.instance.standby.journal.name =
         #canal.instance.standby.position =
         #canal.instance.standby.timestamp =
         #canal.instance.standby.gtid=
        
         # username/password
         canal.instance.dbUsername=root
         canal.instance.dbPassword=abc123456
         canal.instance.connectionCharset = UTF-8
         # enable druid Decrypt database password
         canal.instance.enableDruid=false
         #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
        
         # table regex
         canal.instance.filter.regex=taskdata\\.task_scheduler_command
         # table black regex
         canal.instance.filter.black.regex=mysql\\.slave_.*
         # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
         #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
         # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
         #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
        
         # mq config
         canal.mq.topic=example
         # dynamic topic route by schema or table regex
         #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
         canal.mq.partition=0
         # hash partition config
         #canal.mq.partitionsNum=3
         #canal.mq.partitionHash=test.table:id^name,.*\\..*
         #################################################
        
        
    4. 配置好后修改task_scheduler_command表的内容后,在mq上就可以看到消息了

      1. 图像 8
posted @ 2026-01-18 21:58  BeYourSelf-l  阅读(0)  评论(0)    收藏  举报