Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
下一代 Azure Cosmos DB 模拟器完全基于 Linux,且可用作 Docker 容器。 它支持在各种处理器和操作系统上运行。
先决条件
安装
使用 docker pull 获取 Docker 容器映像。 该容器映像将作为 发布到 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview。
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
正在运行
若要运行容器,请使用 docker run。 之后,使用 docker ps 来验证容器是否正常运行。
docker run --detach --publish 8081:8081 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1bb8cf53f8a mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview "/bin/bash -c /home/…" 5 seconds ago Up 5 seconds 0.0.0.0:1234->1234/tcp, :::1234->1234/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp <container-name>
注意
该模拟器由两个部分组成:
-
数据资源管理器 - 在模拟器中以交互方式浏览数据。 默认情况下,此部分在
1234端口上运行 -
Azure Cosmos DB 模拟器 - Azure Cosmos DB 数据库服务的本地版本。 默认情况下,此部分在
8081端口上运行。
模拟器网关终结点通常在地址 8081 的端口 http://localhost:8081 上。 若要导航到数据资源管理器,请在 Web 浏览器中使用地址 http://localhost:1234。 数据资源管理器可能需要等待几秒钟才能可用。 网关终结点则通常立即可用。
重要
.NET 和 Java SDK 在模拟器中不支持 HTTP 模式。 由于此版本的模拟器默认以 HTTP 开头,因此在启动容器时需要显式启用 HTTPS(见下文)。 对于 Java SDK,还需要安装证书。
docker run --detach --publish 8081:8081 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview --protocol https
Docker 命令
下表总结了可用于配置模拟器的 Docker 命令。 此表详细列出了每个命令的相应参数、环境变量、允许的值、默认设置和说明。
| 要求 | 参数 | Env | 允许的值 | 默认值 | 说明 |
|---|---|---|---|---|---|
| 将设置从容器打印到 stdout |
--help,-h |
空值 | 空值 | 空值 | 显示有关可用配置的信息 |
| 设置 Cosmos 终结点的端口 | --port [INT] |
港口 | INT | 8081 | 容器上的 Cosmos 终结点的端口。 你仍需要发布此端口(例如 -p 8081:8081)。 |
| 指定 Cosmos 终结点使用的协议 | --protocol |
协议 |
https,http,https-insecure |
http |
容器上的 Cosmos 终结点的协议。 |
| 启用数据资源管理器 | --enable-explorer |
ENABLE_EXPLORER |
true,false |
true |
启用在同一容器上运行 Cosmos 数据资源管理器的功能。 |
| 设置数据资源管理器使用的端口 | --explorer-port |
EXPLORER_PORT | INT | 1234 | 容器上的 Cosmos 数据资源管理器的端口。 你仍需要发布此端口(例如 -p 1234:1234)。 |
| 用户应能够指定资源管理器使用的协议,否则默认为 Cosmos 终结点正在使用的协议 | --explorer-protocol |
EXPLORER_PROTOCOL |
https,http,https-insecure |
<the value of --protocol> |
容器上的 Cosmos 数据资源管理器的协议。 默认为 Cosmos 终结点上的协议设置。 |
| 自定义网关公共终结点 | --gateway-endpoint |
GATEWAY_PUBLIC_ENDPOINT(网关公共端点) | 空值 | localhost |
公共网关端点。 默认为 localhost。 |
| 通过文件指定密钥 | --key-file [PATH] |
密钥文件 | 路径 | <default secret> |
使用文件中指定的密钥替代默认密钥。 你需要将此文件装载到容器中(例如,如果 KEY_FILE=/mykey,则需要将如下所示的选项添加到 Docker 运行:--mount type=bind,source=./myKey,target=/myKey) |
| 设置数据路径 | --data-path [PATH] |
DATA_PATH | 路径 | /data |
指定数据的目录。 经常与 docker run --mount 选项一起使用(例如,如果 DATA_PATH=/usr/cosmos/data,则可将如下所示的选项添加到 Docker 运行:--mount type=bind,source=./.local/data,target=/usr/cosmos/data) |
| 指定要用于 https 的证书路径 | --cert-path [PATH] |
证书路径 | 路径 | <default cert> |
指定用于保护流量的证书的路径。 你需要将此文件装载到容器中(例如,如果 CERT_PATH=/mycert.pfx,则需要将如下所示的选项添加到 Docker 运行:--mount type=bind,source=./mycert.pfx,target=/mycert.pfx) |
| 指定要用于 https 的证书机密 | 空值 | CERT_SECRET | 字符串 | <default secret> |
在 CERT_PATH 上指定的证书的机密。 |
| 设置日志级别 | --log-level [LEVEL] |
日志级别 |
quiet,error,warn,info,debug,trace |
info |
模拟器和数据资源管理器发出的日志的详细程度。 |
| 启用 OpenTelemetry OTLP 导出程序 | --enable-otlp |
ENABLE_OTLP_EXPORTER |
true,false |
false |
启用 OpenTelemetry 集成。 |
| 启用控制台导出程序 | --enable-console |
ENABLE_CONSOLE_EXPORTER (启用控制台导出器) |
true,false |
false |
启用遥测数据的控制台输出(可用于调试)。 |
| 启用发送到 Microsoft 的诊断信息 | --enable-telemetry |
启用遥测 |
true,false |
true |
启用向Microsoft发送使用情况数据,帮助我们改进模拟器。 |
功能支持
此模拟器处于积极开发阶段,现为预览版。 因此,并非所有 Azure Cosmos DB 功能都受支持。 而且,某些功能将来也无法获得支持。 下表包括各种功能的状态及其支持级别。
| 功能 | 支持 |
|---|---|
| Batch API | ✅ 受支持 |
| 批量 API | ✅ 受支持 |
| 更改源 | ✅ 受支持 |
| 使用 utf 数据创建和读取文档 | ✅ 受支持 |
| 创建集合 | ✅ 受支持 |
| 创建集合两次冲突 | ✅ 受支持 |
| 使用自定义索引策略创建集合 | ⚠️ 尚未实现 |
| 创建具有 ttl 过期的集合 | ✅ 受支持 |
| 创建数据库 | ✅ 受支持 |
| 创建数据库两次冲突 | ✅ 受支持 |
| 创建文档 | ✅ 受支持 |
| 创建分区集合 | ✅ 受支持 |
| 删除集合 | ✅ 受支持 |
| 删除数据库 | ✅ 受支持 |
| 删除文档 | ✅ 受支持 |
| 获取和更改集合性能 | ⚠️ 尚未实现 |
| 插入大型文档 | ✅ 受支持 |
| 修补文档 | ✅ 受支持 |
| 并行查询已分区集合 | ⚠️ 尚未实现 |
| 使用聚合进行查询 | ✅ 受支持 |
| 使用 AND 筛选条件进行查询 | ✅ 受支持 |
| 使用 AND 筛选条件和投影进行查询 | ✅ 受支持 |
| 使用相等条件进行查询 | ✅ 受支持 |
| 使用 ID 相等条件进行查询 | ✅ 受支持 |
| 使用联接进行查询 | ✅ 受支持 |
| 使用排序条件进行查询 | ✅ 受支持 |
| 使用排序条件针对已分区集合进行查询 | ✅ 受支持 |
| 使用按数字排序的条件进行查询 | ✅ 受支持 |
| 使用按字符串排序的条件进行查询 | ✅ 受支持 |
| 使用分页进行查询 | ✅ 受支持 |
| 使用日期时间范围运算符进行查询 | ✅ 受支持 |
| 使用数字范围运算符进行查询 | ✅ 受支持 |
| 使用字符串范围运算符进行查询 | ✅ 受支持 |
| 使用单个联接进行查询 | ✅ 受支持 |
| 使用字符串、数学和数组运算符进行查询 | ✅ 受支持 |
| 使用子文档进行查询 | ✅ 受支持 |
| 使用两个联接进行查询 | ✅ 受支持 |
| 使用两个联接和筛选条件进行查询 | ✅ 受支持 |
| 读取集合 | ✅ 受支持 |
| 读取集合源 | ⚠️ 尚未实现 |
| 读取数据库 | ✅ 受支持 |
| 读取数据库源 | ⚠️ 尚未实现 |
| 读取文档 | ✅ 受支持 |
| 读取文档源 | ✅ 受支持 |
| 替换文档 | ✅ 受支持 |
| 请求单位 | ⚠️ 尚未实现 |
| 存储过程 | ❌ 未规划 |
| 触发器 | ❌ 未规划 |
| UDF | ❌ 未规划 |
| 更新集合 | ⚠️ 尚未实现 |
| 更新文档 | ✅ 受支持 |
限制
除了尚不支持或未规划的功能外,以下列表还包括模拟器的当前限制。
- 适用于 Azure Cosmos DB 的 .NET SDK 不支持在模拟器中进行批量执行。
安装用于 Java SDK 的证书
在 HTTPS 模式下将适用于 Azure Cosmos DB 的 Java SDK 与此版本的模拟器配合使用时,必须将其证书安装到本地 Java 信任存储。
获取证书
在 bash 窗口中,运行以下命令:
# If the emulator was started with /AllowNetworkAccess, replace localhost with the actual IP address of it:
EMULATOR_HOST=localhost
EMULATOR_PORT=8081
EMULATOR_CERT_PATH=/tmp/cosmos_emulator.cert
openssl s_client -connect ${EMULATOR_HOST}:${EMULATOR_PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $EMULATOR_CERT_PATH
安装证书
导航到 cacerts 文件所在的 Java 安装目录(将下面的目录替换为正确的目录):
cd "C:/Program Files/Eclipse Adoptium/jdk-17.0.10.7-hotspot/bin"
导入证书(系统可能会要求输入密码,默认值为“changeit”):
keytool -cacerts -importcert -alias cosmos_emulator -file $EMULATOR_CERT_PATH
如果由于别名已存在而出现错误,请将其删除,然后再次运行上述命令:
keytool -cacerts -delete -alias cosmos_emulator
OpenTelemetry 支持
OpenTelemetry 是一个开源可观测性框架,它提供工具、API 和 SDK 集合,用于检测、生成、收集和导出遥测数据。 OpenTelemetry 协议(OTLP)是 OpenTelemetry 用来在组件之间传输遥测数据的协议。
可以将 OpenTelemetry 与模拟器配合使用来监视和跟踪应用程序。 模拟器支持遥测选项,可以在运行 Docker 容器时通过环境变量或命令行标志进行配置。
模拟器导出以下指标。 可通过支持 OTLP 的任何指标后端获取这些指标,并提供有关数据库性能和运行状况的宝贵见解:
- 请求速率:显示不同作类型的流量模式
- 查询执行时间:测量执行不同查询所花费的时间
- 资源利用率:CPU、内存使用情况和连接池指标
- 错误率:按类型和终结点跟踪错误
GitHub 存储库中提供了包含示例的详细说明。
在持续集成工作流中使用
在 CI/CD 管道中使用 Docker 容器有很多好处,尤其是对于数据库等有状态系统。 这可能在测试套件的成本效益、性能、可靠性和一致性方面。
模拟器可以合并为 CI/CD 管道的一部分。 可以参考此 GitHub 存储库,其中提供了如何在 x64 和 ARM64 体系结构(针对使用 ubuntu 的 Linux 运行程序进行了演示)上为 .NET、Python、Java 和 Go 应用程序将模拟器用作 GitHub Actions CI 工作流的一部分的示例。
下面是 GitHub Actions CI 工作流的示例,演示如何将模拟器配置为 GitHub Actions 服务容器 作为工作流中作业的一部分。 GitHub 负责启动 Docker 容器并在作业完成时销毁它,而无需手动干预(例如使用 docker run 命令)。
name: CI demo app
on:
push:
branches: [main]
paths:
- 'java-app/**'
pull_request:
branches: [main]
paths:
- 'java-app/**'
jobs:
build-and-test:
runs-on: ubuntu-latest
services:
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
ports:
- 8081:8081
env:
PROTOCOL: https
env:
COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}
steps:
- name: Set up Java
uses: actions/setup-java@v3
with:
distribution: 'microsoft'
java-version: '21.0.0'
- name: Export Cosmos DB Emulator Certificate
run: |
sudo apt update && sudo apt install -y openssl
openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert
cat cosmos_emulator.cert
$JAVA_HOME/bin/keytool -cacerts -importcert -alias cosmos_emulator -file cosmos_emulator.cert -storepass changeit -noprompt
- name: Checkout repository
uses: actions/checkout@v4
- name: Run tests
run: cd java-app && mvn test
此作业在 Ubuntu 运行程序上运行,并使用 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview Docker 映像作为服务容器。 它使用环境变量来配置连接字符串、数据库名称和容器名称。 由于在这种情况下,作业直接在 GitHub Actions 运行程序计算机上运行,因此作业中的运行测试步骤可以访问模拟器,并且可以使用localhost:8081端口进行访问(8081是模拟器公开的端口)。
导出 Cosmos DB 模拟器证书步骤特定于 Java 应用程序,因为 Azure Cosmos DB Java SDK 当前不支持HTTP模拟器中的模式。 环境变量PROTOCOL在部分中设置为httpsservices,此步骤将导出模拟器证书并将其导入 Java 密钥存储。 这同样适用于 .NET。
报告问题
如果在使用此版本的模拟器时遇到问题,请在 GitHub 存储库 (https://github.com/Azure/azure-cosmos-db-emulator-docker) 中开启一个问题,并使用标签 cosmosEmulatorVnextPreview 对其进行标记。