1 - Dapr 自托管模式概述

如何在 Windows/Linux/MacOS 机器上运行 Dapr 的概述

概述

Dapr 可以配置为在本地开发机器或生产虚拟机上的自托管模式下运行。每个运行的服务都有一个 Dapr 运行时进程(或边车),配置为使用状态存储、发布订阅、绑定组件和其他构建块。

初始化

Dapr 可以使用 Docker(默认)或 slim-init 模式 进行初始化。它也可以在离线或隔离网络环境中初始化和运行。

默认的 Docker 设置提供开箱即用的功能,包括以下容器和配置:

  • 配置为充当状态管理和发布/订阅的默认组件的 Redis 容器。
  • 用于诊断和链路追踪的 Zipkin 容器。
  • 安装在 $HOME/.dapr/(Mac/Linux)或 %USERPROFILE%\.dapr\(Windows)中的默认 Dapr 配置和组件。

dapr-placement 服务负责管理 Actor 分布方案和键范围设置。此服务不会作为容器启动,仅在使用 Dapr Actor 时才需要。有关 Actor Placement 服务的更多信息,请阅读 Actor 概述

Dapr 在自托管 Docker 模式下的示意图

使用 Dapr 启动应用程序

您可以使用 dapr run CLI 命令 与您的应用程序一起启动一个 Dapr 边车进程。可以在此处找到其他参数和标志。

名称解析

Dapr 使用名称解析组件服务调用构建块中进行服务发现。默认情况下,Dapr 在自托管模式下使用 mDNS。

如果您在虚拟机上运行 Dapr 或 mDNS 不可用,则可以使用 HashiCorp Consul 组件进行名称解析。

2 - 操作指南:在 Docker 中以自托管模式运行 Dapr

如何使用 Docker 在自托管模式下部署和运行 Dapr

本文提供了在 Windows/Linux/macOS 机器或虚拟机上使用 Docker 运行 Dapr 的指导。

前置条件

初始化 Dapr 环境

要初始化 Dapr 控制平面容器并创建默认配置文件,请运行:

dapr init

将应用和边车作为进程运行

dapr run CLI 命令可用于启动 Dapr 边车以及你的应用程序:

dapr run --app-id myapp --app-port 5000 -- dotnet run

此命令将启动 daprd 边车二进制文件并运行 dotnet run,从而启动你的应用程序。

将应用作为进程运行,边车作为 Docker 容器运行

或者,如果你在 Docker 容器中运行 Dapr,并将应用程序作为主机上的进程运行,则需要配置 Docker 使用主机网络,以便 Dapr 和应用程序可以共享一个 localhost 网络接口。

如果你在 Linux 主机上运行 Docker 守护进程,可以运行以下命令来启动 Dapr:

docker run --net="host" --mount type=bind,source="$(pwd)"/components,target=/components daprio/daprd:edge ./daprd -app-id <my-app-id> -app-port <my-app-port>

然后你可以在主机上运行你的应用程序,它们应该能够通过 localhost 网络接口进行连接。

在单个 Docker 容器中运行应用和 Dapr

仅用于开发目的

不建议在同一容器内运行 Dapr 运行时和应用程序。但是,对于本地开发场景,可以这样做。

为此,你需要编写一个 Dockerfile,在其中安装 Dapr 运行时、Dapr CLI 和应用程序代码。 然后你可以使用 Dapr CLI 调用 Dapr 运行时和应用程序代码。

以下是一个实现此目的的 Dockerfile 示例:

FROM python:3.7.1
# 安装 dapr CLI
RUN wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

# 安装 daprd
ARG DAPR_BUILD_DIR
COPY $DAPR_BUILD_DIR /opt/dapr
ENV PATH="/opt/dapr/:${PATH}"
RUN dapr init --slim

# 安装你的应用
WORKDIR /app
COPY python .
RUN pip install requests
ENTRYPOINT ["dapr"]
CMD ["run", "--app-id", "nodeapp", "--app-port", "3000", "node", "app.js"]

请记住,如果 Dapr 需要与其他组件(例如 Redis)通信,这些组件也需要对它可访问。

在 Docker 网络上运行

如果你有多个在 Docker 容器中运行的 Dapr 实例,并希望它们能够彼此通信例如用于服务调用,则需要创建一个共享的 Docker 网络,并确保这些 Dapr 容器连接到该网络。

你可以使用以下命令创建一个简单的 Docker 网络:

docker network create my-dapr-network

运行 Docker 容器时,可以使用以下命令将它们连接到网络:

docker run --net=my-dapr-network ...

每个容器将在该网络上获得一个唯一的 IP,并能够与该网络上的其他容器通信。

使用 Docker-Compose 运行

Docker Compose可用于定义多容器应用程序配置。如果你希望在不使用 Kubernetes 的情况下在本地运行多个带有 Dapr 边车的应用程序,建议使用 Docker Compose 定义(docker-compose.yml)。

Docker Compose 的语法和工具超出了本文的范围,但是建议你参考官方 Docker 文档了解更多详细信息。

要使用 Dapr 和 Docker Compose 运行应用程序,你需要在 docker-compose.yml 中定义边车模式。例如:

version: '3'
services:
  nodeapp:
    build: ./node
    ports:
      - "50001:50001" # Dapr 实例通过 gRPC 通信,因此我们需要公开 gRPC 端口
    depends_on:
      - redis
      - placement
    networks:
      - hello-dapr
  nodeapp-dapr:
    image: "daprio/daprd:edge"
    command: [
      "./daprd",
     "--app-id", "nodeapp",
     "--app-port", "3000",
     "--placement-host-address", "placement:50006", # 可以通过 docker DNS 条目访问 Dapr 的 placement 服务
     "--scheduler-host-address", "scheduler:50007", # 可以通过 docker DNS 条目访问 Dapr 的 scheduler 服务
     "--resources-path", "./components"
     ]
    volumes:
        - "./components/:/components" # 挂载我们的 components 文件夹供运行时使用。挂载位置必须与 --resources-path 参数匹配。
    depends_on:
      - nodeapp
    network_mode: "service:nodeapp" # 将 nodeapp-dapr 服务附加到 nodeapp 网络命名空间

  ... # 部署其他 daprized 服务和组件(例如 Redis)

  placement:
    image: "daprio/placement"
    command: ["./placement", "--port", "50006"]
    ports:
      - "50006:50006"

  scheduler:
    image: "daprio/scheduler"
    command: ["./scheduler", "--port", "50007", "--etcd-data-dir", "/data"]
    ports:
      - "50007:50007"
    user: root
    volumes:
    - "./dapr-etcd-data/:/data"
  
  networks:
    hello-dapr: null

对于在 Linux 主机上运行 Docker 守护进程的用户,如果需要,你也可以使用 network_mode: host 来利用主机网络。

要进一步了解如何使用 Docker Compose 运行 Dapr,请参阅Docker-Compose 示例

上述示例还包括一个调度器定义,该定义使用非持久化数据存储用于测试和开发目的。

在 Kubernetes 上运行

如果你的部署目标是 Kubernetes,请使用 Dapr 的一流集成。请参阅 Dapr on Kubernetes 文档

名称解析

Dapr 在自托管模式下默认使用 mDNS 作为服务调用的名称解析组件。如果你在虚拟机上运行 Dapr 或 mDNS 不可用,则可以使用 HashiCorp Consul 组件进行名称解析。

Docker 镜像

Dapr 为不同的组件提供了许多预构建的 Docker 镜像,你应该根据所需的二进制文件、架构和标签/版本选择相关的镜像。

镜像

Docker Hub 上提供了每个 Dapr 组件的已发布 Docker 镜像。

标签

Linux/amd64

  • latest:最新发布版本,用于开发目的。
  • edge:最新的 edge 构建(master 分支)。
  • major.minor.patch:发布版本。
  • major.minor.patch-rc.iteration:发布候选版本。

Linux/arm/v7

  • latest-arm:最新的 ARM 发布版本,用于开发目的。
  • edge-arm:最新的 ARM edge 构建(master 分支)。
  • major.minor.patch-arm:ARM 发布版本。
  • major.minor.patch-rc.iteration-arm:ARM 发布候选版本。

3 - 操作指南:使用 Podman 在自托管模式下运行 Dapr

如何使用 Podman 在自托管模式下部署和运行 Dapr

本文提供在 Windows/Linux/macOS 机器或 VM 上使用 Podman 运行 Dapr 的指导。

前置条件

初始化 Dapr 环境

要初始化 Dapr 控制平面容器并创建默认配置文件,运行:

dapr init --container-runtime podman

以进程方式同时运行应用和边车

dapr run CLI 命令 可用于启动 Dapr 边车和你的应用:

dapr run --app-id myapp --app-port 5000 -- dotnet run

此命令会同时启动 daprd 边车和你的应用。

以进程方式运行应用并以 Docker 容器方式运行边车

或者,如果你在 Docker 容器中运行 Dapr,并在主机上以进程方式运行应用,则需要配置 Podman 使用主机网络,以便 Dapr 和应用可以共享一个 localhost 网络接口。

如果你在 Linux 主机上运行 Podman,则可以运行以下命令来启动 Dapr:

podman run --network="host" --mount type=bind,source="$(pwd)"/components,target=/components daprio/daprd:edge ./daprd -app-id <my-app-id> -app-port <my-app-port>

然后你可以在主机上运行你的应用,它们应该可以通过 localhost 网络接口进行连接。

卸载 Dapr 环境

要完全卸载 Dapr,运行:

dapr uninstall --container-runtime podman --all

4 - 操作指南:在自托管模式下不使用 Docker 运行 Dapr

如何在本地机器上未安装 Docker 的情况下部署和运行自托管模式的 Dapr

前置条件

不使用容器初始化 Dapr

Dapr CLI 提供了一个使用 slim init 来初始化 Dapr 的选项,而不会默认创建依赖于 Docker 的开发环境。要在安装 Dapr CLI 后使用 slim init 初始化 Dapr,请使用以下命令:

dapr init --slim

会安装两个不同的二进制文件:

  • daprd
  • placement

placement 二进制文件是在 Dapr 自托管安装中启用 Actor 所必需的。

在 slim init 模式下,不会安装默认组件(如 Redis)用于状态管理或发布订阅。这意味着,除了服务调用之外,安装时"开箱即用"没有其他构建块功能可用。相反,你可以设置自己的环境和自定义组件。

如果配置了状态存储,基于 Actor 的服务调用是可行的,如以下章节所述。

执行服务调用

请参阅 Hello Dapr slim 示例,了解如何在 slim init 模式下执行服务调用。

启用状态管理或发布订阅

请参阅有关在不使用 Docker 的自托管模式下配置 Redis 的文档,以启用用于消息传递的本地状态存储或发布订阅代理。

启用 Actor

要启用 Actor 放置:

默认情况下,placement 二进制文件安装在:

  • 对于 Linux/MacOS:/$HOME/.dapr/bin
  • 对于 Windows:%USERPROFILE%\.dapr\bin
$ $HOME/.dapr/bin/placement

INFO[0000] starting Dapr Placement Service -- version 1.0.0-rc.1 -- commit 13ae49d  instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1
INFO[0000] log level set to: info                        instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1
INFO[0000] metrics server started on :9090/              instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.metrics type=log ver=1.0.0-rc.1
INFO[0000] Raft server is starting on 127.0.0.1:8201...  instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement.raft type=log ver=1.0.0-rc.1
INFO[0000] placement service started on port 50005       instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1
INFO[0000] Healthz server is listening on :8080          instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1
INFO[0001] cluster leadership acquired                   instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1
INFO[0001] leader is established.                        instance=Nicoletaz-L10.redmond.corp.microsoft.com scope=dapr.placement type=log ver=1.0.0-rc.1

在 Windows 上运行独立的 placement 时,请指定端口 6050:

%USERPROFILE%/.dapr/bin/placement.exe -port 6050

time="2022-10-17T14:56:55.4055836-05:00" level=info msg="starting Dapr Placement Service -- version 1.9.0 -- commit fdce5f1f1b76012291c888113169aee845f25ef8" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0
time="2022-10-17T14:56:55.4066226-05:00" level=info msg="log level set to: info" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0
time="2022-10-17T14:56:55.4067306-05:00" level=info msg="metrics server started on :9090/" instance=LAPTOP-OMK50S19 scope=dapr.metrics type=log ver=1.9.0
time="2022-10-17T14:56:55.4077529-05:00" level=info msg="Raft server is starting on 127.0.0.1:8201..." instance=LAPTOP-OMK50S19 scope=dapr.placement.raft type=log ver=1.9.0
time="2022-10-17T14:56:55.4077529-05:00" level=info msg="placement service started on port 6050" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0
time="2022-10-17T14:56:55.4082772-05:00" level=info msg="Healthz server is listening on :8080" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0
time="2022-10-17T14:56:56.8232286-05:00" level=info msg="cluster leadership acquired" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0
time="2022-10-17T14:56:56.8232286-05:00" level=info msg="leader is established." instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0

现在,要运行启用了 Actor 的应用程序,你可以遵循为以下内容创建的示例:

更新状态存储配置文件以匹配你的设置的 Redis 主机和密码。

通过使元数据部分类似于示例 Java Redis 组件定义,将其启用为 Actor 状态存储。

  - name: actorStateStore
    value: "true"

清理

完成后,按照在自托管环境中卸载 Dapr删除二进制文件。

后续步骤

5 - 操作指南:在离线或隔离环境中运行 Dapr

如何在隔离环境中以自托管模式部署和运行 Dapr

概述

默认情况下,Dapr 初始化会从网络下载二进制文件并拉取镜像来设置开发环境。但是,Dapr 也支持使用预先下载的产物进行离线或隔离安装,可以在 Docker 或精简环境中使用。每个 Dapr 版本的产物都被构建到可以下载的 Dapr 安装程序包中。通过在 Dapr CLI init 命令中使用此安装程序包,您可以在没有任何网络访问的环境中安装 Dapr。

设置

在隔离初始化之前,需要预先下载包含 CLI、运行时和仪表板打包在一起的 Dapr 安装程序包。这消除了在本地初始化 Dapr 时下载二进制文件和 Docker 镜像的需要。

  1. 下载特定发布版本的 Dapr 安装程序包。例如,daprbundle_linux_amd64.tar.gz、daprbundle_windows_amd64.zip。

  2. 解压它。

  3. 要安装 Dapr CLI,请将 daprbundle/dapr(Windows 为 dapr.exe)二进制文件复制到所需位置:

    • 对于 Linux/MacOS - /usr/local/bin
    • 对于 Windows,创建一个目录并将其添加到您的系统 PATH 中。例如,创建一个名为 c:\dapr 的目录,然后通过编辑系统环境变量将此目录添加到您的路径中。

    注意:如果 Dapr CLI 未移动到所需位置,您可以使用包中的本地 dapr CLI 二进制文件。上述步骤是为了将其移动到常用位置并将其添加到路径中。

初始化 Dapr 环境

Dapr 可以在隔离环境中使用或不使用 Docker 容器进行初始化。

使用 Docker 初始化 Dapr

先决条件:环境中可用 Docker)

移动到包目录并运行以下命令:

dapr init --from-dir .

对于 linux 用户,如果您使用 sudo 运行 Docker 命令,则需要使用 “sudo dapr init

如果您不是从包目录运行上述命令,请提供包目录的完整路径作为输入。例如,假设包目录路径为 $HOME/daprbundle,运行 dapr init --from-dir $HOME/daprbundle 以获得相同的行为。

输出应类似于以下内容:

  Making the jump to hyperspace...
ℹ️  Installing runtime version latest
↘  Extracting binaries and setting up components... Loaded image: daprio/dapr:$version
✅  Extracting binaries and setting up components...
✅  Extracted binaries and completed components set up.
ℹ️  daprd binary has been installed to $HOME/.dapr/bin.
ℹ️  dapr_placement container is running.
ℹ️  Use `docker ps` to check running containers.
✅  Success! Dapr is up and running. To get started, go here: https://aka.ms/dapr-getting-started

注意:要使用 dapr init 模拟在线 Dapr 初始化,您还可以按如下方式运行 Redis 和 Zipkin 容器:

1. docker run --name "dapr_zipkin" --restart always -d -p 9411:9411 openzipkin/zipkin
2. docker run --name "dapr_redis" --restart always -d -p 6379:6379 redislabs/rejson

不使用 Docker 初始化 Dapr

或者,让 CLI 不安装任何默认配置文件或不运行任何 Docker 容器,请在 init 命令中使用 --slim 标志。仅安装 Dapr 二进制文件。

dapr init --slim --from-dir .

输出应类似于以下内容:

⌛  Making the jump to hyperspace...
ℹ️  Installing runtime version latest
↙  Extracting binaries and setting up components... 
✅  Extracting binaries and setting up components...
✅  Extracted binaries and completed components set up.
ℹ️  daprd binary has been installed to $HOME.dapr/bin.
ℹ️  placement binary has been installed to $HOME/.dapr/bin.
✅  Success! Dapr is up and running. To get started, go here: https://aka.ms/dapr-getting-started

6 - 操作指南:持久化 Scheduler 任务

配置 Scheduler 使其数据库持久化,使其在重启后保持弹性

Scheduler 服务负责将任务写入其 Etcd 数据库并调度它们执行。 默认情况下,Scheduler 服务数据库将此数据写入本地卷 dapr_scheduler,意味着此数据在重启后会被持久化

此本地卷的主机文件位置通常位于 /var/lib/docker/volumes/dapr_scheduler/_data~/.local/share/containers/storage/volumes/dapr_scheduler/_data,具体取决于您的容器运行时。 请注意,如果您使用 Docker Desktop,此卷位于 Docker Desktop VM 的文件系统中,可以使用以下命令访问:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

Scheduler 持久化卷可以通过预先存在的自定义卷或由 Dapr 创建的卷来修改。

dapr init --scheduler-volume my-scheduler-volume

7 - 在自托管环境中升级 Dapr 的步骤

按照以下步骤在自托管模式下升级 Dapr 并确保顺利升级
  1. 卸载当前的 Dapr 部署:

    dapr uninstall --all
    
  2. 通过访问此指南下载并安装最新的 CLI。

  3. 初始化 Dapr runtime:

    dapr init
    
  4. 使用以下命令确保您使用的是最新版本的 Dapr (v1.18.0):

    $ dapr --version
    
    CLI version: 1.18
    Runtime version: 1.18
    

8 - 在自托管环境中卸载 Dapr

从本地机器移除 Dapr 的步骤

以下 CLI 命令移除 Dapr 边车二进制文件和 placement 容器:

dapr uninstall

上述命令默认不会移除在 dapr init 期间安装的 Redis 或 Zipkin 容器,以防您将它们用于其他用途。若要移除 Redis、Zipkin、Actor Placement 容器,以及位于 $HOME/.dapr%USERPROFILE%\.dapr\ 的默认 Dapr 目录,请运行:

dapr uninstall --all