【问题标题】:Cannot connect to MongoDB via node.js in Docker无法通过 Docker 中的 node.js 连接到 MongoDB
【发布时间】:2020-08-12 17:37:59
【问题描述】:

我的 node.js express 应用程序无法连接到 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"]

docker-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]'

【问题讨论】:

  • 您是否更改了容器中 MongoDB 配置中的 bind_ip?如果不是,那么它只在 localhost 上监听该容器。
  • @NeilLunn 会是什么?
  • 顺便说一句,我没有设置任何 MongoDB 配置文件...@NeilLunn
  • 默认在/etc/mongod.conf。您需要绑定到0.0.0.0 才能监听“所有”外部接口。深入的“docker”配置也不是我的事,但你似乎正在使用更“传统”的“链接”模式。并且文档似乎建议 "Docker Networks" 作为在容器之间公开端口的首选方法
  • 对我来说它很简单:"docker run --network=host myapp:1.0", .. 我的应用连接到了错误的网络。

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


【解决方案1】:

试试:

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

【讨论】:

  • 没有工作:docker-compose up -d mongo ERROR: yaml.scanner.ScannerError: mapping values are not allowed here in "./docker-compose.yml", line 2, column 10
  • 我认为您需要更改 docker-compose。
  • 请看我的新答案。也许这可以帮助你。
  • 收到此错误:Recreating test_web_1 ... Recreating test_web_1 ... error ERROR: for test_web_1 no such image: sha256:2b0195350ef188fa3ca4fc41f3670fa1b7650ab0bd2cde74e5a0b6c95193c55b: No such image: sha256:2b0195350ef188fa3ca4fc41f3670fa1b7650ab0bd2cde74e5a0b6c95193c55b ERROR: for web no such image: sha256:2b0195350ef188fa3ca4fc41f3670fa1b7650ab0bd2cde74e5a0b6c95193c55b: No such image: sha256:2b0195350ef188fa3ca4fc41f3670fa1b7650ab0bd2cde74e5a0b6c95193c55b
  • 我尝试了这个,因为我在本地机器上连接到 mongo 时遇到错误,它工作得很好。想知道这个数据库在哪里?停止容器后数据是否持久?
【解决方案2】:

试试这个。

  1. 当使用链接的 docker 容器时,在这种情况下您应该使用容器的名称,例如您与 mongodb 的连接应该是 mongodb.MongoClient.connect('mongodb://mongo:27017', ... ); 而不是 mongodb.MongoClient.connect('mongodb://localhost:27017', ... );。将其更改为 mongo 的原因是因为您在 docker-compose.yml 中使用了 mongo 的 links 属性。这将导致 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

【讨论】:

  • 我更新了问题,是一样的,但mongo
  • 为什么还在连接localhost:27017?如果您已将连接从 node.js 更改为 mongodb,则应该是 mongo:27017。在您的 node.js 文件中,它应该是 mongodb.MongoClient.connect('mongodb://mongo:27017', ... );
  • @MarceloFilho 你刚刚跑了吗docker-compose up
  • 好的。如果添加了mongo的IP,可以签入web容器的/etc/hosts吗? docker ps 的输出是什么?
【解决方案3】:

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

"host": "mongo" 

而不是“本地主机”。

在我的日志中我看到:

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

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

至少,它对我有用。

datasources.json

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

...

【讨论】:

    【解决方案4】:

    在我的情况下是这样的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2017-06-11
      • 2018-04-02
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多