【问题标题】:cant connect node docker container to mongo docker container无法将节点 docker 容器连接到 mongodb docker 容器
【发布时间】:2018-11-14 06:24:17
【问题描述】:

我收到此错误:

Server running...
{ MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: getaddrinfo EAI_AGAIN mongo mongo:27017]
    at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:562:11)
    at Pool.emit (events.js:182:13)
    at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:316:12)
    at Object.onceWrapper (events.js:273:13)
    at Connection.emit (events.js:182:13)
    at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)
    at Object.onceWrapper (events.js:273:13)
    at Socket.emit (events.js:182:13)
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  name: 'MongoNetworkError',
  message:
   'failed to connect to server [mongo:27017] on first connect [MongoNetworkError: getaddrinfo EAI_AGAIN mongo mongo:27017]',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

这是我的 docker-compose.yml

version: '3'
services:
  app:
    container_name: docker-node-mongo
    restart: always
    build: .
    ports:
      - '3001:3000'

这就是我尝试从节点脚本连接的方式:

mongoose
  .connect(
    'mongodb://127.0.0.1:27017/test2',
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log("errorErrorError"));

这是 docker container ls -a 的输出

6f14a98e2d51        dockernodemongo_app       "npm start"              11 minutes ago      Up 11 minutes           0.0.0.0:3001->3000/tcp                     docker-node-mongo
f3fb55dad886        mongo                     "docker-entrypoint.s…"   24 minutes ago      Up 24 minutes           127.0.0.1:27017->27017/tcp                 mongo

这就是我从另一个 docker-compose.yml 文件运行 mongo 的方式:

    mongo:
        restart: always
        image: mongo
        container_name: mongo
        network_mode: "bridge"
#        expose:
#           - 27017
        volumes:
            - ./mongo_data:/data/db
        ports:
            - "127.0.0.1:27017:27017"

【问题讨论】:

    标签: javascript node.js mongodb docker networking


    【解决方案1】:

    您不能以这种方式将您的应用程序连接到 mongo。 127.0.0.1 指的是容器的本地主机,而不是主机。你有两个选择:

    • 创建一个network 并将两个容器添加到其中。然后使用mongodb://mongo:27017/test2 到达mongo 容器。 Docker 将使用服务名称作为主机,因此您可以通过该名称访问它。

    • 绑定 mongo 到 0.0.0.0(省略端口声明中的 127.0.0.1),并使用网桥 ip 地址连接到数据库。

    考虑第一个选项,因为如果您没有安装防火墙,第二个选项会将您的 mongo 数据库暴露给互联网。

    例如:

    version: '3.5'
    services:
      app:
        container_name: docker-node-mongo
        restart: always
        build: .
        ports:
          - '3001:3000'
        networks:
          - mongo
    
    networks:
      mongo:
        external: true
    

    然后在你的 mongo 撰写文件:

    version: '3.5'
    services:
      mongo:
        restart: always
        image: mongo
        container_name: mongo
        expose:
          - 27017
        volumes:
          - ./mongo_data:/data/db
        ports:
          - "127.0.0.1:27017:27017"
        networks:
          - mongo
    
    networks:
      mongo:
        name: mongo
    

    然后在你的代码上:

    mongoose
      .connect(
        'mongodb://mongo:27017/test2',
        { useNewUrlParser: true }
      )
      .then(() => console.log('MongoDB Connected'))
      .catch(err => console.log("errorErrorError"));
    

    编辑:更新的网络名称

    【讨论】:

    • 问题是我运行了需要 mongo 的 sharelatex,我也想运行需要 mongo 的节点。所以你会建议运行 2 个 mongo 实例?
    • @KTWorks,为什么有问题?您既可以在主机上发布一个端口,也可以创建一个网络,以便其他容器可以连接到该服务。
    • 好的。你说这是在主机上发布端口的安全问题? “你们都可以在主机上发布一个端口”是什么意思? 2个mongo实例?
    • 我的意思是使用 27017:27017 将绑定到主机上的 0.0.0.0,如果您没有配置防火墙,任何人都可以从互联网连接到 mongo,这就是为什么我没有建议走那条路。我会用一个更完整的例子来更新我的 andwer。
    • 手工是什么意思?自己的 docker compose 文件?
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2019-04-24
    • 2020-02-29
    • 2016-03-02
    • 2022-01-11
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多