节点和mongo之间的docker-compose连接

时间:2018-10-29 16:02:24

标签: node.js mongodb docker

我阅读了很多有关将应用程序与docker连接的示例,这似乎很简单

我有我的情况

version: '2'

services:

  mongodb:
    image: mongo
    container_name: infra-mongodb
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    ports:
      - 27017:27017
  service:
    build:
      context: .
    container_name: service
    restart: always
    ports:
      - 3012:3012
    depends_on:
      - mongodb
    links:
      - mongodb

我在节点中的连接是

const MongoClient = require('mongodb').MongoClient;
const mongoUrl = 'mongodb://admin:admin@mongodb:27017/admin?replicaSet=rs0&slaveOk=true'
MongoClient.connect(mongoUrl, { useNewUrlParser: true }, (err, client) => {
    console.log(err)
});

我遇到以下错误

{ MongoNetworkError: failed to connect to server [9d574801e4b4:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND 9d574801e4b4 9d574801e4b4:27017]
    at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:564:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:317:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:246:50)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

我不明白为什么主机成为9d574801e4b4

当我在容器中运行ping mongodb时一切正常

PING mongodb (172.21.0.3) 56(84) bytes of data.
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=4 ttl=64 time=0.216 ms
^C
--- mongodb ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3156ms
rtt min/avg/max/mdev = 0.088/0.126/0.216/0.053 ms

5 个答案:

答案 0 :(得分:0)

默认情况下,mongo仅在localhost上侦听。如果是用于本地开发,只需bind it to all interfaces

version: '2'

services:

  mongodb:
    image: mongo
    container_name: infra-mongodb
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    ports:
      - 27017:27017
    command: --bind_ip_all

答案 1 :(得分:0)

这里只是个猜测,但是Docker Compose中的docker-compose up字段仅表示“此容器必须等待另一个容器启动”。内部的服务不一定必须启动并运行。因此,您的应用程序启动速度可能太快。当您的应用尝试连接时,Mongo服务器可能尚未准备好接受连接。运行docker-compose restart service,等待其启动失败,然后运行> packrat::init() Initializing packrat project in directory: - "~/R/statistics"

如果此问题得以解决,那么在启动后无法连接的情况下,您可能希望使应用程序在某种超时后重试连接。

答案 2 :(得分:0)

检查一下:

docker-compose.yaml

version: '2' 

services:
  nodejs:
    container_name: nodejs
    image: nexus.XXXX.com:8000/${BE_BUILD}
    restart: always
    environment:
       - dbhost=mongo
    ports:
      - "8888:8888"
    links:
      - mongo
  mongo:
    container_name: mongo
    image: nexus.XXXX.com:8000/doc/docker/proj-mongodb:latest
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    ports:
      - "27017:27017"

我可以通过以下URL成功连接:

const mongoUrl = mongodb://admin:admin@mongo:27017/admin?authSource=admin


检查以下可以解决问题的事项:

  • 通过NodeJS配置设置dbHost名称。
  • 从NodeJS配置链接mongo容器。
  • 使用容器名称进行连接。
  • 检查authSource是否需要URL。

答案 3 :(得分:0)

只是发现这个问题,我不太了解它是如何工作的...

version: '2'

services:

  mongodb:
    image: mongo
    container_name: infra-mongodb
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    ports:
      - 27017:27017
    networks:
      service-network:
        aliases:
            - localhost
  service:
    build:
      context: .
    container_name: service
    restart: always
    ports:
      - 3012:3012
    depends_on:
      - mongodb
    links:
      - mongodb

networks:
  app-admin-network:
    driver: bridge

答案 4 :(得分:0)

但是看不到docker-compose up日志。今天也有类似的问题。 用我制作的一个小脚本解决了。 wait-for-mongo 在您的dockerfile文件中添加以下内容:

RUN npm install -g wait-for-mongodb-slim

## Launch the wait tool and then your application
CMD wait-for-mongo --uri $MONGO_URI --t 2.5 && npm start

其中–t是屏幕,直到再次检查为止。

并在撰写内容时将uri添加为环境变量:

environment:
   MONGO_URI: mongodb://usr:pw@containername:27017/dbname