docker 部署 canal 的核心三步是:配置 mysql 的 row 格式 binlog、创建具备复制权限的 canal 用户、运行并配置 canal-server 容器;全程无需手动安装 java 或编译,镜像开箱即用,10 分钟内可完成基础同步验证。

用 Docker 部署 Canal 很直接,核心是三步:配好 MySQL 的 Binlog、拉起 Canal 容器、连通两者。整个过程不需要装 Java 环境或手动编译,镜像开箱即用,10 分钟内就能跑通基础同步。
MySQL 必须开启 ROW 格式 Binlog
Canal 依赖 MySQL 的 binlog 日志,且只支持 ROW 模式——它能精确记录每一行数据的变更,避免语句级或混合模式带来的解析歧义。
- 启动 MySQL 容器时,通过 command 参数内联配置,例如:
--log-bin=/var/lib/mysql/mysql-bin --binlog-format=ROW --server-id=1 - 若已运行,需挂载自定义配置文件(如
/etc/mysql/conf.d/my.cnf),在[mysqld]下添加:
log-bin=mysql-bin
binlog-format=ROW
server-id=1
binlog-row-image=FULL - 进 MySQL 执行验证:
SHOW VARIABLES LIKE 'log_bin'; → 应返回 ON
SHOW VARIABLES LIKE 'binlog_format'; → 应返回 ROW
SHOW VARIABLES LIKE 'binlog_row_image'; → 应返回 FULL
创建 Canal 专用数据库用户
Canal 以从库身份连接 MySQL,需要具备复制权限,不能只给普通读写权限。
- 进入 MySQL 容器执行:
CREATE USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal'; - 授权关键三项:
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES; -
注意:host 用
'%'是为方便容器间通信;生产环境建议限定为 Canal 容器 IP 或子网。
运行 Canal 容器并配置实例
官方镜像 canal/canal-server 默认启动一个示例 instance,你只需告诉它怎么连 MySQL。
- 拉取并运行(推荐 v1.1.7 或更新 LTS 版):
docker run -d \
--name canal-server \
-p 11111:11111 \
--link mysql-canal:mysql \
-e canal_server_host=mysql:3306 \
-e canal_admin_user=canal \
-e canal_admin_password=canal \
canal/canal-server:v1.1.7 - 进容器修改
conf/example/instance.properties:
canal.instance.master.address=mysql:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.mysql.slaveId=10(必须 ≠ MySQL 的 server-id) - 重启容器使配置生效:
docker restart canal-server
验证是否连接成功
别急着写代码,先看日志确认 Canal 已“握手”MySQL。
- 实时查看实例日志:
docker exec -it canal-server tail -f canal-server/logs/example/example.log - 正常会看到类似:
"start successful..." 和
"subscribe filter table: .*\..*"(表示已监听所有库表) - 在 MySQL 中执行一条 INSERT 或 UPDATE,几秒内日志应出现 "parse row event : ..." 行,说明增量变更已被捕获。











