【发布时间】: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