Docker部署的本地CosmosDb无法被应用连接,寻求解决方法
问题描述
已通过Docker启动本地CosmosDb模拟器,可通过本地浏览器访问 https://localhost:8081/_explorer/index.html,但应用无法连接到该本地实例。应用日志显示容器内部IP地址:Current WriteEndpoints = (https://172.17.0.2:8081/) ReadEndpoints = (https://172.17.0.2:8081/),该地址无法被应用访问。
应用配置(AppSettings):
"CosmosDb": { "CosmosDbPrimaryKey": "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", "Url": "https://localhost:8081", "Database": "Test" },
应用连接代码:
_client = new CosmosClient(section["Url"], section["CosmosDbPrimaryKey"]); var container = _client.GetContainer("Test", "Questions"); var result = await container.CreateItemAsync<Test>(new Test { questions = new List<Answer> { new Answer { test = "1", } } });
该代码连接云端CosmosDb正常,仅切换到本地Docker模拟器后出现连接问题。
解决方案
问题根源是Docker内的CosmosDb模拟器默认返回容器内部IP作为读写端点,而宿主机上的应用无法直接访问这个内部地址。有两种解决方式:
方式一:修改应用连接配置,强制使用指定端点
在初始化CosmosClient时添加配置选项,禁用端点发现并使用网关模式,强制客户端使用配置的localhost地址:
var clientOptions = new CosmosClientOptions { ConnectionMode = ConnectionMode.Gateway, EnableEndpointDiscovery = false }; _client = new CosmosClient(section["Url"], section["CosmosDbPrimaryKey"], clientOptions);
方式二:调整Docker启动命令,让模拟器返回正确外部地址
启动CosmosDb容器时,添加环境变量AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE,指定模拟器对外暴露的地址为localhost:
docker run -p 8081:8081 -p 10250:10250 -p 10251:10251 -p 10252:10252 -p 10253:10253 -p 10254:10254 \ -e AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=localhost \ mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
这样模拟器会返回localhost作为读写端点,应用就能正常连接。
内容的提问来源于stack exchange,提问作者RheinmetallSkorpion
相关产品推荐
相关产品推荐

