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

如何从另一Docker容器访问CosmosDB模拟器容器?

解决Docker容器间访问CosmosDB模拟器的问题

要实现函数应用容器访问CosmosDB模拟器容器,需解决网络连通和证书域名匹配两个核心问题,具体步骤如下:

1. 创建共享Docker网络

让两个容器处于同一自定义网络,这样可以通过容器名直接解析通信:

docker network create cosmos-func-network

2. 启动CosmosDB模拟器容器

启动时指定容器名并加入上述网络,同时暴露必要端口:

docker run -d \
  --name cosmos-emulator \
  --network cosmos-func-network \
  -p 8081:8081 \
  -p 10250-10255:10250-10255 \
  -e AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10 \
  -e AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true \
  mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator

3. 配置函数应用容器访问模拟器

启动函数容器时同样加入共享网络,并配置CosmosDB连接字符串:

docker run -d \
  --name my-function-app \
  --network cosmos-func-network \
  -e AzureWebJobsStorage="UseDevelopmentStorage=true" \
  -e FUNCTIONS_WORKER_RUNTIME=dotnet \
  -e CosmosDBConnectionString="AccountEndpoint=https://cosmos-emulator:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" \
  <你的函数应用镜像名称>

4. 解决SSL证书验证失败问题

由于CosmosDB模拟器的证书域名固定为localhost,用容器名cosmos-emulator访问会触发SSL验证失败,可通过以下两种方法解决:

方法A:禁用证书验证(仅开发环境适用)

在函数应用代码中配置CosmosClient时关闭证书校验,以.NET为例:

var cosmosOptions = new CosmosClientOptions
{
    HttpClientFactory = () =>
    {
        var handler = new HttpClientHandler();
        // 仅开发环境使用,生产环境禁用此设置
        handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
        return new HttpClient(handler);
    },
    ConnectionMode = ConnectionMode.Gateway
};

var cosmosClient = new CosmosClient(Environment.GetEnvironmentVariable("CosmosDBConnectionString"), cosmosOptions);

方法B:修改函数容器Hosts映射

启动函数容器时,将localhost映射到CosmosDB模拟器容器的IP,这样连接字符串用localhost即可匹配证书域名:

docker run -d \
  --name my-function-app \
  --network cosmos-func-network \
  --add-host localhost:$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cosmos-emulator) \
  -e AzureWebJobsStorage="UseDevelopmentStorage=true" \
  -e FUNCTIONS_WORKER_RUNTIME=dotnet \
  -e CosmosDBConnectionString="AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" \
  <你的函数应用镜像名称>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:28