You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2主机访问Docker中Cosmos DB模拟器遇阻,求解决方案

解决WSL2访问Docker中Cosmos DB模拟器的问题

1. 修改Docker Compose配置,添加网络访问权限和密钥参数

Linux版Cosmos DB模拟器需要显式开启网络访问权限,你可以通过环境变量或启动命令参数完成配置:

方式一:使用环境变量

更新你的docker-compose.yml,在environment块中追加以下两个变量:

version: '3.8'

services:
    db:
        container_name: cosmosdb
        image: "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator"
        tty: true
        restart: always
        mem_limit: 2G
        cpu_count: 2
        environment:
            - AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
            - AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
            # 新增网络访问和密钥配置
            - AZURE_COSMOS_EMULATOR_ALLOW_NETWORK_ACCESS=true
            - AZURE_COSMOS_EMULATOR_KEY=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
        ports:
            - "8081:8081"
            - "8900:8900"
            - "8901:8901"
            - "8979:8979"
            - "10250:10250"
            - "10251:10251"
            - "10252:10252"
            - "10253:10253"
            - "10254:10254"
            - "10255:10255"
            - "10256:10256"
            - "10350:10350"
        volumes:
            - vol_cosmos:/data/db

volumes: 
    vol_cosmos:

方式二:使用启动命令参数

如果环境变量不生效,可直接指定模拟器的启动命令:

services:
    db:
        # 保留原有配置
        command: "--allownetworkaccess --key C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="

2. 适配WSL2的网络特殊性

如果你的C#代码在WSL2环境运行,注意WSL2的localhost与Windows主机的localhost不互通:

  • 若Docker运行在Windows主机,需要用Windows主机的实际IP替换连接字符串中的localhost。在WSL2中执行cat /etc/resolv.conf,nameserver后的地址就是Windows主机IP。
  • 若Docker运行在WSL2分发版,直接使用localhost即可,但需确保模拟器已开启网络访问权限。

修改后的连接字符串示例(替换为实际Windows主机IP):

var cosmosClient = new CosmosClient(
    "AccountEndpoint=https://192.168.1.100:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
    new CosmosClientOptions()
    {
        HttpClientFactory =() =>
        {
            HttpMessageHandler httpMessageHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
            };
            return new HttpClient(httpMessageHandler);
        },
        ConnectionMode = ConnectionMode.Gateway
    }
);

3. 验证配置并重启服务

执行以下命令重启Docker Compose服务:

docker-compose down
docker-compose up -d

访问https://<你的主机IP>:8081/_explorer/index.html,确认模拟器Web界面可正常打开,且能创建数据库和容器。

4. 排查CosmosClient卡住的额外要点

如果修改后仍卡住,检查以下内容:

  • 端口映射:你的配置已包含所有必要端口,无需额外调整。
  • 连接模式:ConnectionMode.Gateway仅依赖8081端口,你的代码配置正确。
  • 证书问题:若WSL2环境仍有证书校验问题,可从Windows主机的C:\Users\<你的用户名>\AppData\Local\AzureCosmosEmulator复制证书到WSL2,并导入到WSL2的证书存储中。

内容的提问来源于stack exchange,提问作者Alexandre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:42:27