【问题标题】:How to connect nodeJS docker container to mongoDB如何将nodeJS docker容器连接到mongoDB
【发布时间】:2017-10-13 04:57:49
【问题描述】:

我无法将作为 docker 容器运行的 nodeJS 应用程序连接到 mongoDB。让我解释一下我到目前为止所做的事情:

$ docker ps

CONTAINER ID    IMAGE        COMMAND                  CREATED        STATUS        PORTS        NAMES
3a3732cc1d90    mongo:3.4    "docker-entrypoint..."   3 weeks ago    Up 3 weeks    27017/tcp    mongo_live

如您所见,已经有一个 mongo docker 容器在运行。

现在我正在运行我的 nodeJS 应用程序 docker 容器(它是从 meteorJS 构建的):

$ docker run -it 0b422defbd59 /bin/bash

在这个 docker 容器中,我想通过运行来运行应用程序:

$ node main.js

现在我得到了错误

Error: MONGO_URL must be set in environment

我已经尝试通过设置来设置 MONGO_URL:

ENV MONGO_URL mongodb://mongo_live:27017/

但这不起作用:

MongoError: failed to connect to server [mongo_live:27017] on first connect

所以我的问题是如何连接到数据库,据我所知,数据库在运行容器的“外部”。或者我如何为这个容器设置一个新的数据库?

【问题讨论】:

    标签: node.js mongodb docker


    【解决方案1】:

    有几种方法可以做到这一点。

    • 在与 mongodb 相同的网络中运行您的应用:

      docker run --net container:mongo_live your_app_docker_image
      
      # then you can use mongodb in your localhost
      $ ENV MONGO_URL mongodb://localhost:27017/
      
    • 您还可以链接两个容器:

      docker run --link mongo_live:mongo_live you_app_image ..
      # Now mongodb is accessible via mongo_live
      
    • 使用mongodb容器ip地址:

      docker inspect -f '{{.NetworkSettings.IPAddress}}' mongo_live
      # you will get you container ip here
      
      $ docker run -it 0b422defbd59 /bin/bash
      # ENV MONGO_URL mongodb://[ip from previous command]:27017/
      
    • 您可以将 mongodb 端口绑定到您的主机,并在您的应用中使用主机的主机名

    • 您可以使用docker network 并在同一网络中运行这两个应用程序

    • 您可以将--add-host mongo_live:<ip of mongo container> 传递给您的应用程序的docker run,然后将mongo_live 用于mongodb url

    • 您也可以使用docker compose 让您的生活更轻松;)

    ...

    【讨论】:

    • 我正在使用 docker compose,但不适用于这种情况。让我解释一下:这是 CI 工作流程的一部分。因此,我正在使用 dockerfile 运行 docker build:docker build -t $CI_REGISTRY_IMAGE:test -f Dockerfile.test .。所以我不知道如何在这个设置中使用 docker compose...
    • Docker compose 也可以构建镜像,你也可以用 compose 调用 run,这可能有助于运行测试。还有--abort-on-container-exit 选项对于在 CI 中运行测试也很有用。例如:github.com/mobilityhouse/prometheus-bridge/blob/master/…
    • 我已经在下面发布了一个 docker-compose 解决方案,我相信你可以将其作为参考并弄清楚
    【解决方案2】:

    当您运行容器时,每个容器都在独立的网络中工作。因为一个容器不能点对点连接到另一个容器。

    连接容器的三种方式

    1. 小题大做一下低级dockernetwork magic
    2. 通过 localhost 连接容器。每个容器都必须在 localhost 上公开端口(作为您的 mongo_live)。但是你需要添加到 localhost 127.0.0.1 mongo_live 上的主机文件(这是最简单的方法
    3. 使用docker-compose。它是用于将多个容器一起工作的便捷工具。 (这是正确的方式

    将 mongodb 添加到应用程序容器不是 docker 方式。

    【讨论】:

      【解决方案3】:

      请使用下面的 sn-p 作为您的 docker-compose.yml 文件,将 cmets 替换为您的实际值。应该能解决你的问题。

      version: '2'
          services:
            db:
              build: <image for mongoDB>
              ports:
                - "27017:27017"  # whatever port u r using
              environment:
                #you can specify mondo db username and stuff here
              volumes:
                - #load default config for mondodb from here
                - "db-data-store:/data/db" # path depends on which image you use
              networks:
                - network
           nodejs:
              build: #image for node js
              expose:
                - # mention port for nodejs
              volumes:
                - #mount project code on container
              networks:
                - network
              depends_on:
                - db
      
      networks:
        network:
          driver: bridge
      

      请使用以下链接作为参考:
      1) NodeJs Docker
      2) MongoDb docker
      3)docker-compose tutorial

      祝你好运

      【讨论】:

        【解决方案4】:

        我在如何将 server.js 连接到 mongodb 时遇到问题。这就是我解决它的方法,希望你觉得它有用。 Tap For My Screenshot

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
        猜你喜欢
        • 2019-01-12
        • 2017-11-10
        • 2019-04-14
        • 2016-06-13
        • 2019-02-16
        • 2022-11-11
        • 2019-05-24
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多