Docker部署Flink核心是保障作业稳定、可恢复、连通外部系统;需自定义镜像配置flink-conf.yaml、添加connector、暴露端口,用docker-compose编排集群,通过REST API或CLI提交作业,并验证日志、checkpoint和网络连通性。

用 Docker 部署 Apache Flink 实现实时流计算,核心不是“跑起来”,而是让作业稳定、可恢复、能连外部系统。单机 Docker 环境特别适合开发验证、教学演示和轻量级实时任务(比如 Kafka → Flink → MySQL 的简单 ETL),关键在配置对齐、网络通、状态可持久、提交方式可靠。
构建可运行的自定义镜像
官方镜像(如 flink:1.18.1-scala_2.12)能启动,但默认不支持 checkpoint 或连接 Kafka/MySQL。必须基于它构建自己的镜像:
- 覆盖 flink-conf.yaml:设
jobmanager.rpc.address: jobmanager(必须是服务名,不是 localhost 或 IP);启用state.backend: filesystem,并指定state.checkpoints.dir: /checkpoints - 把必需的 connector 放进
/opt/flink/lib/:比如flink-sql-connector-kafka-1.18.1.jar、flink-connector-mysql-cdc-2.4.0.jar - Dockerfile 中显式暴露端口:
EXPOSE 8081 6123,确保宿主机能访问 Web UI 和 RPC
用 docker-compose 编排多节点集群
不用手动 run 多个容器,避免 IP 硬编码和启动顺序问题。一个最小可用的 docker-compose.yml 示例:
- 定义 jobmanager 服务:设
command: jobmanager,环境变量JOB_MANAGER_RPC_ADDRESS=jobmanager - 定义 taskmanager 服务:用
depends_on声明依赖,同样设JOB_MANAGER_RPC_ADDRESS=jobmanager,可通过deploy.replicas: 2启动多个实例 - 建议显式创建网络:
docker network create flink-network,并在 compose 中指定networks: [flink-network],保障 DNS 解析正常
执行 docker-compose up -d 后,打开 https://www.php.cn/link/97a34e8859e946b5313f18f5f5f4c9f6,应看到 JobManager 在线、TaskManager 成功注册。
提交作业别依赖 Web UI
Web 页面上传 JAR 容易超时、无日志、不支持参数传递,生产级提交推荐以下两种方式:
-
REST API 提交:先 GET
https://www.php.cn/link/97a34e8859e946b5313f18f5f5f4c9f6/v1/clusters获取 session ID,再 POST JAR 文件 + 入口类 +programArgs(如--bootstrap.servers=localhost:9092)+parallelism -
Flink CLI 远程提交:在宿主机安装同版本 Flink(如 1.18.1),执行:
./bin/flink run -t remote -m localhost:8081 -c com.example.KafkaToMysqlJob ./job.jar --bootstrap.servers kafka:9092
注意:JAR 必须包含所有依赖(用mvn clean package -Pbuild-jar打包)
验证与调试不可跳过
集群页面显示“Running”不代表作业真在处理数据。务必检查:
-
TaskManager 日志:运行
docker logs <taskmanager-container-name></taskmanager-container-name>,确认含Registered at jobmanager和Starting to fetch checkpoint字样 -
Checkpoint 目录权限:挂载的
/checkpoints卷需有写权限,目录下应生成checkpoint-xxx子目录,否则状态无法保存 -
外部服务连通性:进入容器执行
ping kafka或telnet mysql 3306,验证网络和端口可达(尤其跨 compose 网络时)











