如何从另一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
相关产品推荐
相关产品推荐

