This is the multi-page printable view of this section. Click here to print.
在自托管模式下运行 Dapr
1 - Dapr 自托管模式概述
概述
Dapr 可以配置为在本地开发机器或生产虚拟机上的自托管模式下运行。每个运行的服务都有一个 Dapr 运行时进程(或边车),配置为使用状态存储、发布订阅、绑定组件和其他构建块。
初始化
Dapr 可以使用 Docker(默认)或 slim-init 模式 进行初始化。它也可以在离线或隔离网络环境中初始化和运行。
注意
您也可以使用 Podman 代替 Docker 作为容器运行时。有关更多详细信息,请参阅使用 Podman 进行 dapr init。这在由于各种网络约束而无法安装 Docker 的场景中很有用。默认的 Docker 设置提供开箱即用的功能,包括以下容器和配置:
- 配置为充当状态管理和发布/订阅的默认组件的 Redis 容器。
- 用于诊断和链路追踪的 Zipkin 容器。
- 安装在
$HOME/.dapr/(Mac/Linux)或%USERPROFILE%\.dapr\(Windows)中的默认 Dapr 配置和组件。
dapr-placement 服务负责管理 Actor 分布方案和键范围设置。此服务不会作为容器启动,仅在使用 Dapr Actor 时才需要。有关 Actor Placement 服务的更多信息,请阅读 Actor 概述。

使用 Dapr 启动应用程序
您可以使用 dapr run CLI 命令 与您的应用程序一起启动一个 Dapr 边车进程。可以在此处找到其他参数和标志。
名称解析
Dapr 使用名称解析组件在服务调用构建块中进行服务发现。默认情况下,Dapr 在自托管模式下使用 mDNS。
如果您在虚拟机上运行 Dapr 或 mDNS 不可用,则可以使用 HashiCorp Consul 组件进行名称解析。
2 - 操作指南:在 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 网络接口。
注意
Docker 的主机网络驱动程序仅支持 Linux 主机。如果你在 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 镜像。
- daprio/dapr(包含所有 Dapr 二进制文件)
- daprio/daprd
- daprio/placement
- daprio/sentry
- daprio/dapr-dev
标签
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
本文提供在 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
前置条件
不使用容器初始化 Dapr
Dapr CLI 提供了一个使用 slim init 来初始化 Dapr 的选项,而不会默认创建依赖于 Docker 的开发环境。要在安装 Dapr CLI 后使用 slim init 初始化 Dapr,请使用以下命令:
dapr init --slim
会安装两个不同的二进制文件:
daprdplacement
placement 二进制文件是在 Dapr 自托管安装中启用 Actor 所必需的。
在 slim init 模式下,不会安装默认组件(如 Redis)用于状态管理或发布订阅。这意味着,除了服务调用之外,安装时"开箱即用"没有其他构建块功能可用。相反,你可以设置自己的环境和自定义组件。
如果配置了状态存储,基于 Actor 的服务调用是可行的,如以下章节所述。
执行服务调用
请参阅 Hello Dapr slim 示例,了解如何在 slim init 模式下执行服务调用。
启用状态管理或发布订阅
请参阅有关在不使用 Docker 的自托管模式下配置 Redis 的文档,以启用用于消息传递的本地状态存储或发布订阅代理。
启用 Actor
要启用 Actor 放置:
- 在本地运行 placement 服务。
- 启用支持 ETags 的事务状态存储以使用 Actor。例如,在自托管模式下配置的 Redis。
默认情况下,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删除二进制文件。
后续步骤
- 使用默认 Docker 或在隔离环境中使用 Podman运行 Dapr
- 在自托管模式下升级 Dapr
5 - 操作指南:在离线或隔离环境中运行 Dapr
概述
默认情况下,Dapr 初始化会从网络下载二进制文件并拉取镜像来设置开发环境。但是,Dapr 也支持使用预先下载的产物进行离线或隔离安装,可以在 Docker 或精简环境中使用。每个 Dapr 版本的产物都被构建到可以下载的 Dapr 安装程序包中。通过在 Dapr CLI init 命令中使用此安装程序包,您可以在没有任何网络访问的环境中安装 Dapr。
设置
在隔离初始化之前,需要预先下载包含 CLI、运行时和仪表板打包在一起的 Dapr 安装程序包。这消除了在本地初始化 Dapr 时下载二进制文件和 Docker 镜像的需要。
下载特定发布版本的 Dapr 安装程序包。例如,daprbundle_linux_amd64.tar.gz、daprbundle_windows_amd64.zip。
解压它。
要安装 Dapr CLI,请将
daprbundle/dapr(Windows 为 dapr.exe)二进制文件复制到所需位置:- 对于 Linux/MacOS -
/usr/local/bin - 对于 Windows,创建一个目录并将其添加到您的系统 PATH 中。例如,创建一个名为
c:\dapr的目录,然后通过编辑系统环境变量将此目录添加到您的路径中。
注意:如果 Dapr CLI 未移动到所需位置,您可以使用包中的本地
daprCLI 二进制文件。上述步骤是为了将其移动到常用位置并将其添加到路径中。- 对于 Linux/MacOS -
初始化 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 服务负责将任务写入其 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 会在您的驱动器上创建一个名为 dapr_scheduler 的本地持久化卷。如果 Dapr 已安装,则需要完全卸载控制平面,以便使用新的持久化卷重新创建 Scheduler 容器。dapr init --scheduler-volume my-scheduler-volume
7 - 在自托管环境中升级 Dapr 的步骤
卸载当前的 Dapr 部署:
注意
此操作将删除默认的$HOME/.dapr目录、二进制文件以及所有容器(dapr_redis、dapr_placement 和 dapr_zipkin)。如果 docker 命令需要 sudo,Linux 用户需要运行sudo。dapr uninstall --all通过访问此指南下载并安装最新的 CLI。
初始化 Dapr runtime:
dapr init使用以下命令确保您使用的是最新版本的 Dapr (v1.18.0):
$ dapr --version CLI version: 1.18 Runtime version: 1.18
8 - 在自托管环境中卸载 Dapr
以下 CLI 命令移除 Dapr 边车二进制文件和 placement 容器:
dapr uninstall
上述命令默认不会移除在 dapr init 期间安装的 Redis 或 Zipkin 容器,以防您将它们用于其他用途。若要移除 Redis、Zipkin、Actor Placement 容器,以及位于 $HOME/.dapr 或 %USERPROFILE%\.dapr\ 的默认 Dapr 目录,请运行:
dapr uninstall --all
注意
对于 Linux/MacOS 用户,如果您使用 sudo 运行 docker 命令或安装路径为/usr/local/bin(默认安装路径),则需要使用 sudo dapr uninstall 来移除 dapr 二进制文件和/或容器。