保姆级教程|Docker一键部署运行Flink 1.17 集群(单机+集群双方案)

23次阅读
没有评论

博客标签:#Docker #Flink1.17 #大数据流处理 #容器化部署 #实时计算

发布时间:2026-06-18

适配环境Linux服务器、Docker Desktop(Windows/Mac)、Docker Engine 20.10+


一、前言:为什么选择Docker运行Flink1.17?

Apache Flink 1.17是目前企业生产、学习调研最稳定的LTS版本之一,兼容Scala2.12、JDK11,修复了大量流任务Checkpoint、反压、集群资源调度bug,适配Kafka、MySQL、Hive主流连接器。

传统虚拟机安装Flink痛点极多:JDK版本冲突、环境变量配置繁琐、集群节点互通复杂、多版本切换困难、卸载残留配置文件。而Docker容器化部署优势拉满:

  • ✅ 零环境配置,拉取官方镜像开箱即用,规避系统依赖冲突
  • ✅ 支持快速启停、扩容TaskManager节点,适配学习/测试/小规模生产
  • ✅ 内置Web管理控制台,可视化管理任务、查看集群资源
  • ✅ 支持挂载本地目录持久化任务、Checkpoint、Savepoint数据
  • ✅ 区分单机快速体验docker-compose分布式集群两种部署模式,按需选择

💡 版本选型说明:本文统一使用官方镜像 apache/flink:1.17.2-scala_2.12-java11,生产首选Java11+Scala2.12组合,兼容性最优。

二、前置环境准备

2.1 Docker基础环境校验

本机提前安装Docker&Docker Compose,执行命令校验版本,版本过低建议升级:

# 查看Docker版本,要求≥20.10
docker -v
# 查看Compose版本,v2内置docker compose命令
docker compose version

2.2 镜像拉取(国内加速)

直接拉取Flink1.17官方镜像,配置Docker镜像加速器可大幅提速:

# 拉取flink1.17.2 稳定镜像
docker pull apache/flink:1.17.2-scala_2.12-java11

镜像内置:JDK11、Flink核心包、Flink-CLI、SQL-Client、基础连接器,无需额外下载依赖包。

三、方案一:单命令快速启动Flink1.17集群(新手体验首选)

适合本地学习、代码调试、快速验证Flink任务,一键启动1个JobManager+1个TaskManager最小集群,无需编写配置文件。

3.1 启动JobManager(集群管理节点)

# 启动JobManager,映射8081Web端口,设置时区为上海
docker run -d \
--name flink-jm \
-p 8081:8081 \
-e TZ=Asia/Shanghai \
-e JOB_MANAGER_RPC_ADDRESS=flink-jm \
--restart unless-stopped \
apache/flink:1.17.2-scala_2.12-java11 jobmanager

3.2 启动TaskManager(计算执行节点)

通过容器名关联JobManager,实现节点互通,可重复执行命令扩容多台TaskManager:

# 启动单节点TaskManager
docker run -d \
--name flink-tm1 \
-e TZ=Asia/Shanghai \
-e JOB_MANAGER_RPC_ADDRESS=flink-jm \
--link flink-jm \
--restart unless-stopped \
apache/flink:1.17.2-scala_2.12-java11 taskmanager

3.3 集群状态校验

  1. 查看容器运行状态:docker ps | grep flink
  2. 浏览器访问控制台:http://本机IP:8081

控制台首页可查看:集群Slot数量、节点状态、运行任务、全局配置,默认单TM拥有4个Task Slot。

四、方案二:Docker Compose编排高可用Flink1.17集群(推荐测试/生产)

单命令启停完整集群,统一配置内存、Slot、挂载目录、网络,支持一键扩容TM、持久化任务数据,适配长期使用。

4.1 目录结构规划

flink1.17-docker/
├── docker-compose.yml  # 集群编排配置
├── flink-conf.yaml     # 自定义Flink全局配置
├── checkpoint/         # 本地挂载Checkpoint目录
└── savepoint/          # 本地挂载Savepoint目录

4.2 编写docker-compose.yml

核心配置:时区统一、内存限制、端口映射、数据挂载、自定义配置加载,直接复制即可使用:

version: '3.8'
services:
  jobmanager:
    image: apache/flink:1.17.2-scala_2.12-java11
    container_name: flink-jm
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      TZ: Asia/Shanghai
      JOB_MANAGER_RPC_ADDRESS: jobmanager
    volumes:
      # 挂载自定义配置、持久化快照数据
      - ./flink-conf.yaml:/opt/flink/conf/flink-conf.yaml
      - ./checkpoint:/opt/flink/checkpoint
      - ./savepoint:/opt/flink/savepoint
    networks:
      flink-net:

  taskmanager:
    image: apache/flink:1.17.2-scala_2.12-java11
    container_name: flink-tm
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      JOB_MANAGER_RPC_ADDRESS: jobmanager
    volumes:
      - ./checkpoint:/opt/flink/checkpoint
      - ./savepoint:/opt/flink/savepoint
    deploy:
      replicas: 2 # 直接修改数字扩容TM节点,此处默认2个计算节点
    networks:
      flink-net:

networks:
  flink-net:
    driver: bridge

4.3 自定义flink-conf.yaml优化配置

修改集群并行度、内存、快照默认路径,适配容器资源限制,避免OOM:

# JobManager 内存配置
jobmanager.memory.process.size: 1600m
# TaskManager 单节点内存
taskmanager.memory.process.size: 2048m
# 单TM Slot数量,根据CPU核心修改
taskmanager.numberOfTaskSlots: 4
# 全局默认并行度
parallelism.default: 2
# 本地快照持久化路径(容器内路径,已挂载宿主机)
state.checkpoints.dir: file:///opt/flink/checkpoint
state.savepoints.dir: file:///opt/flink/savepoint
# 开启JMX监控,方便外部监控对接
jmx.rpc.ports: 9999

4.4 集群启停命令

# 后台启动集群
docker compose up -d
# 查看集群日志
docker compose logs -f
# 扩容TaskManager:修改replicas数值后重载
docker compose up -d --scale taskmanager=3
# 停止集群(保留数据)
docker compose down
# 销毁集群+清空容器(宿主机挂载数据不删除)
docker compose down -v

五、实操:提交Flink官方测试任务

进入JobManager容器,执行内置WordCount示例,验证集群流转能力:

# 进入jm容器终端
docker exec -it flink-jm /bin/bash
# 提交内置wordcount流任务
flink run /opt/flink/examples/streaming/WordCount.jar

回到8081控制台,即可看到任务运行、数据流、Slot占用情况,任务运行正常即部署完成。

六、Flink SQL-Client交互式使用

容器内一键开启SQL客户端,直接编写实时SQL,适配SQL开发场景:

# 进入容器启动sql客户端
docker exec -it flink-jm sql-client.sh

七、常见问题踩坑汇总(高频报错解决)

坑1:Web页面TaskManager无法注册,节点失联

原因:容器网络不通、JOB_MANAGER_RPC_ADDRESS配置不一致;解决方案:统一RPC地址、使用自定义bridge网络,禁止随意修改容器名。

坑2:任务运行报磁盘满、Checkpoint写入失败

原因:未挂载宿主机目录,容器磁盘临时存储;解决方案:务必挂载checkpoint、savepoint目录,数据持久化至宿主机。

坑3:容器时区不对,任务时间偏移8小时

解决方案:所有容器必须添加环境变量 TZ=Asia/Shanghai,同步宿主机时区。

坑4:Java8镜像启动失败

Flink1.17官方已弱化Java8支持,优先使用本文Java11镜像,兼容性最优。

八、集群卸载清理命令

# 方案一单命令部署清理
docker stop flink-jm flink-tm1
docker rm flink-jm flink-tm1

# 方案二compose集群清理
docker compose down -v
# 按需删除镜像
docker rmi apache/flink:1.17.2-scala_2.12-java11

九、总结

1. 学习调试:优先使用单命令快速部署,30秒拉起集群,极简上手;

2. 测试环境:优先使用Docker Compose编排部署,可扩容、可配置、数据持久化;

3. Flink1.17容器化优势:版本隔离、环境无污染、运维极简,完全适配大数据开发本地环境、小型测试环境搭建;

4. 拓展方向:后续可对接Docker网络内Kafka、MySQL容器,搭建完整实时计算链路,后续博文更新Flink1.17容器对接Kafka实战。


💬 互动留言:大家平时使用Flink哪个版本?容器化部署遇到过哪些疑难问题?评论区交流答疑~

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码