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 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_PASSWORD | MySQL root 密码 | q1w2e3r4 |
MYSQL_DATABASE | 自动创建的数据库 | streampark |
JAVA_OPTS | StreamPark 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 与监听端口。
十二、参考链接
- Apache StreamPark 官网:https://streampark.apache.org/
- 下载页:https://downloads.apache.org/streampark/
- 官方文档:https://streampark.apache.org/docs/
- GitHub:https://github.com/apache/streampark
- MySQL 官方镜像:https://hub.docker.com/_/mysql
- Docker Compose 文档:https://docs.docker.com/compose/