下一代 Azure Cosmos DB 模拟器完全基于 Linux,且可用作 Docker 容器。 它支持在各种处理器和操作系统上运行。
先决条件
安装
使用 docker pull 获取 Docker 容器映像。 容器镜像作为 被发布到 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest。
docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest
正在运行
若要运行容器,请使用 docker run。 之后,使用 docker ps 来验证容器是否正常运行。
docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1bb8cf53f8a mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest "/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。 网关终结点通常立即可用,但数据资源管理器可能需要几秒钟才能启动。
健康探测器
模拟器在端口 8080上公开健康探测端点。 使用此终结点可以确定模拟器何时完全初始化并准备好接受请求。
以下终结点可用:
- http://localhost:8080/alive — 生存度探测。
- http://localhost:8080/ready — 就绪情况探测。
- http://localhost:8080/status — 详细状态。
注意
仍会发出旧日志消息 System is now fully ready to accept requests 以实现向后兼容性,但可能会在将来的版本中删除。 请改用运行状况探测进行就绪情况检查。
HTTPS 模式
.NET 和 Java SDK 在模拟器中不支持 HTTP 模式。 由于此版本的模拟器默认以 HTTP 开头,因此在启动容器时需要显式启用 HTTPS(见下文)。 对于 Java SDK,还需要安装证书。
docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest --protocol https
将 HTTPS 与持久化数据卷配合使用时,模拟器会在启动时自动重新生成 SSL 证书,因此无需管理证书续订。
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)。 |
| 指定数据浏览器使用的协议 | --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 |
启用遥测数据的控制台输出(可用于调试)。 |
| 启用详细模式 | --verbose |
详细 |
true,false |
false |
启用详细模式,将 PostgreSQL 日志(pglog)打印到控制台。 可用于调试。 |
| 设置查询缓冲区大小 | --query-buffer-size |
QUERY_BUFFER_SIZE_KB | INT | 4096 (4 MB), 最大 65536 (64 MB) | 查询结果缓冲区的最大大小(以 KB 为单位)。 如果在大型查询上遇到 HTTP 500 错误,请增加此值。 |
| 在容器启动时启用种子设定数据 | --enable-init-data |
ENABLE_INIT_DATA |
true,false |
false |
在模拟器接受请求之前,按字母顺序运行 init 目录的顶层找到的任何 .csh 脚本。 请参阅 Azure Cosmos DB Shell 集成。 |
| 设置初始化脚本所在的目录 | --init-path [PATH] |
INIT_PATH | 路径 | /init |
模拟器在 ENABLE_INIT_DATA=true 时扫描 .csh 种子脚本所在的目录。 |
| 启用将诊断信息发送到 Microsoft 的功能 | --enable-telemetry |
启用遥测 |
true,false |
true |
启用向Microsoft发送使用情况数据,帮助我们改进模拟器。 |
功能支持
并非所有Azure Cosmos DB功能都受模拟器支持,有些功能未计划用于将来的支持。 下表包括各种功能的状态及其支持级别。
| 功能 | 支持 |
|---|---|
| Batch API | ✅ 受支持 |
| 批量 API | ✅ 受支持 |
| 更改日志 | ✅ 受支持 |
| 使用 utf 数据创建和读取文档 | ✅ 受支持 |
| 创建集合 | ✅ 受支持 |
| 重复创建集合冲突 | ✅ 受支持 |
| 使用自定义索引策略创建集合 | ⚠️ No-op |
| 创建带有 TTL 期限的集合 | ✅ 受支持 |
| 创建数据库 | ✅ 受支持 |
| 创建数据库时的重复冲突 | ✅ 受支持 |
| 创建文档 | ✅ 受支持 |
| 创建分区集合 | ✅ 受支持 |
| 删除集合 | ✅ 受支持 |
| 删除数据库 | ✅ 受支持 |
| 删除文档 | ✅ 受支持 |
| 获取和更改集合性能 | ⚠️ 尚未实现 |
| 插入大型文档 | ✅ 受支持 |
| 补丁文档 | ✅ 受支持 |
| 并行查询已分区集合 | ⚠️ 尚未实现 |
| 使用聚合进行查询 | ✅ 受支持 |
| 使用 AND 筛选器进行查询 | ✅ 受支持 |
| 使用 AND 筛选条件和投影进行查询 | ✅ 受支持 |
| 使用相等条件进行查询 | ✅ 受支持 |
| 使用 ID 相等条件进行查询 | ✅ 受支持 |
| 使用联接进行查询 | ✅ 受支持 |
| 使用排序条件进行查询 | ✅ 受支持 |
| 使用排序条件针对已分区集合进行查询 | ✅ 受支持 |
| 使用按数字排序的条件进行查询 | ✅ 受支持 |
| 使用按字符串排序的条件进行查询 | ✅ 受支持 |
| 使用分页进行查询 | ✅ 受支持 |
| 使用日期时间范围运算符进行查询 | ✅ 受支持 |
| 使用数字范围运算符进行查询 | ✅ 受支持 |
| 使用字符串范围运算符进行查询 | ✅ 受支持 |
| 使用单个联接进行查询 | ✅ 受支持 |
| 使用字符串、数学和数组运算符进行查询 | ✅ 受支持 |
| 使用子文档进行查询 | ✅ 受支持 |
| 使用两个联接进行查询 | ✅ 受支持 |
| 使用两个联接和筛选条件进行查询 | ✅ 受支持 |
| 读取集合 | ✅ 受支持 |
| 读取集合信息流 | ⚠️ 尚未实现 |
| 读取数据库 | ✅ 受支持 |
| 读取数据库数据流 | ⚠️ 尚未实现 |
| 读取文档 | ✅ 受支持 |
| 读取文档流 | ✅ 受支持 |
| 替换文档 | ✅ 受支持 |
| 请求单位 | ⚠️ 尚未实现 |
| 存储过程 | ❌ 未规划 |
| 触发器 | ❌ 未规划 |
| UDF(用户自定义函数) | ❌ 未规划 |
| 更新集合 | ⚠️ No-op |
| 更新文档 | ✅ 受支持 |
| 产品/服务终结点 | ⚠️ No-op |
| 用户端点 | ⚠️ No-op |
| 权限终结点 | ⚠️ No-op |
| 客户端加密密钥 (CEK) | ⚠️ No-op |
注意
标记为 No-op 接受请求的功能并返回有效的 HTTP 状态代码,但不执行基础操作。 你的代码不会中断,但不要依赖这些特性来实现功能。 出于兼容性,接受自定义索引策略和集合更新,但自定义索引不会优化查询。
安装用于 Java SDK 的证书
在使用此版本的模拟器与Java SDK for Azure Cosmos DB结合进行 https 模式下应用时,必须将其证书安装到本地 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
将 Azure Cosmos DB Shell 与模拟器配合使用
Azure Cosmos DB Shell 是一个开源命令行接口(CLI),可用于使用类似于 bash 的命令与Azure Cosmos DB数据库进行交互。 shell 包含在模拟器容器映像中,因此无需单独安装它。
若要针对正在运行的模拟器启动交互式会话,请使用 docker exec:
docker exec -it <container-name> cosmoshell.sh
注意
cosmoshell.sh 封装器会自动检测模拟器端点,并使用预定义的账户密钥进行身份验证。 基础二进制文件位于 /usr/local/bin/cosmosdbshell 容器内。
当容器首次启动时,shell 还可以运行脚本,因此在应用程序连接之前,数据库、容器、种子文档和任何其他状态都已准备就绪。 若要选择加入、设置 ENABLE_INIT_DATA=true 或传递 --enable-init-data=true。 默认值为 false。 启用后,模拟器会按字母顺序处理位于 /init 顶层的所有 .csh 文件。 若要使用其他目录,请将 INIT_PATH(或 --init-path)指向该目录。
使用包含的示例数据
该镜像附带位于 /scripts/init_examples/ 下的示例种子脚本,这些脚本会在构建时复制到 /init。 若要加载它们,请使用以下命令启动容器 ENABLE_INIT_DATA=true:
docker run --name emulator --rm -e ENABLE_INIT_DATA=true -p 8081:8081 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest
然后,可以连接到 shell 并浏览数据:
docker exec emulator cosmoshell.sh -c 'ls; cd SampleDB; ls'
使用您自己的数据进行初始化
可以设定自己的数据种子。 例如,在本地文件夹中创建三个文件(01-create-db.csh和02-load-movies.csh03-verify.csh)。movies
mkdir movies && cd movies
01-create-db.csh:
mkdb MovieDB
mkcon Movies /genre --database=MovieDB
02-load-movies.csh:
mkitem -container Movies --database=MovieDB '{"id":"m1","genre":"scifi","title":"Inception","year":2010}'
mkitem -container Movies --database=MovieDB '{"id":"m2","genre":"scifi","title":"The Matrix","year":1999}'
mkitem -container Movies --database=MovieDB '{"id":"m3","genre":"drama","title":"The Godfather","year":1972}'
03-verify.csh:
query "SELECT VALUE COUNT(1) FROM c" --database=MovieDB --container=Movies
然后运行装载在该目录处 /init的模拟器:
docker run --name emulator --rm -e ENABLE_INIT_DATA=true -v "$(pwd):/init" -p 8081:8081 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest
可以通过连接到 shell 并运行查询来验证数据是否已加载:
docker exec emulator cosmoshell.sh -c 'ls; query "SELECT VALUE COUNT(1) FROM c" --database=MovieDB --container=Movies'
注意
/init 中的种子数据按字母顺序处理。 若要确保排序一致,请为文件添加前缀01-、02-03-前缀,等等。 始终使用 2 位前缀(01-、、 02-...) 99-或 3 位前缀。
文件名只能包含字母、数字、点、下划线和连字符。 例如, 01-create-catalog.csh 并且 02_load_books.csh 有效,但 01 create catalog.csh (空格)和 café.csh (非 ASCII 字符)无效。
跨初始化脚本共享状态
每个 .csh 文件 /init 在同一 shell 会话中运行,因此一个文件中的状态集在下一个文件中仍然有效。 这包括由 cd 设置的当前路径、使用 def 定义的自定义命令,以及 for 循环变量。
可以使用此方法避免在上一示例中的每一行重复 --database=MovieDB 。 将 cd MovieDB 添加到 01-create-db.csh 的末尾:
01-create-db.csh:
mkdb MovieDB
mkcon Movies /genre --database=MovieDB
cd MovieDB
然后,以后的文件可以省略 --database=MovieDB:
02-load-movies.csh:
mkitem -container Movies '{"id":"m1","genre":"scifi","title":"Inception","year":2010}'
mkitem -container Movies '{"id":"m2","genre":"scifi","title":"The Matrix","year":1999}'
mkitem -container Movies '{"id":"m3","genre":"drama","title":"The Godfather","year":1972}'
03-verify.csh:
query "SELECT VALUE COUNT(1) FROM c" --container=Movies
在重启后持续保留数据
默认情况下,每次 docker run --rm 在容器停止时擦除模拟器的数据,因此初始化脚本在下一个启动时从头开始重新运行。 若要保留预置数据(并在后续运行时跳过初始化),请在 /data 处绑定挂载主机文件夹:
mkdir -p ./cosmos-data
docker run --rm -p 8081:8081 -e ENABLE_INIT_DATA=true -v "$(pwd):/init" -v "$(pwd)/cosmos-data:/data" mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest
之后每次使用同一个 -v "$(pwd)/cosmos-data:/data" 标志启动时,仿真器都会检测到现有数据并跳过初始化过程,因此会保留你之前预置的状态。 若要从头重新播种,请删除主机文件夹(rm -rf ./cosmos-data)并重新开始。
通过本地 shell 连接
还可以从本地安装的 Azure Cosmos DB Shell 版本连接到正在运行的模拟器。 将其指向模拟器的端点和密钥:
cosmosdbshell --connect "AccountEndpoint=http://localhost:8081/;AccountKey=<emulator-account-key>"
注意
用已知的模拟器帐户密钥替换 <emulator-account-key>。
OpenTelemetry 支持
OpenTelemetry 是一个开源可观测性框架,它提供工具、API 和 SDK 集合,用于检测、生成、收集和导出遥测数据。 OpenTelemetry 协议(OTLP)是 OpenTelemetry 用来在组件之间传输遥测数据的协议。
可以将 OpenTelemetry 与模拟器配合使用来监视和跟踪应用程序。 模拟器支持遥测选项,可以在运行 Docker 容器时通过环境变量或命令行标志进行配置。
模拟器导出以下指标。 可通过支持 OTLP 的任何指标后端获取这些指标,并提供有关数据库性能和运行状况的宝贵见解:
- 请求速率:显示不同作类型的流量模式
- 查询执行时间:测量执行不同查询所花费的时间
- 资源利用率:CPU、内存使用情况和连接池指标
- 错误率:按类型和终结点跟踪错误
注意
该模拟器支持 OTLP 导出程序的条件 TLS,因此你可以与需要安全连接的可观测性平台集成。
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-latest
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-latest Docker 映像作为服务容器。 它使用环境变量来配置连接字符串、数据库名称和容器名称。 由于在这种情况下,作业直接在 GitHub Actions 运行程序计算机上运行,因此作业中的运行测试步骤可以访问模拟器,并且可以使用localhost:8081端口进行访问(8081是模拟器公开的端口)。
导出 Cosmos DB 模拟器证书步骤特定于 Java 应用程序,因为 Azure Cosmos DB Java SDK 当前不支持HTTP模拟器中的模式。 环境变量PROTOCOL在部分中设置为httpsservices,此步骤将导出模拟器证书并将其导入 Java 密钥存储。 这同样适用于 .NET。
限制
除了尚不支持或未规划的功能外,以下列表还包括模拟器的当前限制。
- 适用于 Azure Cosmos DB 的 .NET SDK 不支持在模拟器中进行批量执行。
- 如果在大型查询结果中收到 HTTP 500 错误,请使用
--query-buffer-size标志或QUERY_BUFFER_SIZE_KB环境变量来增加查询缓冲区大小。 默认值为4096KB(4MB),最大值为65536KB(64MB)。
报告问题
如果在使用此版本的模拟器时遇到问题,请在 GitHub 存储库 (https://github.com/Azure/azure-cosmos-db-emulator-docker) 中开启一个问题,并使用标签 cosmosEmulatorVnextPreview 对其进行标记。