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

Posted

技术标签:

【中文标题】来自其他容器的 Docker mongo 图像“连接被拒绝”【英文标题】:Docker mongo image 'Connection refused' from other container 【发布时间】:2016-04-15 04:16:22 【问题描述】:

我是 docker 新手。我正在尝试创建一个 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 .。 我认为这是因为文件/etc/mongod.conf 中的bind_ip = 127.0.0.1。是这样吗?

我在 Win10 系统上使用 boot2docker。

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

【问题讨论】:

问题中的死链接,请考虑修复 plz @StepanYakovenko 谢谢。修好了。 这将对您有所帮助:use docker stack 【参考方案1】:

在您的后端应用程序中,连接到 mongodb:27017 而不是 127.0.0.1:27017。其中 'mongodb' 是您在 docker-compose.yml 中的 服务 的名称。

【讨论】:

嗯,我明白了。我们使用 docker 容器内的链接名称代替 IP。谢谢! 为有问题的其他人澄清。在您的节点应用程序中:mongoose.connect('mongodb://db:27017/whatever'); 其中 'db' 是 docker-compose.yml 中容器的名称 - 即 depends_on: - db db: image: mongodb @colby jax 正如你所提到的,我正在使用 mongoose.connect()。但是当我使用 docker-compose up 时出现错误 这给了我 ENOTFOUND mongodb mongodb:27017 @a_m_dev 它应该是 docker compose 服务名称。我修正了我的答案【参考方案2】:

我最近遇到了类似的问题。我在 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)

希望对某人有所帮助。

【讨论】:

我没有可用的docker-machine 命令,但我设法使用docker inspect mongo 检查了我的mongo 映像的地址,其中mongo 是实例的名称 @Marcin 当我尝试使用我的 localdb 运行该应用程序时,我构建了一个图像(示例 nodejs 应用程序)。我收到了错误。我按照您的步骤进行操作.. docker run -d -it -p 27017:27017 mongo 这是为了运行 mongodb 我现在通过 docker run -d it -p 8088:8088 nitikishu/samplenodejs 运行 nodejs 应用程序想将 mongodb 与我的应用程序连接我应该运行什么命令在我的 docker ip 地址 192.168.99.100:8088 我的应用程序正在运行但 mongodb 在 localhost:27017 中无法运行,此消息正在显示。 并且您似乎正试图在本机驱动程序端口上通过 HTTP 访问 MongoDB。现在我该怎么办?使用哪个主机和命令将mongodb与应用程序连接 @Marcin var dbhost = 'mongodb://192.168.99.100:27017/test 会连接数据库吗? 我能够使用docker inspect mongo-container 命令找到我的mongo docker 的IPAddress,并且使用IPAddress 它可以工作,但是node.js 代码需要有一些动态名称,而不是一些硬编码的IP。那么应该使用什么呢?我试过mongo-container-name,没用【参考方案3】:

你必须告诉容器使用它自己的 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 $ docker inspect $CONTAINER_HOSTNAME | grep IPAddress

如果还是看不懂可以看我的Docker NodeJS and MongoDB app

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于来自其他容器的 Docker mongo 图像“连接被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 和连接到 Mongo 容器

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码

无法使用 mongo 连接到 docker 容器

从主机连接到 mongo docker 容器

无法使用mongo连接到docker容器

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?