使用 Docker Compose 进行安装

Spring Cloud Data Flow 提供了一个 Docker Compose 文件,可让您快速启动 Spring Cloud Data Flow、Skipper、MariaDB 和 Apache Kafka。其他自定义指南有助于扩展基本配置,展示如何将绑定器切换到 RabbitMQ、使用不同的数据库、启用监控等等。

此外,在开发自定义应用程序时,您需要使运行 Data Flow 和 Skipper 服务器的 Docker 容器能够看到您的本地文件系统。《访问主机文件系统》一章介绍了如何实现这一点。

您应该升级到最新版本的 dockerdocker-compose。本指南已使用 Docker Engine: 20.10.21 和 docker-compose: v2.12.2 进行测试。

为 Docker 守护程序配置至少 8 GB 的内存。在 Windows 或 Mac 上,您可以使用 Docker Desktop 的 首选项/资源/高级 菜单来设置内存量。

下载 Docker Compose 文件

您需要下载 docker-compose.ymldocker-compose-<broker>.ymldocker-compose-<database>.yml,其中 <broker> 是 rabbitmq 或 kafka 之一,<database> 是 postgres、mariadb 或 mysql 之一。

wget -O docker-compose.yml https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose.yml;
wget -O docker-compose-<broker>.yml https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose-<broker>.yml;
wget -O docker-compose-<database>.yml https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose-<database>.yml;
curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose.yml -o docker-compose.yml
curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose-<broker>.yml -o docker-compose-<broker>.yml
curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/docker-compose/docker-compose-<database>.yml -o docker-compose-<database>.yml

Docker Compose 自定义指南提供了其他文件,您可以将这些文件与基本的 docker-compose.yml 组合使用,以扩展或更改其配置。

启动 Docker Compose

在下载 docker-compose.yml 和其他文件的目录中,运行

export DATAFLOW_VERSION=2.11.3
export SKIPPER_VERSION=2.11.3
docker-compose -f docker-compose.yml -f docker-compose-<broker>.yml -f docker-compose-<database>.yml up
set DATAFLOW_VERSION=2.11.3&
set SKIPPER_VERSION=2.11.3&
docker-compose -f docker-compose.yml -f docker-compose-<broker>.yml -f docker-compose-<database>.yml up
$Env:DATAFLOW_VERSION="2.11.3"
$Env:SKIPPER_VERSION="2.11.3"
docker-compose -f docker-compose.yml -f docker-compose-<broker>.yml -f docker-compose-<database>.yml up

默认情况下,Docker Compose 使用本地可用的镜像。在运行 docker-compose up 之前运行 docker-compose pull 以确保下载最新的镜像版本。

当命令提示符上停止发出日志消息时,请在 http://localhost:9393/dashboard 打开 Spring Cloud Data Flow 仪表板,或按照稍后的说明使用 Shell。

您可以使用以下环境变量来配置 docker-compose.yml

变量名称 默认值 描述
DATAFLOW_VERSION 2.11.3 要安装的 Data Flow Server 版本。例如:2.4.0.RELEASE2.11.3 表示最新版本。
SKIPPER_VERSION 2.11.3 要安装的 Skipper Server 版本。例如:2.3.0.RELEASE2.11.3 表示最新的 Skipper 版本。
STREAM_APPS_URI https://dataflow.springframework.org.cn/kafka-maven-latest(或 DooD 的 https://dataflow.springframework.org.cn/kafka-docker-latest 预注册的 Stream 应用程序。请在此处查找可用的 Stream 应用程序启动器链接。
TASK_APPS_URI https://dataflow.springframework.org.cn/task-maven-latest(或 DooD 的https://dataflow.springframework.org.cn/task-docker-latest 预注册的 Task 应用程序。您可以在此处找到可用的 Task 应用程序启动器链接。
HOST_MOUNT_PATH . 定义挂载的主机文件夹路径。有关更多详细信息,请参阅访问主机文件系统
DOCKER_MOUNT_PATH /home/cnb/scdf 定义要挂载主机文件夹的目标(容器内)路径。有关更多详细信息,请参阅访问主机文件系统

docker-compose.yml 配置将以下容器端口暴露给主机

主机端口 容器端口 描述
9393 9393 Data Flow 服务器侦听的端口。您可以使用它在http://localhost:9393/dashboard访问仪表板,或在http://localhost:9393访问 REST API。
7577 7577 Skipper 服务器侦听的端口。您可以使用它在http://localhost:7577/api访问 Skipper REST API。
20000-20105 20000-20105 Skipper 和本地部署器配置为对所有已部署的流应用程序使用此端口范围。这意味着您可以从主机访问应用程序的执行器端点。您可以使用server.port部署属性来覆盖这些端口。

您可以在流应用程序中使用暴露的应用程序端口(20000-20105)将某些端口暴露给主机。例如,http --server.port=20015 | log流定义将允许您使用curl并将 HTTP 消息直接从主机上的20015端口发布到http源。

停止 Spring Cloud Data Flow

  1. Ctrl+C关闭 docker-compose 进程。
  2. 运行以下命令以清理已使用的 Docker 容器
docker-compose down

如果由于旧容器或挂起的容器而发生错误,请清理所有容器

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
FOR /f "tokens=*" %i IN ('docker ps -aq') DO docker rm %i -f

使用 Shell

为了方便起见,作为 Spring Cloud Data Flow Dashboard 的替代方案,您可以使用 Spring Cloud Data Flow Shell。 该 shell 支持命令和应用程序配置属性的 Tab 自动补全。

要下载 Spring Cloud Data Flow Shell 应用程序,请运行以下命令

wget -O spring-cloud-dataflow-shell-2.11.3.jar https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-dataflow-shell/2.11.3/spring-cloud-dataflow-shell-2.11.3.jar
curl https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-dataflow-shell/2.11.3/spring-cloud-dataflow-shell-2.11.3.jar -o spring-cloud-dataflow-shell-2.11.3.jar

启动 shell

java -jar spring-cloud-dataflow-shell-2.11.3.jar

访问主机文件系统

如果您在本地机器上开发自定义应用程序,则需要向 Spring Cloud Data Flow 注册它们。 由于 Data Flow 服务器在 Docker 容器内运行,因此您需要配置此容器以访问本地文件系统来解析应用程序注册引用。 要部署这些自定义应用程序,Skipper 服务器还需要从其自己的 Docker 容器内访问它们。

默认情况下,docker-compose.yml 会将本地主机文件夹(启动 docker-compose 进程的文件夹)挂载到 dataflow-serverskipper 容器内的 /home/cnb/scdf 文件夹。

Data Flow 和 Skipper 容器使用完全相同的挂载点至关重要。 这允许使用相同的引用来解析 Data Flow 中的应用程序注册引用并在 Skipper 中部署。

HOST_MOUNT_PATHDOCKER_MOUNT_PATH 环境变量(请参阅配置表)允许您自定义默认主机和容器路径。

例如,如果 my-app-1.0.0.RELEASE.jar 存储在主机上的 /tmp/myapps/ 文件夹中(Windows 上为 C:\Users\User\MyApps),您可以通过设置 HOST_MOUNT_PATH 使其可供 dataflow-serverskipper 容器访问

export HOST_MOUNT_PATH=/tmp/myapps
set HOST_MOUNT_PATH=C:\Users\User\MyApps
$Env:HOST_MOUNT_PATH="C:\Users\User\MyApps"

然后按照启动 docker-compose 说明启动集群。

有关更多配置详细信息,请参阅compose-file 参考

挂载主机文件夹后,您可以使用 Data Flow ShellDashboard 注册应用程序启动器(来自 /home/cnb/scdf)。 为此,请使用 file:// URI 方案。 以下示例展示了如何执行此操作

app register --type source --name my-app --uri file://home/cnb/scdf/my-app-1.0.0.RELEASE.jar

如果 /home/cnb/scdf 文件夹中提供了同一应用程序的元数据 jar,则可以使用可选的 --metadata-uri 参数。

您还可以通过修改 docker-compose.yml 文件中的 app-import-streamapp-import-task 配置来直接预注册应用程序。 对于每个预注册的应用程序启动器,请在 app-import-stream 块配置中添加一个额外的 wget 语句,如下例所示

app-import-stream:
  image: springcloud/baseimage:1.0.0
  command: >
    /bin/sh -c "
      ....
      wget -qO- 'https://dataflow-server:9393/apps/source/my-app' --post-data='uri=file:/home/cnb/apps/my-app.jar&metadata-uri=file:/home/cnb/apps/my-app-metadata.jar"

有关更多详细信息,请参阅 Data Flow REST API

Maven 本地仓库挂载

您可以在 Data Flow 服务器运行时开发应用程序并将其安装在本地 Maven 仓库中(使用 mvn install),并立即访问新构建的应用程序。

为此,您必须使用名为 /home/cnb/.m2/ 的卷将主机的本地 Maven 仓库挂载到 dataflow-serverskipper 容器。Maven 本地仓库位置在 Linux 和 OSX 上默认为 ~/.m2,在 Windows 上默认为 C:\Users\{your-username}\.m2

我们可以利用 HOST_MOUNT_PATHDOCKER_MOUNT_PATH 变量来配置挂载卷,如下所示

export HOST_MOUNT_PATH=~/.m2
export DOCKER_MOUNT_PATH=/root/.m2/
set HOST_MOUNT_PATH=%userprofile%\.m2
set DOCKER_MOUNT_PATH=/root/.m2/
$Env:HOST_MOUNT_PATH="~\.m2"
$Env:DOCKER_MOUNT_PATH="/root/.m2/"

然后按照启动 docker-compose 说明启动集群。

现在,您可以使用 maven:// URI 模式和 Maven 坐标来解析安装在主机 Maven 仓库中的 jar,如下所示

app register --type processor --name pose-estimation --uri maven://org.springframework.cloud.stream.app:pose-estimation-processor-rabbit:2.0.2.BUILD-SNAPSHOT --metadata-uri maven://org.springframework.cloud.stream.app:pose-estimation-processor-rabbit:jar:metadata:2.0.2.BUILD-SNAPSHOT

这种方法允许您直接使用在主机上构建和安装的应用程序(例如,使用 mvn clean install)与 Spring Cloud Data Flow 服务器一起使用。

监控

基本的 Data Flow docker-compose 配置没有为流和任务应用程序启用监控功能。请遵循使用 Prometheus 和 Grafana 进行监控使用 InfluxDB 和 Grafana 进行监控自定义指南,了解如何为 Spring Cloud Data Flow 启用和配置监控。

要详细了解 Spring Cloud Data Flow 中使用 Prometheus 和 InfluxDB 进行监控的体验,请参阅流监控功能指南。

运行 Java 17 应用程序

目前,Spring Cloud Data Flow 在运行应用程序时默认使用 Java 8。如果您希望运行 Java 17 应用程序,请将 BP_JVM_VERSION 设置为 -jdk17,如下所示

export BP_JVM_VERSION=-jdk17

调试

调试流应用程序 指南展示了如何为 Data Flow 部署的流应用程序启用远程调试。

调试 Data Flow 服务器 指南展示了如何扩展 docker-compose 配置,以便使用 IDE(例如 IntelliJ 或 Eclipse)启用远程 Data Flow 服务器调试。

调试 Skipper 服务器 指南展示了如何扩展 docker-compose 配置,以便使用 IDE(例如 IntelliJ 或 Eclipse)启用远程 Skipper 服务器调试。

Docker 流和任务应用程序

基本的 docker-compose 安装仅支持 uber-jar 流和任务应用程序。由于 Docker 规范不支持容器嵌套,因此 Data Flow 和 Skipper 服务器无法在其自己的 Docker 容器中运行 Docker 应用程序。

docker-compose-dood.yml 扩展使用 Docker-out-of-Docker (DooD) 方法,让 Skipper 和 Data Flow 部署流和任务 Docker 应用程序。

在这种方法中,从 Data Flow 和 Skipper 容器中创建的容器是兄弟容器(由主机中的 Docker 守护程序生成)。服务器容器中没有 Docker 守护程序,因此没有容器嵌套。

docker-compose-dood.yml 通过将 Docker CLI 安装到 Data Flow 和 Skipper 服务器容器并将服务器的 Docker 套接字挂载到主机的套接字来扩展 docker-compose.yml

export COMPOSE_PROJECT_NAME=scdf
docker-compose -f ./docker-compose.yml -f ./docker-compose-dood.yml up
set COMPOSE_PROJECT_NAME=scdf
docker-compose -f .\docker-compose.yml -f .\docker-compose-dood.yml up
  • COMPOSE_PROJECT_NAME 设置 docker-compose 项目名称。它稍后用于命名传递给应用程序容器的网络。
  • 您可以使用 STREAM_APPS_URITASK_APPS_URI 注册基于 Docker 的流和任务应用程序。

如果在数据管道停止之前 docker-compose 退出,则应手动清理容器:docker stop $(docker ps -a -q); docker rm $(docker ps -a -q)

DOCKER_DELETE_CONTAINER_ON_EXIT 环境变量设置为 false 以保留已停止的 docker 容器,以便您可以检查其日志:docker logs <容器 ID>