【问题标题】:docker-compose: Connect to mongodb using nodedocker-compose:使用节点连接到 mongodb
【发布时间】:2021-01-12 13:45:52
【问题描述】:

我正在寻求有关如何在两个不同容器中使用节点连接到 mongodb 的帮助。

我在 docker compose 中设置了三个服务:

  • 网络服务器(与问题无关)
  • nodeJs
  • mongo 数据库

nodejs 容器本质上是一个 api,我可以使用它与 mongodb 进行通信:

require('dotenv').config();

const express = require('express');
const cors = require('cors')
const app = express();

var MongoClient = require('mongodb').MongoClient;
var mongodb = require('mongodb');

app.use(express.json())
app.use(cors())

app.post('/api/fetch-items', (req, res) => {
    if (req.headers.apikey !== process.env.API_KEY) return res.sendStatus(401)

    // URL is in the format: mongodb://user:pwd@database:27017
    MongoClient.connect(process.env.MONGODB_URL, function(err, db) {
        if (err) return res.status(500).send(err);
        var dbo = db.db("db");
        dbo.collection("col").find({}).toArray(function(err, result) {
            if (err) return res.status(500).send(err);
            db.close();
            return res.status(200).send(result);
        });
    });
})

app.listen(4000)

如果我将 node 作为独立容器运行(不使用 docker-compose)并在 URL 中使用 localhost,这一切都可以正常工作。

但是,当我在 docker-compose 中使用图像时,我收到了响应:

{
    "name": "MongoNetworkError"
}

向 API 发送请求时。

我目前在 URL 中使用主机名“数据库”,这不起作用。我也尝试过使用 localhost。

命令node server也没有错误。

如果需要,我的节点服务器的 Dockerfile 是:

FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

RUN chown node:node ./package*.json

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 4000

CMD [ "node", "server" ]

我的 docker-compose.yml 文件:

version: "3.1"

services:
  mongodb:
    image: mongo
    restart: always
    container_name: database
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: xxxxxxxx


  # Web server stuff

  node:
    image: created-node-server
    container_name: node
    ports:
      - 4000:4000

最后,docker network inspect 的输出:

[
    {
        "Name": "network_default",
        "Id": "3e51a90a23f2785cfc405243ad4c73991852f52826fd1cd0b14da5d4eaa180e4",
        "Created": "2021-01-12T01:07:42.656013002Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "418876a06c3f8fa430804ae77c66cca986a49dbc88374266346463f7f448baa7": {
                "Name": "database",
                "EndpointID": "ac08c5a439edd43e612723d269714e9dfbae29dbdb50790b61c66207287d70c8",
                "MacAddress": "02:42:ac:17:00:04",
                "IPv4Address": "172.23.0.4/16",
                "IPv6Address": ""
            },
            "7b6dcbb8f76618575c988a026ac0308075a116f79a2e58d8a146e33fb5d7674c": {
                "Name": "node",
                "EndpointID": "e6beb412a2fe97ae7d04d2484a7ca3634bfa37c82680becc412d1f44502da72f",
                "MacAddress": "02:42:ac:17:00:03",
                "IPv4Address": "172.23.0.3/16",
                "IPv6Address": ""
            },
            "f2ea250bccdb2c6a0c4d7818912ddbf29196eff072dad699e8dbcef466cd38a3": {
                "Name": "webserver",
                "EndpointID": "f6617aab4001032069e68300c5303fa730f3458e2fe0092ace45a9f67e16d7c5",
                "MacAddress": "02:42:ac:17:00:02",
                "IPv4Address": "172.23.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "proj",
            "com.docker.compose.version": "1.27.4"
        }
    }
]

本质上,我在尝试通过节点与 mongodb 通信时检索MongoNetworkError,这两个都是使用 docker-compose 创建的 docker 容器。

我希望以上所有内容都有意义,抱歉,如果有点罗嗦,我已尝试包含尽可能多的信息。如果您需要更多信息,请发表评论

谢谢:)

【问题讨论】:

  • 完整的错误信息是什么? MongoNetworkError 是一个错误类,在 Node 容器的日志中应该有类似 failed to connect to server [address] 的消息,这可能是有用的。
  • 你在哪里设置$MONGODB_URL,设置为什么值?
  • @ZacAnger MongoNetworkError,是返回的完整错误

标签: node.js mongodb docker networking docker-compose


【解决方案1】:

您只需要在节点服务 MONGODB_URL=mongodb://database:27017 下包含一个环境变量

【讨论】:

  • 我目前正在使用一个 .env 文件,这不起作用吗?
  • 如果您使用的是 env 文件,您希望容器从中考虑环境变量,那么您必须在节点服务下将其定义为 env_file:-nameofthefile
  • 我猜你一定在源代码中使用了 .env 文件,但是在容器启动期间不会加载 .env 文件,而是你必须告诉容器你要使用通过我上面提到的字段的 env 文件。 [链接] (docs.docker.com/compose/environment-variables/…) 。您可以从这里获得参考。
  • 这解决了我的问题,谢谢,我还需要创建一个新用户,因为我没有使用持久存储
  • 很高兴听到。 :)
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2018-10-30
  • 2020-03-06
  • 2018-04-28
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
相关资源
最近更新 更多