当前位置: 首页 > 知识库问答 >
问题:

无法将mongodb容器连接到docker中的节点容器

唐修能
2023-03-14

我在这个repo中用2个图像制作了3个docker容器,使用MongoDB公共图像制作了1个。我使用sudodocker-compose-f docker-compase打开了所有三个容器。yaml up

< code>docker-compose.yaml是:

version: '3'
services:
  frontend:
    image: samar080301/mern-frontend:1.0
    ports:
      - 3000:3000
  backend:  
    image: samar080301/mern-backend:1.0
    ports:
      - 5000:5000
  mongodb:
    image: mongo:latest
    ports:
      - 27017:27017

但是MongoDB无法与节点服务器连接,并给出了以下错误:

backend_1   | > crud-app@1.0.0 start /home/app
backend_1   | > node server.js
backend_1   | 
backend_1   | (node:18) 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 engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
backend_1   | (Use `node --trace-deprecation ...` to show where the warning was created)
backend_1   | App running on port 5000
backend_1   | Error with the database! MongoNetworkError: failed to connect to server [localhost:27017] on first connect [Error: connect ECONNREFUSED 127.0.0.1:27017
backend_1   |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
backend_1   |   name: 'MongoNetworkError'
backend_1   | }]
backend_1   |     at Pool.<anonymous> (/home/app/node_modules/mongodb/lib/core/topologies/server.js:438:11)
backend_1   |     at Pool.emit (events.js:315:20)
backend_1   |     at /home/app/node_modules/mongodb/lib/core/connection/pool.js:562:14
backend_1   |     at /home/app/node_modules/mongodb/lib/core/connection/pool.js:995:11
backend_1   |     at /home/app/node_modules/mongodb/lib/core/connection/connect.js:32:7
backend_1   |     at callback (/home/app/node_modules/mongodb/lib/core/connection/connect.js:280:5)
backend_1   |     at Socket.<anonymous> (/home/app/node_modules/mongodb/lib/core/connection/connect.js:310:7)
backend_1   |     at Object.onceWrapper (events.js:422:26)
backend_1   |     at Socket.emit (events.js:315:20)
backend_1   |     at emitErrorNT (internal/streams/destroy.js:84:8)
backend_1   |     at processTicksAndRejections (internal/process/task_queues.js:84:21)
backend_1   | (node:18) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [Error: connect ECONNREFUSED 127.0.0.1:27017
backend_1   |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
backend_1   |   name: 'MongoNetworkError'
backend_1   | }]

< code>backend/db.js的代码:

const mongoose = require('mongoose');
// Allow Promises
mongoose.Promise = global.Promise;
// Connection
mongoose.connect('mongodb://localhost:27017/db_test', { useNewUrlParser: true });
// Validation
mongoose.connection
  .once('open', () => console.log('Connected to the database!'))
  .on('error', err => console.log('Error with the database!', err));

添加mongouri作为环境变量后的终端输出:

backend_1   | App running on port 5000
backend_1   | (node:19) UnhandledPromiseRejectionWarning: MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.
backend_1   | (node:19) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)

新错误:

backend_1   | Error with the database! MongoNetworkError: failed to connect to server [merncrudapp_mongodb_1:27017] on first connect [Error: connect ECONNREFUSED 172.23.0.3:27017
backend_1   |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
backend_1   |   name: 'MongoNetworkError'
backend_1   | }]

共有3个答案

慕晨
2023-03-14

修改您的后端/db.js代码。

您会收到错误,因为当您在代码中提到“localhost”时,您的容器正在尝试连接到端口2017上未使用的后端容器。

// Connection
//mongodb is a container name of mongo image
mongoose.connect('mongodb://mongodb:27017/db_test', { useNewUrlParser: true });

专业提示-1)如果您在同一个docker网络中,则使用主机名或docker容器名称来彼此通信/链接。

2)如果不是手动分配IP,请勿在代码中使用容器IP地址。每当您重新启动容器时,它可能会发生变化。

沈栋
2023-03-14

运行docker compose up时,会发生以下情况:

  1. 创建一个名为MernCrudApp(采用目录的默认名称)的网络。
  2. 使用前端的配置创建容器。它以前端的名称加入网络MernCrudApp
  3. 使用后端的配置创建容器。它以后端的名称加入网络MernCrudApp
  4. 使用mongob的配置创建容器。它以mongob的名称加入网络MernCrudApp

现在,如果您使用< code > mongodb://localhost:27017/db _ test 连接到数据库,节点应用程序将在后端容器中查找MongoDB,您将得到一个连接错误,因为它不存在。

若要解决此问题,请将 MongoDB 连接字符串更改为 mongodb://mongodb:27017/db_test,以便

补充说明< br >我建议以下内容有助于解决您在未来使用当前配置时可能面临的一些问题。

  1. 将连接字符串添加为环境变量。这将使您更容易更改DB实例,而无需重建容器。
  2. 由于后端应用程序依赖于数据库,因此在docker-com的文件上添加depend_on,以便MongoDB容器在后端容器之前启动
龚凌
2023-03-14

尝试不使用< code>localhost而是使用容器名称进行连接。例如,如果您想从另一个容器(在同一个docker网络中)连接到MongoDB,您可以使用< code>mongodb:27017。应该能行。

 类似资料:
  • 我的数据库连接是用下面的类处理的: 这是我的spring boot控制器 下面是我的dockerfile: 我读了这里和这里提到的解决方案。也阅读了一些教程,但我无法将这些解决方案中的任何一个适合我的代码。在我的代码中,我应该在哪里更改?

  • 问题内容: 我正在使用docker- compose 运行一个应用程序。一切正常,通过连接到容器内的Mongo,我可以看到所有数据。但是,当我连接到RoboMongo时,我看不到任何数据。 我该如何解决这个问题? 问题答案: 您应该在Docker容器内建立到MongoDB的Robomongo SSH隧道连接。首先,您应该在docker容器中安装一个ssh服务器。 https://docs.dock

  • 问题内容: 计划 我希望我的tomcat服务器能够在单独的容器中连接到我的MySQL服务器。 问题 Tomcat无法连接到MySQL 我使用了wordpress教程中的一些详细信息,这些信息涉及与mysql容器建立链接并创建指向MySQL的链接。 尽管tomcat和mysql旋转得很好,但我似乎无法使tomcat能够连接到MySQL,但是这些设置在我的本地计算机上也可以正常运行。 我也尝试使用它,

  • 我有zipkin服务器作为Spring Boot应用程序运行。我已经将jar导出到docker容器。 我已经探索过这个环节。

  • 作为解决Hibernate OGM连接问题的一部分,我想看看我是否从Robo 3T连接。 我构建我的MongoDB映像并开始运行。 docker ps: MacBook-Pro:GoStopHandle NOTiFY$docker ps容器ID图像 命令创建状态端口名称0375a68b9988 goStop handlemongob:最新 "docker-entrypoint. s..."5秒前上

  • 我无法将作为docker容器运行的应用程序连接到mongoDB。我知道新版本docker compose不推荐使用“链接”,所以我尝试使用自定义网络。我的码头工人。yml: 我的应用程序的Dockerfile: 当我运行时,我在应用程序中得到以下错误消息: 在第一次连接时连接到服务器[127.0.0.1:27017]失败[MongoNetworkError:连接ECONNREFUSED127.0.