如何将nodeJS docker容器连接到mongoDB

Posted

技术标签:

【中文标题】如何将nodeJS docker容器连接到mongoDB【英文标题】:How to connect nodeJS docker container to 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

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

【问题讨论】:

【参考方案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】:

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

连接容器的三种方式

    小题大做一下低级dockernetwork magic 通过 localhost 连接容器。每个容器都必须在 localhost 上公开端口(作为您的 mongo_live)。但是你需要添加到 localhost 127.0.0.1 mongo_live 上的主机文件(这是最简单的方法) 使用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

以上是关于如何将nodeJS docker容器连接到mongoDB的主要内容,如果未能解决你的问题,请参考以下文章

将NodeJS容器连接到MySQL数据库

如何从 Angular Nginx 容器连接到 Node API docker 容器

如何使用 NodeJs 连接到 docker compose 中的 postgres?

如何将两个NodeJS docker容器连接在一起?

从 ECS 集群中的 docker nodejs EC2 容器连接到 Redis Elasticache 集群

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?