Apache StreamPark 2.1.7 Docker Compose 部署指南

Apache StreamPark 2.1.7 Docker Compose 部署指南:docker compose 编排 MySQL 8 与自建镜像,initdb 自动建库、start_docker 启动、JVM 堆 256-512MB。

Apache StreamParkApache StreamPark2026/10/13

Apache StreamPark 2.1.7 Docker Compose 部署指南

目标:使用 Docker Compose 一条命令编排 Apache StreamPark 2.1.7 管理台与其元数据库 MySQL 8,实现「mysql + streampark」双服务一键拉起。通过自建镜像内置驱动与配置、start_docker 前台启动、initdb 脚本自动建库建表,端口 10000 映射到宿主机,JVM 堆经 JAVA_OPTS 限定 256-512MB。以下命令与回显均为实际执行结果。

一、环境信息

  • Docker:29.8.0(本指南实测环境)
  • Docker Compose:v2(docker compose 子命令,实测版本 v5.5.1)
  • StreamPark 镜像:自建 streampark:2.1.7(基于 ubuntu:22.04 + OpenJDK 11,内置 StreamPark 2.1.7 与 MySQL 驱动)
  • MySQL 镜像:mysql:8(实测镜像内 mysqld 8.4.11)
  • 服务名:streampark、mysql
  • 映射端口:10000(streampark)→ 宿主机 10000;3306(mysql)→ 宿主机 3306
  • 数据卷:mysql-data(/var/lib/mysql)、streampark-data(/data/streampark/workspace)
  • 初始化脚本挂载:./initdb → /docker-entrypoint-initdb.d

二、镜像选型说明

镜像说明
mysql:8官方 MySQL 8 镜像;首次启动执行 /docker-entrypoint-initdb.d/ 下 SQL 完成建库建表
streampark:2.1.7(自建)本指南采用,基于 ubuntu:22.04,把 StreamPark 2.1.7 二进制与 MySQL 驱动打进同一镜像

说明:官方二进制包因 Apache 2.0 许可兼容问题不内置 MySQL Connector/J(首次启动会报 classes "com.mysql.cj.jdbc.Driver" not found),自建镜像时把 mysql-connector-j-8.0.33.jar 一并 COPY 进 /opt/streampark/lib/ 即可规避。

三、前置条件

  • 装有 Docker 与 Docker Compose v2 的服务器,root 权限。
  • 能访问镜像仓库(拉取 ubuntu:22.04、mysql:8)与 Apache 镜像站(下载 StreamPark 2.1.7 二进制包)。
  • 准备好 apache-streampark_2.12-2.1.7-bin.tar.gz(约 197MB,下载见下文 Dockerfile)。

四、部署步骤

4.1 创建目录结构

mkdir -p streampark-compose/conf streampark-compose/initdb
cd streampark-compose

4.2 编写自建镜像的 Dockerfile

cat > Dockerfile <<'EOF'
FROM ubuntu:22.04

ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
    PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends openjdk-11-jdk-headless \
    && rm -rf /var/lib/apt/lists/*

COPY streampark.tar.gz /tmp/
RUN cd /opt \
    && tar -xzf /tmp/streampark.tar.gz \
    && mv apache-streampark_2.12-2.1.7-bin /opt/streampark \
    && rm -f /tmp/streampark.tar.gz

COPY mysql-connector-j-8.0.33.jar /opt/streampark/lib/
COPY conf/config.yaml /opt/streampark/conf/config.yaml

EXPOSE 10000
CMD ["/opt/streampark/bin/streampark.sh", "start_docker"]
EOF

下载两个依赖包到构建目录:

wget -O streampark.tar.gz \
  https://downloads.apache.org/streampark/2.1.7/apache-streampark_2.12-2.1.7-bin.tar.gz
wget -O mysql-connector-j-8.0.33.jar \
  https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar

⚠️ 必须用 start_docker 前台模式:streampark.sh start 是 nohup 后台启动,作为容器 CMD 时脚本返回后 PID 1 退出,容器会进入 Restarting 循环;start_docker 让 JVM 前台运行并追加 -XX:-UseContainerSupport,容器保持存活(实测踩坑后修正)。

4.3 编写 config.yaml(datasource 指向 mysql 服务)

cat > conf/config.yaml <<'EOF'
server:
  port: 10000
  undertow:
    buffer-size: 1024
    direct-buffers: true
    threads:
      io: 16
      worker: 256

datasource:
  dialect: mysql
  username: root
  password: q1w2e3r4
  url: jdbc:mysql://mysql:3306/streampark?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8

streampark:
  workspace:
    local: /data/streampark/workspace
    remote: hdfs:///streampark/
  yarn:
    http-auth: simple
  hadoop-user-name: hdfs
  project:
    max-build: 16

security:
  kerberos:
    login:
      enable: false

ldap:
  enable: false
EOF

💡 与裸机安装的唯一差异:JDBC 主机名用 Compose 网络内的服务名 mysql(Compose 内置 DNS 解析),而非 localhost。

4.4 准备 initdb 初始化脚本

把官方 script/ 下的建库建表与初始数据脚本拷贝为 initdb(MySQL 官方镜像按文件名升序执行):

cp /opt/streampark/script/schema/mysql-schema.sql initdb/01-schema.sql
cp /opt/streampark/script/data/mysql-data.sql   initdb/02-data.sql

💡 也可从解压包直接取:streampark-compose/initdb/ 下文件名为 01-/02- 前缀保证 schema 先于 data 执行;两个脚本自带 use streampark;,无需额外指定库名。

4.5 编写 docker-compose.yml

cat > docker-compose.yml <<'EOF'
version: "3.8"

services:
  mysql:
    image: mysql:8
    container_name: streampark-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: q1w2e3r4
      MYSQL_DATABASE: streampark
      TZ: Asia/Shanghai
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
    ports:
      - "3306:3306"
    volumes:
      - ./initdb:/docker-entrypoint-initdb.d
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-pq1w2e3r4"]
      interval: 10s
      timeout: 5s
      retries: 10

  streampark:
    build: .
    image: streampark:2.1.7
    container_name: streampark-server
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
    ports:
      - "10000:10000"
    environment:
      JAVA_OPTS: "-Xms256m -Xmx512m -Xmn128m"
    volumes:
      - streampark-data:/data/streampark/workspace

volumes:
  mysql-data:
  streampark-data:
EOF

⚠️ 健康检查必须用 TCP(-h 127.0.0.1):本镜像环境内 mysqladmin ping -h localhost 走 socket 会因 socket 落在 /var/lib/mysql/mysql.sock 而连接失败(实测踩坑),改用 127.0.0.1 后正常。

4.6 启动服务

docker compose up -d --build

实测回显(节选):

 Image streampark:2.1.7 Built
 Container streampark-mysql Creating
 Container streampark-mysql Created
 Container streampark-mysql Starting
 Container streampark-mysql Started
 Container streampark-mysql Waiting
 Container streampark-mysql Healthy
 Container streampark-server Starting
 Container streampark-server Started

4.7 验证服务

docker compose ps

实测回显:

NAME                IMAGE              COMMAND                  SERVICE      CREATED          STATUS                   PORTS
streampark-mysql    mysql:8            "docker-entrypoint.s…"   mysql        2 minutes ago    Up 2 minutes (healthy)   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp
streampark-server   streampark:2.1.7   "/opt/streampark/bin…"   streampark   46 seconds ago   Up 45 seconds            0.0.0.0:10000->10000/tcp, [::]:10000->10000/tcp

登录验证(默认账号 admin,初始密码 streampark;正式使用请按《Apache StreamPark 2.1.7 安装指南》的改密方法改为 q1w2e3r4 等强口令):

docker exec streampark-server bash -c \
  'curl -s -X POST http://localhost:10000/passport/signin \
     -d "username=admin&password=streampark&loginType=PASSWORD"'

实测回显(节选):

{"data":{"user":{"userId":"100000","username":"admin","password":"********","userType":"ADMIN","loginType":"PASSWORD","status":"1","createTime":"2026-10-13 00:56:58","lastTeamId":"100000"},"permissions":[],"token":"(登录成功后返回的 JWT,此处省略原文)","expire":"2026-10-13 02:56:58"},"status":"success"}

JVM 堆生效验证(应看到 Xms256m/Xmx512m/Xmn128m):

docker exec streampark-server bash -c 'ps -ef | grep [S]treamParkConsoleBootstrap | grep -oe "Xms256m" -oe "Xmx512m" -oe "Xmn128m"'

实测回显:

Xms256m
Xmx512m
Xmn128m

五、数据持久化说明

  • mysql-data 卷挂在 /var/lib/mysql:元数据库落盘,docker compose down 后重建不会丢数据。
  • streampark-data 卷挂在 /data/streampark/workspace:workspace 工作区(backups/client/dist/jars/savepoints/shims/uploads/workspace 子目录由管理台首次启动自动创建)。
  • ./initdb 目录挂载 /docker-entrypoint-initdb.d:仅首次初始化空数据目录时执行,之后重建容器不会重复执行。

实测持久化验证:docker compose restart streampark-server 后登录接口仍正常返回用户数据,证明元数据在 mysql-data 卷中保留。

六、常用环境变量表

环境变量说明本指南值
MYSQL_ROOT_PASSWORDMySQL root 密码q1w2e3r4
MYSQL_DATABASE自动创建的数据库streampark
JAVA_OPTSStreamPark JVM 参数(优先级高于 jvm_opts.sh)-Xms256m -Xmx512m -Xmn128m
TZ时区Asia/Shanghai
HADOOP_USER_NAME连接 Hadoop 的用户名(YARN 模式)hdfs(经 config.yaml 配置)

💡 streampark.sh 第 283 行逻辑:JAVA_OPTS=${JAVA_OPTS:-"${JVM_ARGS}"},即设置了 JAVA_OPTS 环境变量时优先使用环境变量,Compose 用它注入 256-512MB 堆即可,无需再挂载 jvm_opts.sh。

七、常用配置参数说明(command)

command 字段直接覆盖镜像默认启动命令,对应 bin/streampark.sh 的三种子命令:

command 值说明
["/opt/streampark/bin/streampark.sh", "start_docker"]前台运行(本指南使用,容器保持存活)
["/opt/streampark/bin/streampark.sh", "start"]后台启动,仅适合进入容器手动运维(PID 1 会退出)
["/opt/streampark/bin/streampark.sh", "status"]查看状态(排障用)

在 docker-compose.yml 的 streampark.command 中可覆盖镜像默认 CMD;排障时可临时改为 streampark.sh status 观察。

八、配置文件持久化(conf 挂载)

/opt/streampark/conf/config.yaml 已在构建时 COPY 进镜像。若需随时修改而不重建镜像,追加 conf 挂载:

  streampark:
    # (此处省略 streampark 服务其余配置项,仅示出卷挂载追加写法)
    volumes:
      - ./conf:/opt/streampark/conf
      - streampark-data:/data/streampark/workspace

之后修改 ./conf/config.yaml 后执行 docker compose restart streampark 即可生效。

⚠️ 挂载 conf 时目录内需保留 config.yaml 与 logback-spring.xml 两个文件,否则启动报配置缺失。

九、等价 docker run 运行方式

不写 docker-compose.yml 时,可用等价的两条 docker run(先起 mysql,等其 healthy 再起 streampark):

docker run -d --name streampark-mysql -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=q1w2e3r4 \
  -e MYSQL_DATABASE=streampark \
  -v "$PWD/initdb:/docker-entrypoint-initdb.d" \
  -v mysql-data:/var/lib/mysql \
  mysql:8 \
  --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

docker run -d --name streampark-server -p 10000:10000 \
  --link streampark-mysql \
  -e JAVA_OPTS='-Xms256m -Xmx512m -Xmn128m' \
  -v streampark-data:/data/streampark/workspace \
  streampark:2.1.7

十、常用运维命令

docker compose up -d            # 启动全部服务
docker compose up -d --build    # 修改 Dockerfile 后重新构建并启动
docker compose ps               # 查看服务状态
docker compose logs -f streampark   # 跟踪管理台日志
docker compose restart streampark   # 重启管理台(改 config 后)
docker compose down             # 停止并删除容器(保留数据卷)
docker compose down -v          # 连同数据卷一并删除(谨慎,清库)

十一、常见问题(FAQ)

11.1:streampark 容器进入 Restarting 循环

现象:docker compose ps 显示 streampark-server Restarting (0)。 原因:镜像 CMD 用了 streampark.sh start(nohup 后台启动),脚本 fork 出 JVM 后自身退出,容器 PID 1 结束。 解决:改用 streampark.sh start_docker 前台模式启动(见 4.2 Dockerfile 的 CMD)。

11.2:启动报 The datasource.dialect is MySQL, but the classes "com.mysql.cj.jdbc.Driver" not found

原因:官方包未内置 MySQL Connector/J(Apache 2.0 许可不兼容),构建镜像时未放入驱动。 解决:在 Dockerfile 中 COPY mysql-connector-j-8.0.33.jar /opt/streampark/lib/ 后重新构建。

11.3:depends_on 一直 Waiting / mysql 不健康

原因:健康检查 mysqladmin ping -h localhost 走 socket 失败(socket 实际在 /var/lib/mysql/mysql.sock)。 解决:健康检查改用 TCP:mysqladmin ping -h 127.0.0.1 -pq1w2e3r4(见 4.5)。

11.4:登录返回 {"code":0,"status":"success"} 但没有 data

原因:登录接口需要表单编码并携带 loginType=PASSWORD;用 JSON body 提交时 Spring 绑定不到参数,静默失败。 解决:用 curl -d "username=admin&password=streampark&loginType=PASSWORD" 方式调用;或进入管理台 Web UI 登录。

11.5:改了 config.yaml 不生效

解决:确认 ./conf 已挂载到 /opt/streampark/conf(含 config.yaml 与 logback-spring.xml),执行 docker compose restart streampark 后以 docker compose logs -f streampark 核对 Undertow started on port(s) 10000 与监听端口。

十二、参考链接