如何将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的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Angular Nginx 容器连接到 Node API docker 容器
如何使用 NodeJs 连接到 docker compose 中的 postgres?