Docker mongo图像'Connection refused'来自其他容器

时间:2016-01-10 22:41:43

标签: node.js mongodb docker boot2docker

我是码头工人的新手。我正在尝试创建一个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?

4 个答案:

答案 0 :(得分:44)

在后端应用中,请连接到mongodb:27017而不是127.0.0.1:27017。其中'mongodb'是docker-compose.yml中容器的名称。

答案 1 :(得分:6)

我最近遇到过类似的问题。我在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 image时指定端口映射

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

希望它有所帮助。

答案 2 :(得分:5)

很有可能,是的。 127.0.0.1指向 内部 mongodb容器,因此无法从容器外部访问。绑定到0.0.0.0可能会有效。

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

连接到mongo容器

答案 3 :(得分:4)

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

例如,我们假设您使用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 via $ docker inspect $CONTAINER_HOSTNAME | grep IPAddress

如果您仍然无法理解,可以查看我的Docker NodeJS and MongoDB app