x1c 0d1x的数据
我正在参加一个初级Docker课程(https://www.youtube.com/watch?v=3c-iBn73dDE&t=4384s),我认为这个课程做得很好。
作为课程的一部分,应用程序与节点服务器和js前端放在一起,与mongo db和mongo express的docker容器通信以实现持久性。
节点应用程序可以在https://gitlab.com/nanuchi/techworld-js-docker-demo-app/-/blob/master/app/server.js上找到。包含:
MongoClient.connect("mongodb://admin:password@mongodb:27017",
function (err, client) {
if (err) throw err;
var db = client.db('user-account');
userObj['userid'] = 1;
字符串
我在Chromebook上运行了两个在ubuntu 20.04上运行的docker容器(截图)。当我运行时:
11@penguin:~/techworld-js-docker-demo-app/app$ nodejs server.js
app listening on port 3000!
型
但是当我打开浏览器到localhost:3000时,我得到:
(node:2716) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring pass option { useUnifiedTopology: true } to the MongoClient constructor.
/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/topologies/server.js:240
throw err;
^
MongoNetworkError: failed to connect to server [mongodb:27017] on first connect [MongoNetworkError: getaddrinfo EAI_AGAIN mongodb mongodb:27017]
at Pool.<anonymous> (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/topologies/server.js:431:11)
at Pool.emit (events.js:198:13)
at createConnection (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/pool.js:559:14)
at connect (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/pool.js:973:11)
at makeConnection (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:39:11)
at callback (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:261:5)
at Socket.err (/home/11/techworld-js-docker-demo-app/app/node_modules/mongodb/lib/core/connection/connect.js:286:7)
at Object.onceWrapper (events.js:286:20)
at Socket.emit (events.js:198:13)
at emitErrorNT (internal/streams/destroy.js:91:8)
型
我做错了什么?
编辑;需要说明的是,我在本地计算机上运行node项目(从我的ubuntu主目录),我试图连接到docker mongo容器作为后端。作者可能跳过了她想要如何运行gitlab项目。(或者我误解了),但我假设她想在主机上运行它。她可能计划在容器中运行它,但由于它是在gitlab而不是docker上,我不知道如何将node项目放入容器中。
4条答案
按热度按时间u91tlkcl1#
我刚刚看了一下你在Gitlab中的项目。你的代码中的连接字符串是为mongodb主机名
mongodb
设置的,当你在docker中运行node进程和mongodb时,它应该可以正常工作。在你的问题中,你似乎是从你的主机执行node。这不允许解析docker内部主机名。要检查这个,* 暂时 * 使用localhost
而不是mongodb
作为主机名(使用此连接字符串mongodb://admin:password@localhost
)。这将使用您的主机作为连接的目标,因为您还Map了docker-compose文件中的端口,该文件打开了主机上的端口。为了使代码在这两种情况下都能工作,(在host和all-in-docker上为prod开发),你不能在代码中硬编码连接字符串,而是需要使其可配置。一种方法是使用环境变量。有关概念细节,请参阅the 12factor topic on configuration。当涉及到凭据时,这一点尤其重要,凭据根本不应该出现在git存储库中。所以,一个常见的做法是从环境中读取这样的配置。对于node,这就像阅读
process.env.YOUR_VAR_FOR_MONGO_HOSTNAME
一样简单。有关详细信息,请查看node文档。然后需要将此变量export
ed或传递给node
的调用。这里提供一些便利的一个工具是dotenv包,它基本上允许指定在你的all-in-docker设置中,你可以相应地将环境变量指定回mongodb
而不是localhost
。lxkprmvk2#
/etc/mongod.conf中的净bindIp值是多少?
(我不知道你的配置在哪里,但你可以试试
vim /etc/mongod.conf
)如果net bindIp是127.0.0.1,则只能在localhost中连接到mongodb。
当你设置0.0.0.0如下时,你可以在任何地方连接到mongodb。
字符串
顺便说一下,你需要在更改配置后重新启动mongodb。
9cbw7uwe3#
我认为你需要检查Mongo URL
"mongodb://admin:password@mongodb"
请参考下面的示例,其中有一个连接MongoDB的示例字符串
试着这样
型
bvjxkvbb4#
连接到MongoDB Cloud
确保您的MongoDB URL具有以下参数。
第一个月
在2023年的时候,我也是这样。作为一个指导,去MongoDB的连接设置(从https://cloud.mongodb.com/),选择一个驱动程序(在我的例子中是Node.js),然后检查Mongo提供的连接字符串。这可能会给予你一个提示,告诉你你错过了什么。