首页 > 解决方案 > 在 Docker 容器中运行应用程序时无法连接到本地 MongoDB 实例

问题描述

我在本地机器上将 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) }
});

标签: mongodbdockerexpress

解决方案


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:27017flag。我还猜到了您的应用程序需要哪些端口,请自行验证!

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


推荐阅读