【问题标题】:Can't connect to local instance of MongoDB when app is run in a Docker container当应用程序在 Docker 容器中运行时,无法连接到本地 MongoDB 实例
【发布时间】:2020-12-07 18:56:20
【问题描述】:

我在本地机器上将 MongoDB 作为独立服务器运行。我的快速应用程序可以很好地连接到它,除非它在容器中运行。在我的连接字符串中,我尝试使用我的机器的 IP、localhost 和 127.0.0.1,但都没有工作。我还尝试在 mongo 配置文件中将端口 27017 绑定到 0.0.0.0 ,但这也不起作用。最后,我尝试在 docker run 命令中使用 --network="host" 选项,但没有帮助。这是我运行容器时遇到的错误:

MongoNetworkError:首次连接时无法连接到服务器 [127.0.0.1:27017] [错误:连接 ECONNREFUSED 127.0.0.1:27017

码头工人文件

FROM node
RUN mkdir -p /usr/src/rapidrecipes

COPY server.js /usr/src/rapidrecipes/server.js
COPY deploy-package.json /usr/src/rapidrecipes/package.json

WORKDIR /usr/src/rapidrecipes

RUN npm install

EXPOSE 80

EXPOSE 27017

EXPOSE 3000

CMD ["node", "server.js"]

运行命令

docker run -p 80:80 -p 27017:27017 -p 3000:3000 快速食谱

SERVER.JS 文件摘录

var express = require('express');
var cors = require('cors');
var path = require('path');
var bodyParser = require('body-parser');
var mongo = require('mongoose');
const uuid = require('uuid');

var db = mongo.connect("mongodb://127.0.0.1:27017/recipedb", function (err, response) {
  if (err) { console.log(err); }
  else { console.log('Connected to ' + db, ' + ', response) }
});

【问题讨论】:

  • 我认为您必须在 mongo connect URL 中添加您机器的实际 IP 而不是 127.0.0.1。
  • 我提到我已经尝试过了。
  • 尝试运行 docker ps 来检查容器是否真正启动并运行。
  • 是的,它正在运行
  • 嗯,你能从容器内部连接到MongoDB吗,使用nctelnet等?在容器内部, 127.0.0.1 / localhost 并不意味着您的主机系统。尝试使用运行 MongoDB 的 Docker 主机服务器的主机名,只是为了测试,因为这是错误的方法,你会得到它。

标签: mongodb docker express


【解决方案1】:

Docker 内置了“dns”支持,这意味着容器可以通过名称找到彼此,只要它们在同一个网络中!

创建网络: docker network create my-network

现在您需要将容器连接到此网络,运行容器时使用--network [network name] 标志。像这样:

docker run --network my-network --name recipes-mongo mongo

docker run -dp 80:80 -p 3000:3000 --network my-network --name recipes rapidrecipes

现在将应用中的连接字符串更改为mongo://recipes-mongo/

这里我没有把mongo数据库上的端口对外开放,因为不需要,但是如果你愿意,请添加-p 27017:27017标志。我也猜到了您的应用需要哪些端口,请自行验证!

注意:如果您在主机上本地运行数据库,您应该能够使用您的主机 ip,不是 0.0.0.0,而是在本地网络上分配的一个(例如 192.168 .xx) 使用命令ifconfigipconfig 找到它

【讨论】:

  • 我的 mongoDB 实例没有在容器中运行,它安装在我运行容器的同一台机器上。你是说我仍然必须运行这些命令吗?
  • 我的错,我编辑了我的答案,希望能解决您的问题。您应该可以使用主机的本地网络 ip!
猜你喜欢
  • 2022-01-07
  • 2019-05-24
  • 2021-09-16
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2019-06-26
  • 2021-10-25
相关资源
最近更新 更多