从 AWS SAM 中的节点应用程序连接到 docker 中的 mongodb

connect to mongodb in docker from node app in AWS SAM

我在从我的 Nodejs 应用 运行ning in AWS SAM运行ning 连接到 docker 容器中的 运行ning 时遇到错误=47=](常说"in my host")。

我运行mongo分贝喜欢:

$ 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

~~我可以在我的主机上使用客户端 运行ning 成功连接和插入数据,比如 MongoDB Compass 和 Robo 3T Community Edition,指定端口 27018.~~

当我尝试在我的主机上连接此代码 运行ning 时,(不在 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。


更新

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

现在我 运行 我的代码 mocha test 以确保它会 运行 在我的主机上,并且它连接到 mongo 数据库没有问题。

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

在node.jshttps://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();
});

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

能否尝试连接到主机的 ip 而不是 127.0.0.1

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

虽然映射 -p 27018:27017 应该将端口绑定到所有 ip,但您可以通过 -p 0.0.0.0:27018:27017.

强制执行此操作

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

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