Mongodb 使用Mongoose连接到docker环境中的MongoCrypted实例
我在网上搜索过,但在任何地方都找不到我的答案。 我正在尝试使用NestJS框架运行一个API web服务 我正在运行docker compose,它启动API服务器、一个MongoDB实例和一个MongoCrypted实例,以允许在我的应用程序上进行客户端字段级加密 我可以连接到MongoDB实例,但不能连接到mongocryptd实例 Docker编写文件: 使用的dockerfile是mongo的官方dockerfile,但提供了args以构建包含企业功能的映像的企业版本 尝试从应用程序连接到数据库时,我正在运行:Mongodb 使用Mongoose连接到docker环境中的MongoCrypted实例,mongodb,docker,mongoose,docker-compose,docker-networking,Mongodb,Docker,Mongoose,Docker Compose,Docker Networking,我在网上搜索过,但在任何地方都找不到我的答案。 我正在尝试使用NestJS框架运行一个API web服务 我正在运行docker compose,它启动API服务器、一个MongoDB实例和一个MongoCrypted实例,以允许在我的应用程序上进行客户端字段级加密 我可以连接到MongoDB实例,但不能连接到mongocryptd实例 Docker编写文件: 使用的dockerfile是mongo的官方dockerfile,但提供了args以构建包含企业功能的映像的企业版本 尝试从应用程序连接
MongooseModule.forRoot(`mongodb://usr:pwd@mongodb:27017`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
retryAttempts: 2,
autoEncryption: {
keyVaultNamespace,
kmsProviders,
extraOptions: {
mongocryptdURI: `mongodb://mongocryptd:27020`,
mongocryptdBypassSpawn: true
}
} as any
})
**这是提供配置的NestJS版本。它类似于mongoose——第一个参数是URI,第二个是设置对象
没有自动加密选项,我可以连接而没有任何问题。这意味着我的数据库地址是正确的。 使用AutoEncyOption选项,我将获得
MongooseServerSelectionError:connect EconReconRefused 172.25.0.4:27020
(mongocryptd地址)。这意味着IP是正确的(DNS解析),但连接被拒绝。如前所述,端口(27020)由docker compose文件发布,我甚至尝试在构建本身中添加一个公开步骤
但是当我将容器的网络映射到主机(网络模式:“主机”
)时,应用程序能够毫无问题地连接(将连接DNS更改为localhost:27017和27020)。所以这一定意味着这是一个与码头工人有关的问题
我尝试过的其他事情&&我尝试过的内容的概述:
- 附加一个卷,用以下网络配置替换
:/etc/mongod.conf.orig
- 在启动mongo服务之前,在生成步骤中替换卷,而不是附加卷
- 我还尝试将
更改为docker网络提供的特定应用程序IPbindIp
- 所有类型的连接字符串,包括和不包括用户凭据、身份验证源和默认数据库
- 端口27020在docker compose中发布,并在docker文件中公开
mongod
是以--bind\u ip\u all
运行的,因此更改conf文件应该不会产生效果。
还尝试使用mongodsdocker entrypoint.sh运行mongocryptd
,而不是覆盖它
验证mongocryptd
是否正在运行(ps awwxu
等)
验证是否可以使用mongo
从运行它的同一容器上的bash
连接到它
验证是否可以使用mongo
从主机系统连接到它
检查mongocryptd
日志(它基本上是一个带有一些额外功能的mongod
)
验证mongocryptd
是否正在运行(ps awwxu
等)
验证是否可以使用mongo
从运行它的同一容器上的bash
连接到它
验证是否可以使用mongo
从主机系统连接到它
检查mongocryptd
日志(它基本上是一个带有一些额外功能的mongod
)
1.我可以使用ps awwxu
验证它是否在根用户下运行。2.我遇到了一个失败的、连接被拒绝的错误——这是因为我没有在该容器上运行mongod进程,只是在mongocryptd上运行。我尝试从同一个容器中运行mongod和mongocryptd(运行MongoRegular image,打开shell,运行mongocryptd),但我遇到了相同的连接拒绝错误。3.同样,mongod没有运行4。日志是空的。我可以看到启动日志[listener]正在127.0.0.1上侦听和[listener]在端口27020上等待连接
我已从同一容器重新运行mongocryptd和mongo,并使用Nmap扫描端口。27017和27020均表示为打开状态。使用mongo CLI时,我没有收到拒绝的连接,如果在连接设置中省略使用MongoCrypted的选项(上面示例中的自动加密密钥),我可以从应用程序进行连接。当我重新添加加密密钥时,它尝试连接到MongoCrypted,我得到了相同的EconReconFused错误。同样,当使用主机网络模式时,一切正常。通过这些步骤,mongo shell可以直接连接到mongocryptd进程,至少可以在其上运行ismaster。我已经完成了。它们是用默认配置配置的(我也尝试过传递上面解释的conf文件设置)。目前,我无法解决这个问题。我的最佳猜测是mongocryptd没有绑定到localhost以外的其他IP的选项的原因(在.conf文件中不接受它,也没有将它作为命令参数传递的选项)。3天后,我放弃了,在应用程序容器中安装了mongodb enterprise cryptd包。它可以完美地工作,但这不是最佳解决方案。你是对的,mongocryptd似乎无法识别--bind_ip.1。我可以使用ps awwxu
验证它是否在根用户下运行。2.我遇到了一个失败的、连接被拒绝的错误——这是因为我没有在该容器上运行mongod进程,只是在mongocryptd上运行。我尝试从同一个容器中运行mongod和mongocryptd(运行MongoRegular image,打开shell,运行mongocryptd),但我遇到了相同的连接拒绝错误。3.同样,mongod没有运行4。日志是空的。我可以看到启动日志[listener]正在127.0.0.1上侦听和[listener]在端口27020上等待连接
我已从同一容器重新运行mongocryptd和mongo,并使用Nmap扫描端口。27017和27020均声明为
MongooseModule.forRoot(`mongodb://usr:pwd@mongodb:27017`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
retryAttempts: 2,
autoEncryption: {
keyVaultNamespace,
kmsProviders,
extraOptions: {
mongocryptdURI: `mongodb://mongocryptd:27020`,
mongocryptdBypassSpawn: true
}
} as any
})
net:
port: 27017
bindIp: 0.0.0.0
bindIpAll: true