无法连接到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]”