来自其他容器的 Docker mongo 镜像“连接被拒绝”

问题描述 投票:0回答:6

我是码头工人的新手。我正在尝试创建一个 MongoDB 容器和一个 NodeJS 容器。我的文件看起来:

version: '2'
services:
  backend:
    image: node:5.11-onbuild
    ports:
     - "3001:3001"
    volumes:
     - .:/code
    working_dir: "/code"
    links:
     - mongodb
  mongodb:
    image: mongo:3.3
    expose:
     - 27017

它应该运行

npm install
,然后运行
node .
。 但是
docker-compose up
最终以
[MongoError: connect ECONNREFUSED 127.0.0.1:27017]
结束,而命令
node .
。 我认为这是因为文件中的
bind_ip = 127.0.0.1
/etc/mongod.conf
。这是正确的吗?

我在Win10系统上使用boot2docker。

如何解决这个问题,让节点可以连接到MongoDB?

node.js mongodb docker boot2docker
6个回答
100
投票

在您的后端应用程序中,连接到

mongodb:27017
而不是
127.0.0.1:27017
。其中“mongodb”是 docker-compose.yml 中您的 service 的名称。


16
投票

我最近遇到了类似的问题。我在 win 10 下运行 docker toolbox,这就是它对我的作用:

1)我必须验证我的默认 docker 机器正在使用哪个 URL。这可以通过运行

docker-machine ls
命令来检查。它将列出可用的机器:

NAME             ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
default          *        virtualbox   Running   tcp://192.168.99.100:1234           v17.06.0-ce
rancher-client   -        virtualbox   Stopped                                       Unknown
rancher-server   -        virtualbox   Stopped                                       Unknown

2)运行mongodb镜像时指定端口映射

docker run -d -it -p 27017:27017 mongo

3)此时有效的 mongo url 将如下所示

var dbhost = 'mongodb://192.168.99.100:27017/test

其中

192.168.99.100
是第 1) 点的默认计算机 URL

希望它对某人有帮助。


6
投票

很可能是的。 127.0.0.1 指向 localhost inside mongodb 容器,因此无法从容器外部访问。绑定到 0.0.0.0 可能会起作用。

使用您在 docker-compose.yml 中指定的链接,您的后端容器应该能够通过

mongodb:27017

连接到 mongo 容器

4
投票

您必须告诉容器使用它自己的 IP 地址而不是本地主机。

例如,假设您使用

expressjs
生成了脚手架代码,则必须写入
routes/index.js

var mongodb = require('mongodb');
router.get('/thelist', function(req, res){

  // Get a Mongo client to work with the Mongo server
  var MongoClient = mongodb.MongoClient;

  // Define where the MongoDB server is
  var url = 'mongodb://172.17.0.5:27017/dbname';

  // Connect to the server
  MongoClient.connect(url, function (err, db) {
  .........

其中

172.17.0.5
$CONTAINER_IP

您可以通过以下方式找到容器IP


$ docker inspect $CONTAINER_HOSTNAME | grep IPAddress

如果你还是看不懂,可以看一下我的Docker NodeJS 和 MongoDB 应用


0
投票

我变了

mongodb://admin:[email protected]:27017/admin

mongodb://admin:admin@mongo:27017/admin

并且有效

感谢您的回答https://stackoverflow.com/a/34711892/3841211


0
投票

尝试了一切,但在我使用 docker swarm 的情况下,问题是因为缺少

directConnection=true
,没有它我总是收到
docker swarm connect ECONNREFUSED 127.0.0.1:27017
,即最终连接命令是:

mongodb://mongo:27017/dbname?replicaSet=rs0&directConnection=true
© www.soinside.com 2019 - 2024. All rights reserved.