我试图通过docker-compose运行CosmosDB模拟器的linux容器,但我无法连接到它。
我有以下docker-compose文件:
version: '3.4'
services:
local-cosmosdb:
image: "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:mongodb"
container_name: local.cosmosdb
tty: true
restart: always
environment:
- AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
- AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
ports:
- 8081:8081
- 10250:10250
- 10251:10251
- 10252:10252
- 10253:10253
- 10254:10254
- 10255:10255
当我启动容器时,控制台说所有分区都已成功启动&它已经启动并运行了。通过使用telnet,我还确认有一些进程监听本地主机上的10250和8081等端口。然而,我不能用连接字符串mongodb://localhost:8081
连接到DB (MongoDB使用相同的字符串,但端口27017,我假设在宇宙中有一个等效的)。
我也试过了:
- 使用任何其他暴露的端口(包括10250和10255)
- 为模拟器尝试不同的标签
- 使用容器名称代替本地主机,并结合各种端口(例如
mongodb://local.cosmosdb:8081
)
有关于通过连接字符串直接连接到Azure Cosmos DB的文档,但是我真的找不到任何关于连接到运行在docker compose上的Cosmos DB模拟器的资源。我能找到的最好的是这个:CosmosDb模拟器与docker-compose这并没有真正回答我的问题。我也遇到了这个:如何启动CosmosDB模拟器与docker-compose?但是它不包括获取一个实际的连接字符串。
任何帮助在这将是非常感激!
就像我在评论中提到的,当微软急于修复许可证问题时,他们似乎已经做了一些事情来破坏MongoDB API模拟器。
在更改之前,要通过MongoDB客户端连接到模拟器,您需要做的就是获取模拟器证书,然后用它初始化客户端,例如在Java中:
var storePassword = // whatever you used to create the keystore
var sslContext = new SSLContextBuilder()
.loadKeyMaterial(keyStoreFile, storePassword, storePassword)
.loadTrustMaterial(keyStoreFile, storePassword, TrustSelfSignedStrategy.INSTANCE)
.setKeyStoreType("PKCS12")
.build();
var connectionUrl = "mongodb://localhost:" + URLEncoder.encode(EMULATOR_KEY, UTF_8) + "@localhost:10255/admin?ssl=true&retrywrites=false"
var clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(connectionUrl))
.applyToSslSettings(builder -> builder.enabled(true)
.invalidHostNameAllowed(true)
.context(sslContext))
.build();
MongoClients.create(clientSettings);