从主机上运行的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。
答案 0 :(得分:0)
在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连接,该端口在主机上暴露有至少一个端口解决方案:
mongodb://host.docker.internal:27018
,这有助于容器中的代码使用主机上运行的服务。