Flink官方提供的 Docker 运行 Flink Application Mode 模式,逐句解读含义,并且给予操作实例:
以下是 Flink 官方提供的 Docker 命令,用于在 Application Mode 下运行 Flink Job(standalone-job
作为 JobManager,taskmanager
作为 TaskManager)。
1. JobManager 启动命令解析
docker run \--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \ # 挂载本地文件到容器--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \ # 挂载第二个文件(如依赖包)--rm \ # 容器退出后自动删除--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ # 传递 Flink 配置--name=jobmanager \ # 容器名称--network flink-network \ # 使用 Docker 网络(需提前创建)flink:1.20.1-scala_2.12 standalone-job \ # 使用 Flink 镜像并启动 JobManager--job-classname com.job.ClassName \ # 指定主类[--job-id <job id>] \ # (可选)手动指定 Job ID[--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \ # (可选)从 Savepoint 恢复[job arguments] # (可选)传递给 Job 的参数
2. TaskManager 启动命令解析
docker run \--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \ # 挂载本地文件到容器--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \ # 挂载第二个文件--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ # 传递 Flink 配置flink:1.20.1-scala_2.12 taskmanager # 启动 TaskManager
操作实例(基于举例的需求)
1. 准备环境
-
JAR 路径:
/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar
-
主类:
com.dev.flink_nc_demo1
-
Flink 镜像:
flink:1.20.1-java11
(需替换scala_2.12
版本) -
Docker 网络: 确保
flink-network
已创建(若没有,运行docker network create flink-network
)
2. 启动 JobManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \ # 挂载 JAR--rm \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \ # 直接指定 FLINK_PROPERTIES--name=jobmanager \--network flink-network \flink:1.20.1-java11 standalone-job \ # 使用 Java 11 镜像--job-classname com.dev.flink_nc_demo1 # 指定主类
说明:
-
由于你的 JAR 是单个文件,直接挂载到
/opt/flink/usrlib/
下(Flink 默认加载该目录下的 JAR)。 -
FLINK_PROPERTIES
直接写死,避免依赖 Shell 变量。
3. 启动 TaskManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \ # 挂载相同 JAR--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \ # 必须与 JobManager 一致--network flink-network \ # 使用相同网络flink:1.20.1-java11 taskmanager
说明:
-
TaskManager 需要访问 JobManager,因此
FLINK_PROPERTIES
必须包含jobmanager.rpc.address: jobmanager
(指向 JobManager 容器名)。
关键注意事项
-
Docker 网络
-
JobManager 和 TaskManager 必须使用同一个网络(
flink-network
)。 -
如果未创建,先运行:
docker network create flink-network
-
-
JAR 挂载
-
如果 JAR 有额外依赖(如配置文件、Lib 目录),需额外挂载到
/opt/flink/usrlib/
。
-
-
日志查看
-
查看 JobManager 日志:
docker logs jobmanager
-
查看 TaskManager 日志(需替换容器 ID):
docker logs <taskmanager-container-id>
-
-
调试建议
-
如果 Job 启动失败,可以进入容器检查文件是否挂载成功:
docker exec -it jobmanager bash ls /opt/flink/usrlib/ # 确认 JAR 存在
-
完整示例(一键运行)
# 创建网络(如果尚未创建)
docker network create flink-network# 启动 JobManager
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \--rm \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \--name=jobmanager \--network flink-network \flink:1.20.1-java11 standalone-job \--job-classname com.dev.flink_nc_demo1# 启动 TaskManager(另开终端)
docker run \--mount type=bind,src=/home/xxx/projects/paimon-flink/target/paimon-flink-1.0-SNAPSHOT.jar,target=/opt/flink/usrlib/paimon-flink.jar \--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \--network flink-network \flink:1.20.1-java11 taskmanager
这样, Flink Job 就会在 Docker 集群中以 Application Mode 运行!如果有问题,可以检查日志或调整挂载路径。
备注:
1、启动standalone是启动的job-manager,task-manager的启动需要另开终端。
2、log会打印在挂起的task-manager控制台,或者通过容器查看log
docker logs 28f9c444a3e8
3、由于
A Flink Application cluster is a dedicated cluster which runs a single job. In this case, you deploy the cluster with the job as one step, thus, there is no extra job submission needed.
所以运行该job的是standalone-job
模式(Application Mode)不会出现8081webui,该flink集群仅可以运行这一个job,不再接受提交其他任务。
-
❌ 默认情况下不会暴露 Web UI,因为
standalone-job
是一个 一次性执行的 Job,任务完成后容器会退出(尤其是加了--rm
参数时)。 -
如果想启用 Web UI,需要:
-
使用
jobmanager
角色(而非standalone-job
),这样 Flink 会以常驻服务运行。 -
显式映射
8081
端口(通过-p 8081:8081
)。
-
4、任务完成,standalone-job启动的jobmanager自动退出,taskmanger需要手动ctrl c退出