【问题标题】:Cannot access local MongoDB from sam local无法从 sam local 访问本地 MongoDB
【发布时间】:2020-02-03 08:38:31
【问题描述】:

我有安装了 MongoDB 的 Windows 10 机器。我可以从命令行连接它。我使用sam local 运行 NodeJS 应用程序。当我使用生产环境时,该应用程序可以访问 Mongo Atlas 云实例。但是当我切换到具有 localhost MongoDB 的开发环境时,它无法连接。

sam 命令启动 Docker,因此很清楚为什么它无法连接在 windows localhost 上运行的 Mongo。我发现了相关问题:From inside of a Docker container, how do I connect to the localhost of the machine?。问题是我仍然无法连接我的本地 MongoDB,即使我尝试:

"MONGODB_URI": "mongodb://docker.for.win.localhost:27018/bud?retryWrites=true&w=majority"

"MONGODB_URI": "mongodb://host.docker.internal:27018/bud?retryWrites=true&w=majority"

错误:

Request failed { MongoNetworkError: failed to connect to server [docker.for.win.localhost:27018] on first connect [MongoNetworkError: connect ECONNREFUSED 192.168.65.2:27018]

有没有人也遇到过这个问题并克服了它? Mongo是直接安装到windows上的,不是在Docker里面的。

【问题讨论】:

  • Docker 实际上运行在 27017 端口
  • 我想我应该先问问你使用的是哪个版本的 docker。我在 Windows 10 上使用 docker 19.03.5 Community Edition,我的 docker 容器似乎找到了localhost。试试:docker run --rm nginx:alpine sh -c "ping localhost"docker run --rm ubuntu sh -c "apt-get update && apt-get install -yq iputils-ping && ping localhost"
  • 解决方法: 连接到网络/Wifi,获取 IP 地址并修改您的 docker 以指向该 IP 地址
  • 是的,这行得通。但是恕我直言,它使我的实例公开,不是吗?

标签: mongodb docker aws-sam


【解决方案1】:

如果 MongoDB 已安装并直接从 Windows 运行,则应该可以通过 localhost:27017 访问它。 mongod 的默认端口是27017,如mongoDB documentation page 中所述。

尝试使用:

"MONGODB_URI": "mongodb://localhost:27017/bud?retryWrites=true&w=majority"

如果您使用NETWORKS_DRIVER 而不是bridge 作为默认设置的NodeJS docker 容器。参考Docker Network drivers

其他情况:

  • 当使用--shardsvr 命令行选项或配置文件中clusterRole 设置的shardsvr 值运行时,mongod 的默认端口为27018

  • 当使用--configsvr 命令行选项或配置文件中clusterRole 设置的configsvr 值运行时,mongod 的默认端口为27019

【讨论】:

  • docker 容器正在运行自己的 linux,它会覆盖 localhost/127.0.0.1。需要将 URI 更改为 host.docker.internal 并传递正确的端口 27017。
  • 我想,我错过了那部分。谢谢你让我知道:)
【解决方案2】:

请记住,localhost(或任何名称)只是为了您的方便。 Tcp 堆栈适用于 IP 地址。如果您配置 dns 服务(例如通过 hosts 文件)将容器的名称解析为 127.0.0.1,这并不意味着您的主机,而是 127.0.0.1 始终指向容器。

您可以让 mongo 服务在您的主 IP 上侦听并将其用于 docker 应用程序,但您也可以利用 hyper-v 虚拟网卡并设置 mongo 不仅可以侦听主机的环回接口,还可以侦听虚拟接口并提供该接口的 docker app ip。它保留在您的虚拟局域网上,因此不会向公众公开。但是,windows 防火墙可能会阻止它,因此请确保将其设置为私有网络(它将被标记为未识别,默认情况下是公共的,通常会被阻止)。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2020-02-06
    • 2022-12-08
    • 2020-09-05
    • 1970-01-01
    • 2020-02-06
    • 2021-07-02
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多