mongoose docker 尽管连接成功,CRUD 仍无法正常工作

mongoose docker CRUD not working despite successful connection

我正在学习 docker 并创建一个简单的网络应用程序来添加两个数字。我想保存和获取 MongoDB

中的操作

我为 mongodb 和节点创建了自己的 Docker 文件,还创建了一个 docker-compose 文件。 Mongoose 能够连接到我的 MongoDB 容器。

当我尝试创建文档时,我无法通过 mongoose 或 mongo shell 找到它。我还通过 mongo shell 在同一个数据库中创建了一个文档,但我仍然找不到它。

MongoDB docker文件

FROM ubuntu:20.04

RUN apt update
RUN apt install -y wget gnupg
RUN wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -

RUN echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | \
        tee /etc/apt/sources.list.d/mongodb-org-5.0.list

RUN apt update
RUN apt install -y mongodb-org=5.0.2 mongodb-org-database=5.0.2 mongodb-org-server=5.0.2  \
        mongodb-org-shell=5.0.2 mongodb-org-mongos=5.0.2 mongodb-org-tools=5.0.2
EXPOSE 27017
CMD ["/usr/bin/mongod", "-f", "/etc/mongod.conf"]

节点Docker文件

FROM ubuntu:20.04

SHELL ["/bin/bash", "-c"]

RUN apt update
RUN apt install -y curl

RUN mkdir /usr/local/nvm
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 14.18.1

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash \
        && source $NVM_DIR/nvm.sh \
        && nvm install v$NODE_VERSION

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

RUN mkdir /usr/app

WORKDIR /usr/app

COPY . /usr/app
RUN npm install

RUN npm install -g nodemon

EXPOSE 3000

CMD ["nodemon", "index.js"]

Docker 撰写文件

version: "3.9"

services: 
  db:
    image: db
    build: 
      context: ./
      dockerfile: Dockerfile.mongodb
    ports:
      - "27017:27017"
    volumes:
      - /home/rohit/Downloads/mongodb_data:/var/lib/mongodb

  app:
    image: app
    build: 
      context: ./
      dockerfile: Dockerfile.node
    ports:
      - "3000:3000"
    volumes: 
      - /home/rohit/github_repos/node-react-jenkins-docker/:/usr/app
    depends_on:
      - db

节点app.js

const bodyParser = require('body-parser');
const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(bodyParser.urlencoded({extended: true}));
mongoose.connect('mongodb://db:27017/test', {useNewUrlParser: true})
  .catch(err => {
    console.log(err);
  });

const testSchema = new mongoose.Schema({
  num1: Number,
  num2: Number,
  result: Number,
});

const Sum = mongoose.model('sum', testSchema);

const sum = new Sum({
  num1: 5,
  num2: 3,
  result: 8,
});
sum.save();

Sum.find((err, sums) => {
  console.log(sums);
});

app.get('/', function (req, res){
  res.sendFile(__dirname + '/index.html');
});

app.post('/', function (req, res){
  var num1 = Number(req.body.num1);
  var num2 = Number(req.body.num2);
  var result = num1 + num2;
  res.send('The result of calculation is ' + result);
});

module.exports = app

我执行了 docker-compose build 然后 docker-compose up

我可以在我的浏览器上成功访问 localhost:3000,但我没有看到控制台日志。

我已经挂载了我的工作目录,这样我在本地所做的任何更改都会被节点容器获取。

docker container ls 给出

CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                                           NAMES
0f98d3a819b2   app       "nodemon index.js"       About an hour ago   Up About an hour   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp       node-react-jenkins-docker_app_1
d2a4a2ca229a   db        "/usr/bin/mongod -f …"   About an hour ago   Up About an hour   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   node-react-jenkins-docker_db_1

尝试访问容器中的 mongo shell

docker container exec -it node-react-jenkins-docker_db_1 mongo

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> db
test
> show collections
sums
> db.sums.find()
{ "_id" : 1, "num1" : 2, "num2" : 1, "result" : 3 }
> 

它显示了我手动创建的文档,但我无法通过 app.js 中的 Sum.find() 访问它。我也没有看到 app.js 成功运行时应该创建的文档。

请在 GitHub

找到完整的存储库

在与一位经验丰富的开发人员交谈后,我解决了自己的问题。原来 mongod.conf 文件中的 bindIp 需要设置为 0.0.0.0 然后它开始工作。共享以防其他人遇到同样的问题。