Mongo数据库在使用docker时断开连接

提姆哈朱

我在我的应用程序中使用 docker compose 并尝试将 mongodb 连接到服务器。当我在 docker 之外本地运行我的应用程序时,我将其作为输出(按预期工作)

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
Server running
Mongoose connected to db...
Mongodb connected....

当我运行docker-compose up命令并且服务器在容器中运行时,我得到了这个输出

[nodemon] 2.0.15
docker-server  | [nodemon] to restart at any time, enter `rs`
docker-server  | [nodemon] watching path(s): *.*
docker-server  | [nodemon] watching extensions: js,mjs,json
docker-server  | [nodemon] starting `node index.js`
docker-server  | Works
docker-server  | Works
docker-server  | Mongoose connection is disconnected...

过了一会儿,猫鼬断开了连接。

我的package.json

{
  "name": "make-me-a-sandwich",
  "version": "1.1.0",
  "description": "This is the Swagger 2.0 API for Web Architectures course group project work.        ",
  "main": "index.js",
  "scripts": {
    "prestart": "npm install",
    "start": "nodemon index.js"
  },
  "keywords": [
    "swagger"
  ],
  "license": "Unlicense",
  "private": true,
  "dependencies": {
    "connect": "^3.2.0",
    "js-yaml": "^3.3.0",
    "swagger-tools": "0.10.1",
    "mongoose": "^6.1.5",
    "nodemon": "^2.0.15"
}

}

我的index.js文件是

const http = require('http');
const connect = require('./models/db');

const PORT = 80;
const server = http.createServer(function (request, response) {

const { url, method, headers } = request;
const filePath = new URL(url, `http://${headers.host}`).pathname;

if (filePath === '/' && method.toUpperCase() === 'GET') {
    console.log("Works")
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/plain');
    response.end('Hello, World! GET\n');
} else {
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/plain');
    response.end('Hello, World! Teemu\n');
}

});

server.on('error', err => {
   console.error(err);
   server.close();
});

server.on('close', () => console.log('Server closed.'));

server.listen(PORT, () => {
    console.log("Server running");
});
connect.connectDB();

模型/db.js

const mongoose = require('mongoose');

function connectDB() {
   mongoose
       .connect('mongodb://mongo_db:27017', {
           useNewUrlParser: true,
       })
       .then(() => {
           console.log('Mongodb connected....');
       })
       .catch(err => console.log(err.message));

   mongoose.connection.on('connected', () => {
       console.log('Mongoose connected to db...');
   });

   mongoose.connection.on('error', err => {
       console.log(err.message);
   });

   mongoose.connection.on('disconnected', () => {
       console.log('Mongoose connection is disconnected...');
   });
};
function disconnectDB() {
    mongoose.disconnect();
}

module.exports = { connectDB, disconnectDB };

Dockerfile

FROM node:17.3.0

WORKDIR /server

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

CMD ["npm", "start"]

码头工人撰写文件

version: "3"

services:
  server-a:
    container_name: docker-server
    build:
      dockerfile: Dockerfile
      context:  ./backend/server-a
    ports:
      - "3000:80"
    links: 
      - mongo_db
    networks:
      - backend
  mongo_db:
    container_name: mongo
    image: mongo:latest
    ports:
      - '27017:27017'
networks:
  backend:

帮助将不胜感激。如果我可以提供任何其他信息,请告诉我。

大卫迷宫

不同的容器需要在同一个 Compose 网络上进行通信。如果服务没有networks:块,Compose 会自动将其附加到default网络。因此,在您的示例中,server-a容器仅在backend网络上,但mongo_db容器仅在default网络上,这就是它们无法通信的原因。

解决此问题的最简单方法是删除文件中所有networks:块。然后 Compose 会将所有容器附加到default网络。删除其他不必要的选项,您可以将此 Compose 文件缩减为

version: "3.8"
services:
  server-a:
    build: ./backend/server-a
    ports:
      - "3000:80"
  mongo_db:
    image: mongo:latest
    ports:
      - '27017:27017'

在评论中,您建议保留第二个命名网络很重要。如果是这种情况,那么您需要确保数据库容器也有一个networks:块,该块命名与应用程序容器相同的网络。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

与数据库断开连接时意外停止

C#在分离数据库时如何断开连接

在emacs中使用sqlplus时如何断开与数据库的连接?

使用Peewee处理数据库断开连接

如何捕获断开的数据库连接

如何使用mongo / mongoose连接到远程数据库

使用Mongo-cli连接到OpenShift数据库

数据库连接断开时重新运行应用程序

子类化Perl DBI,在断开连接时覆盖调用脚本中的数据库处理程序

Docker Wordpress:建立数据库连接时出错

在 docker 中使用 .net core 和 mysql 时出现数据库连接错误

连接到数据库连接时使用Spotfire函数

无法使用 docker 创建 mongo 数据库

如何使用docker-compose播种mongo数据库?

使用Alteryx的Mongo连接工具连接Mongo Labs数据库(集合)

连接/断开数据库的最佳实践是什么?

Java + Tomcat,正在断开数据库连接?

c#如何连接和断开mysql数据库

无法使用Docker连接我的postgres数据库

使用 docker compose 将 API 连接到数据库

使用mysqldriver连接数据库时出错

使用PHP连接数据库时出错

使用休眠连接到数据库时出错

使用Microsoft Identity Framework时的数据库连接问题

使用 grep 时的数据库连接范围

Docker - Mongo 数据库实例未与应用程序连接

当数据库服务为clusterIP时,如何通过MONGO_URL连接mongodb服务?

使用 docker 安装竹试验并连接到本地主机上的 postgres 数据库时出现问题

尝试从Docker容器连接到本地mysql数据库时拒绝连接