无法通过Docker中的node.js连接到MongoDB

时间:2017-07-06 01:20:03

标签: node.js mongodb docker docker-compose dockerfile

我的node.js express app无法连接到Docker中的MongoDB。 我对Docker并不熟悉。

node.js连接:

import mongodb from 'mongodb';
...
mongodb.MongoClient.connect('mongodb://localhost:27017', ... );

Dockerfile:

FROM node:argon
RUN mkdir /app
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 3000
CMD ["npm", "start"]

搬运工-compose.yml

version: “2”
 services:
  web:
   build: .
   volumes:
     — ./:/app
   ports:
   — “3000:3000”
   links:
    — mongo
   mongo:
    image: mongo
    ports:
      — “27017:27017”

构建命令:docker build -t NAME .

运行命令:docker run -ti -p 3000:3000 NAME

连接错误:

[MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
  name: 'MongoError',
  message: 'failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]'

4 个答案:

答案 0 :(得分:10)

尝试:

mongodb.MongoClient.connect('mongodb://mongo:27017', ... );

更改您的docker-compose.yml

version: "2"

services:

  web:
    build: .
    volumes:
      - ./:/app
    ports:
      - "3000:3000"
    links:
      - mongo

  mongo:
    image: mongo
    ports:
      - "27017:27017"

并使用一些docker compose命令:

docker-compose down
docker-compose build
docker-compose up -d mongo
docker-compose up web

答案 1 :(得分:5)

试试这个。

  1. 使用链接的docker容器时,在这种情况下应使用容器的名称,例如,与mongodb的连接应为mongodb.MongoClient.connect('mongodb://mongo:27017', ... );而不是mongodb.MongoClient.connect('mongodb://localhost:27017', ... );。将其更改为mongo的原因是因为您在docker-compose.yml中使用了links属性mongo。这将导致web docker容器的/etc/hosts中的mongo主机名。参考linking-containers
  2. docker-compose.yml似乎缺少一个缩进。在mongo属性上应该与web相同。

    version: '2'
    services:
      web:
       build: .
       volumes: ['./:/app']
       ports: [ '3000:3000' ]
       links: [ mongo ]
      mongo:
       image: mongo
       ports: [ '27017:27017' ]
    
  3. 我使用我的Docker尝试了您的配置,我已完成更新docker-compose.yml然后我docker-compose build然后docker-compose upLogs of my local run

答案 2 :(得分:0)

我不确定您是否还有这个问题,但是datasources.json应该是:

"host": "mongo" 

而不是“ localhost”。

在我的日志中,我看到:

mongo    |  NETWORK  [listener] connection accepted from 172.22.0.3:47880 #1 (1 connection now open)

如您所见,docker compose会将mongo NAT NAT到另一个V-LAN。 IP地址172.22.0.0是守护程序用来路由docker-compose映像的内部IP地址。因此localhost现在不在游戏中。

至少对我有用。

datasources.json

"mongoDS": {
    "host": "mongo",
    "port": 27017,

...

答案 3 :(得分:0)

在我的情况下

是这样的:

只需从命令行链接到容器即可。 db是我的数据库容器

sudo docker run -it --link db:db1 --publish 4000-4006:4000-4006 --name backend backend:latest