你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
下一代 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 终结点上的协议设置。 | 
| 通过文件指定密钥 | --key-file [PATH] | KEY_FILE | 路径 | <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] | CERT_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] | LOG_LEVEL | quiet、error、warn、info、debug、trace | info | 模拟器和数据资源管理器发出的日志的详细程度。 | 
| 启用发送到 Microsoft 的诊断信息 | --enable-telemetry | 启用遥测 | true、false | true | 启用将日志发送到 Microsoft 的功能,以帮助我们改进模拟器。 | 
功能支持
此模拟器处于积极开发阶段,现为预览版。 因此,并非所有 Azure Cosmos DB 功能都受支持。 而且,某些功能将来也无法获得支持。 下表包括各种功能的状态及其支持级别。
| 功能 | 支持 | 
|---|---|
| Batch API | ✅ 受支持 | 
| 批量 API | ✅ 受支持 | 
| 更改源 | ✅ 受支持 | 
| 使用 utf 数据创建和读取文档 | ✅ 受支持 | 
| 创建集合 | ✅ 受支持 | 
| 创建集合两次冲突 | ✅ 受支持 | 
| 使用自定义索引策略创建集合 | ⚠️ 尚未实现 | 
| 创建具有TTL过期特性的集合 | ✅ 受支持 | 
| 创建数据库 | ✅ 受支持 | 
| 创建数据库两次冲突 | ✅ 受支持 | 
| 创建文档 | ✅ 受支持 | 
| 创建分区集合 | ✅ 受支持 | 
| 删除集合 | ✅ 受支持 | 
| 删除数据库 | ✅ 受支持 | 
| 删除文档 | ✅ 受支持 | 
| 获取和更改集合性能 | ⚠️ 尚未实现 | 
| 插入大型文档 | ✅ 受支持 | 
| 补丁文档 | ✅ 受支持 | 
| 并行查询已分区集合 | ⚠️ 尚未实现 | 
| 使用聚合进行查询 | ⚠️ 尚未实现 | 
| 使用 AND 筛选条件进行查询 | ⚠️ 尚未实现 | 
| 使用 AND 筛选条件和投影进行查询 | ⚠️ 尚未实现 | 
| 使用相等条件进行查询 | ✅ 受支持 | 
| 使用 ID 相等条件进行查询 | ✅ 受支持 | 
| 使用联接进行查询 | ⚠️ 尚未实现 | 
| 使用排序条件进行查询 | ✅ 受支持 | 
| 使用排序条件针对已分区集合进行查询 | ⚠️ 尚未实现 | 
| 使用按数字排序的条件进行查询 | ✅ 受支持 | 
| 使用按字符串排序的条件进行查询 | ⚠️ 尚未实现 | 
| 使用分页进行查询 | ⚠️ 尚未实现 | 
| 使用范围运算符进行日期时间查询 | ⚠️ 尚未实现 | 
| 使用数字范围运算符进行查询 | ⚠️ 尚未实现 | 
| 使用字符串范围运算符进行查询 | ⚠️ 尚未实现 | 
| 使用单个联接进行查询 | ⚠️ 尚未实现 | 
| 使用字符串、数学和数组运算符进行查询 | ⚠️ 尚未实现 | 
| 使用子文档进行查询 | ⚠️ 尚未实现 | 
| 使用两个联接进行查询 | ⚠️ 尚未实现 | 
| 使用两个联接和筛选条件进行查询 | ⚠️ 尚未实现 | 
| 读取集合 | ✅ 受支持 | 
| 读取集合源 | ⚠️ 尚未实现 | 
| 读取数据库 | ✅ 受支持 | 
| 读取数据库源 | ⚠️ 尚未实现 | 
| 读取文档 | ✅ 受支持 | 
| 读取文档源 | ✅ 受支持 | 
| 替换文档 | ✅ 受支持 | 
| 请求单位 | ⚠️ 尚未实现 | 
| 存储过程 | ❌ 未规划 | 
| 触发器 | ❌ 未规划 | 
| UDF | ❌ 未规划 | 
| 更新集合 | ⚠️ 尚未实现 | 
| 更新文档 | ✅ 受支持 | 
限制
除了尚不支持或未规划的功能外,以下列表还包括模拟器的当前限制。
- 适用于 Azure Cosmos DB 的 .NET SDK 不支持在模拟器中进行批量执行。
- .NET 和 Java SDK 在模拟器中不支持 HTTP 模式。
安装用于 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
在持续集成工作流中使用
在 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 对其进行标记。