从 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 容器中,在主机上公开一个端口,至少有一个解决方案:
- 将连接字符串更改为
mongodb://host.docker.internal:27018
,这有助于容器中的代码使用主机上的服务 运行。
我在从我的 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 容器中,在主机上公开一个端口,至少有一个解决方案:
- 将连接字符串更改为
mongodb://host.docker.internal:27018
,这有助于容器中的代码使用主机上的服务 运行。