我是码头工人的新手。我正在尝试创建一个 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?
在您的后端应用程序中,连接到
mongodb:27017
而不是 127.0.0.1:27017
。其中“mongodb”是 docker-compose.yml 中您的 service 的名称。
我最近遇到了类似的问题。我在 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
希望它对某人有帮助。
很可能是的。 127.0.0.1 指向 localhost inside mongodb 容器,因此无法从容器外部访问。绑定到 0.0.0.0 可能会起作用。
使用您在 docker-compose.yml 中指定的链接,您的后端容器应该能够通过
mongodb:27017
连接到 mongo 容器
您必须告诉容器使用它自己的 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 应用
尝试了一切,但在我使用 docker swarm 的情况下,问题是因为缺少
directConnection=true
,没有它我总是收到 docker swarm connect ECONNREFUSED 127.0.0.1:27017
,即最终连接命令是:
mongodb://mongo:27017/dbname?replicaSet=rs0&directConnection=true