docker部署flink需理解集群模式、网络互通、状态后端及作业提交;以standalone session为例,需构建自定义镜像、用docker-compose编排多节点、通过rest api或flink run -t remote提交作业,并挂载检查点与日志目录实现持久化。

使用 Docker 部署 Flink 并非直接运行一个镜像就完事,关键在于理解 Flink 的集群模式(Standalone / Session / Application)、容器网络互通性、状态后端配置以及如何让作业真正“跑起来”。下面以最常用且适合开发测试的 Standalone Session 集群 为例,给出可落地的操作步骤。
准备基础镜像与自定义配置
Flink 官方提供 Docker 镜像(如 flink:1.18.1-scala_2.12),但默认配置不满足生产或稳定调试需求。建议基于官方镜像构建自定义镜像,主要做三件事:
- 覆盖
flink-conf.yaml:设置jobmanager.rpc.address为容器名(如jobmanager),parallelism.default按需调高,启用state.backend: filesystem并指定state.checkpoints.dir到挂载卷 - 添加必要依赖:如 MySQL CDC connector、Elasticsearch sink 等 JAR 包放入
/opt/flink/lib/ - 暴露端口:除默认的 8081(Web UI)外,若用 REST API 提交作业,确保 8081 可被宿主机访问
用 docker-compose 启动多节点集群
单机部署推荐 docker-compose.yml 编排 JobManager 和 TaskManager,避免手动连网和 IP 硬编码:
version: '3.8'
services:
jobmanager:
image: my-flink:1.18.1
ports:
- "8081:8081"
command: jobmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager
<p>taskmanager:
image: my-flink:1.18.1
depends_on:</p>
- jobmanager command: taskmanager environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager
deploy:
replicas: 2
执行
docker-compose up -d后,访问http://localhost:8081即可见两个 TaskManager 注册成功。注意:JOB_MANAGER_RPC_ADDRESS必须设为服务名,Docker 内置 DNS 才能解析。
提交作业的两种可靠方式
不要依赖 Web UI 上传 JAR(易超时、无日志反馈),推荐以下方法:
-
REST API 提交:先用
curl http://localhost:8081/v1/clusters获取 session ID,再 POST JAR 和入口类。支持传参(programArgs)和并行度(parallelism) -
flink run -t remote:在宿主机安装 Flink CLI,执行:
./bin/flink run -t remote -m localhost:8081 -c com.example.StreamJob ./my-job.jar --input kafka://topic
注意:CLI 版本需与集群一致,且 JAR 中必须含所有依赖(mvn clean package -Pbuild-jar)
持久化检查点与日志排查
容器重启后作业状态丢失?根本原因是 Checkpoint 路径未持久化:
- 在
docker-compose.yml中为 JobManager 挂载卷:volumes: - ./checkpoints:/tmp/checkpoints,并在flink-conf.yaml中设state.checkpoints.dir: file:///tmp/checkpoints - TaskManager 日志默认输出到 stdout,可用
docker logs -f flink_taskmanager_1实时查看;若需长期保留,挂载/opt/flink/log到宿主机目录 - Web UI 的 “Job Manager Logs” 和 “Task Manager Logs” 链接实际指向容器内路径,挂载后才能点击下载
不复杂但容易忽略:Flink 容器不是黑盒,它依赖稳定的网络、明确的资源配置(如 taskmanager.memory.process.size)、以及与外部系统(Kafka、HDFS)的连通性验证。部署前先用 docker exec -it flink_jobmanager_1 ping kafka 确认网络可达,再启动作业。










