从主机上的节点应用连接到docker中的mongodb

时间:2019-06-01 16:51:35

标签: node.js mongodb docker

从主机上运行的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 Community Edition)成功连接并插入数据,并指定端口27018。~~

当我尝试与主机上运行的代码连接时(不在Docker容器中):

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。

3 个答案:

答案 0 :(得分:0)

enter image description here

在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();
});

答案 1 :(得分:0)

由于您能够从同一主机中的其他客户端进行连接,因此我认为该容器已绑定到主机的特定外部ip。

您可以尝试连接到主机的IP而不是127.0.0.1

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

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

答案 2 :(得分:0)

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

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