无法连接到docker mongodb

Posted

技术标签:

【中文标题】无法连接到docker mongodb【英文标题】:Cant connect to docker mongodb 【发布时间】:2017-06-11 05:48:59 【问题描述】:

我没有经常使用 docker 和 node,所以我希望这是一个简单的错误。我正在使用 docker compose。如果我通过浏览器访问, http://localhost:27017/我得到一个:

您似乎正试图在本机上通过 HTTP 访问 MongoDB 驱动程序端口。

还有日志表明我的 mongodb 是健康的。我猜是我尝试通过浏览器访问时的最后一行。

2017-01-25T21:11:13.509+0000 I JOURNAL [initandlisten] 期刊 dir=/data/db/journal 2017-01-25T21:11:13.509+0000 I JOURNAL [initandlisten] 恢复:不存在日志文件,不需要恢复 2017-01-25T21:11:13.546+0000 I JOURNAL [耐久性] 耐久性线程 开始于 2017-01-25T21:11:13.547+0000 I JOURNAL [期刊作家] 日记作者线程开始于 2017-01-25T21:11:13.568+0000 I CONTROL [initandlisten] MongoDB 启动:pid=1 端口=27017 dbpath=/data/db 64 位主机=150c248f4cc7 2017-01-25T21:11:13.568+0000 I 控制 [initandlisten] 数据库版本 v3.0.2 2017-01-25T21:11:13.568+0000 我 控制 [initandlisten] git 版本: 6201872043ecbbc0a4cc169b5482dcf385fc464f 2017-01-25T21:11:13.569+0000 我控制 [initandlisten] OpenSSL 版本:OpenSSL 1.0.1e 2013 年 2 月 11 日 2017-01-25T21:11:13.569+0000 我控制 [initandlisten] 构建信息: Linux ip-10-171-120-232 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49 2017-01-25T21:11:13.569+0000 我控制 [initandlisten] 分配器:tcmalloc 2017-01-25T21:11:13.569+0000 I 控制 [initandlisten] 选项: 2017-01-25T21:11:13.573+0000 I NETWORK [initandlisten] 等待端口 27017 上的连接 2017-01-25T21:11:17.843+0000 I NETWORK [initandlisten] 连接 从 172.20.0.1:44148 #1 接受(现在打开 1 个连接) 2017-01-25T21:11:17.843+0000 I NETWORK [initandlisten] 连接 从 172.20.0.1:44146 #2 接受(现在打开 2 个连接) 2017-01-25T21:11:17.853+0000 I NETWORK [conn2] 结束连接 172.20.0.1:44146(现在打开 1 个连接)2017-01-25T21:11:17.998+0000 I NETWORK [conn1] 结束连接 172.20.0.1:44148(现在打开 0 个连接 打开)

所以看起来我的 mongodb 正在运行。当我在我的节点应用程序中尝试访问它时,我得到了。

MongoError: 首先连接到服务器 [localhost:27017] 失败 连接 在游泳池。 (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35) 在 emitOne (events.js:96:13) 在 Pool.emit (events.js:188:7) 在连接处。 (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12) 在 Object.onceWrapper (events.js:290:19) 在 emitTwo (events.js:106:13) 在 Connection.emit (events.js:191:7) 在套接字。 (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49) 在 Object.onceWrapper (events.js:290:19) 在 emitOne (events.js:96:13) name: 'MongoError', message: 'failed to connect to server [localhost:27017] on first connect'

我的代码试图访问 mongodb

const express = require('express');
const gh = require('./src/fetch');
const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017/myApp';

// Constants
const PORT = 8888;

// App
const app = express();

app.get('/', function (req, res) 
    MongoClient.connect(url, function (err, db) 
        if (err) 
            console.log(err);
         else 
            console.log("Connected correctly to server");
            db.close();
        

    );
    res.send('Hello world\n');
);

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

我的 docker-compose 看起来像这样。

version: '2'
services:
  web:
    image: gh-api
    ports:
      - "8888:8888"
    environment:
      - KEY=abc
    restart: always
    links:
      - mongoDB
    depends_on:
          - mongoDB
  mongoDB:
      image: mongo:3.0.2
      ports:
        - "27017:27017"

用于 gh-api 的 Dockerfile

FROM node:7.4-onbuild

EXPOSE 8888

【问题讨论】:

【参考方案1】:

在我的情况下,一切都正确设置,就像在这个问题中回答的那样,但是我得到了由“启动竞赛”引起的这个错误,基本上我的 Node 应用程序会在 mongo 映像之前启动,因此它会在它启动之前尝试连接到 mongo 并且跑步。所以我改变了我的连接代码,用这样的东西重试:

init().then((mongo) => main( mongo )).catch(e => init())

function init()
  return MongoClient.connect(mongoConnectionURL)


function main( mongo )
  const server = express()
  server.listen(port, host);

我坚持,这应该使用 compose 文件中的depends_on 属性来解决,但据我了解,depends_on 只确保启动其他服务,并不能确保它们以正确的顺序初始化.

【讨论】:

【参考方案2】:

您能否将 url 更改为您的 mongodb:

const url = 'mongodb://localhost:27017/myApp';

const url = 'mongodb://mongoDB/myApp';

我在my demo blog application 上遇到了类似的问题,并且该更改应用程序开始工作。

编辑

我能找到的最好的解释是explanation of docker-compose links。

链接服务的容器可以通过主机名访问 与别名相同,如果未指定别名,则与服务名称相同。

因此,为了从web 容器访问mongoDB 容器,您应该使用mongoDB 作为web 容器中的主机名。

【讨论】:

【参考方案3】:

您似乎正试图在本机驱动程序端口上通过 HTTP 访问 MongoDB。

该端口将由 mongo 驱动程序使用。如果您真的想要/需要访问其余接口,您必须使用端口 28017 并使用 --rest 标志启动 mongo。一个例子:

$ docker run --rm -p 28017:28017 mongo mongod --rest

要从另一个容器访问容器,使用 docker compose 使用服务名称,正如 Ivan 所指出的那样。

【讨论】:

谢谢。我不想使用那个端口。只是看看事情是否正常进行。

以上是关于无法连接到docker mongodb的主要内容,如果未能解决你的问题,请参考以下文章

Dockerizing NestJS APP 和 MongoDB “首次连接时无法连接到服务器 [localhost:27017]”

Springboot 应用程序无法使用 docker-compose 连接到 MongoDB 容器

无法连接到 Docker 容器内的 MongoDB

无法连接到docker mongodb

无法从另一个容器连接到 mongodb docker 容器

Docker compose api无法连接到主机MongoDB数据库