【问题标题】:connect to mongodb in docker from node app in AWS SAM从 AWS SAM 中的节点应用程序连接到 docker 中的 mongodb
【发布时间】:2019-06-03 09:12:43
【问题描述】:

我从运行在 AWS SAM 中的 Nodejs 应用程序连接到在 docker 容器中运行的 mongodb 时遇到错误(用于说“在我的主机中”)。

我像这样运行 mongodb:

$ docker run --name mongo-myapp --rm -d -p 27018:27017 mongo

我看到了结果:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
ab8248d17d2d        mongo               "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:27018->27017/tcp   mongo-myapp

~~我可以使用在我的主机上运行的客户端(如 MongoDB Compass 和 Robo 3T 社区版)成功连接和插入数据,指定端口 27018。~~

当我尝试连接在我的主机上运行的此代码时(而不是在 docker 容器中):

const { MongoClient } = require('mongodb');
const mongoConnection = 'mongodb://127.0.0.1:27018';
MongoClient.connect(mongoConnection, (err, db) => {
    if (err) {
        console.error("Failed to connect to mongodb server", err);
        return reject(err);
    }
    console.log("Connected successfully to mongodb server");
    resolve(db);
});

我总是看到错误:

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27018

我在使用另一个端口执行所有步骤时遇到相同的错误,例如 27017。


更新

原来我的代码没有在主机上运行。它在另一个 docker 容器中运行。我没有意识到 AWS SAM 会将我的代码放入 docker 容器中,所以我没有在原始问题中提及它。

现在我使用mocha test 运行我的代码,以确保它可以在我的主机上运行,​​并且它可以毫无问题地连接到 mongo 数据库。

当我使用 AWS SAM 的 start-api 启动本地服务器时,我遇到了问题。也许解决方案是在启动 mongo 容器以及 SAM 环境时指定一个网络。

【问题讨论】:

  • 你是使用 Docker Toolbox 还是 Docker Machine?
  • @DavidMaze 不,只是适用于 Mac 的 Docker 桌面,就像任何 docker 应用程序一样。
  • 你有其他版本的 MongoDB 或 mongod 在 Mac 上运行吗? (除了 Docker 镜像)
  • @KevinPrasannaRR 不,我也可以通过在我的主机上运行的其他客户端访问它。
  • 哦,太好了,您能够解决它。由于您发布的代码本身不会出现任何问题。

标签: node.js mongodb docker aws-sam-cli


【解决方案1】:

现在已知问题是 Nodejs 代码在 AWS SAM 创建的 docker 容器中运行,我们可以帮助 Nodejs 代码与运行在单独 docker 容器中的 Mongodb 连接,该容器至少有一个暴露在主机上的端口解决方案:

  1. 将连接字符串更改为mongodb://host.docker.internal:27018,这有助于容器中的代码使用在主机上运行的服务。

【讨论】:

  • 你能解释一下吗? host.docker.internal 是什么?
  • 在 Docker 文档上找到了这个:主机的 IP 地址在变化(如果您没有网络访问权限,则没有)。从 18.03 开始​​,我们的建议是连接到特殊的 DNS 名称 host.docker.internal,它解析为主机使用的内部 IP 地址。这是出于开发目的,不适用于 Docker Desktop for Mac 之外的生产环境。网关也可以通过 gateway.docker.internal 访问。
【解决方案2】:

在node.js https://www.npmjs.com/package/mongodb中为mongodb安装必要的依赖

const MongoClient = require('mongodb').MongoClient;

const url = "mongodb://localhost:27018/testdb";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  console.log("Database created!");
  db.close();
});

【讨论】:

    【解决方案3】:

    由于您可以从同一主机中的其他客户端进行连接,因此我假设容器绑定到主机的特定外部 IP。

    你可以尝试连接到主机的ip而不是127.0.0.1

    例如:mongodb://external-ip:27018

    虽然映射 -p 27018:27017 应该将端口绑定到所有 ip,但您可以通过 -p 0.0.0.0:27018:27017 强制执行此操作。

    【讨论】:

    • 明白,但在代码中指定 ip 可能有助于我们断定是库问题还是 docker 网络问题。
    • 我尝试在代码的连接字符串中使用 0.0.0.0,但错误是一样的。另请注意,当我了解到 AWS SAM 是罪魁祸首时,我更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2023-03-15
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多