使用 docker-compose 将 NodeJS-App 连接到 MongoDB

Posted

技术标签:

【中文标题】使用 docker-compose 将 NodeJS-App 连接到 MongoDB【英文标题】:Connect NodeJS-App to MongoDB using docker-compose 【发布时间】:2018-10-30 09:05:23 【问题描述】:

我有什么

我尝试将我的 nodejs 应用程序连接到 mongoDB-Container。 我是在 Mediums-Tutorial 打开的情况下执行此操作的,所以我的 dockerfiles 看起来像这样:

Dockerfile

FROM node:carbon
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install 
COPY . . 

EXPOSE 8085
CMD ["npm","start"]

docker-compose.yml

version: "2"
services: 
  metis:
    build: .
    ports:
      - "8085:8085"
    links:
      - mongo

  mongo:
      image: mongo
      volumes:
        - /data/mongodb/db:/data/db
      ports:
        - "27017:27017"

但是当我尝试连接到数据库时,我收到了

name    "MongoNetworkError"
message "failed to connect to server [localhost:27017] on first connect         [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]"

我的应用看起来像这样:

let mongodb = require('mongodb').MongoClient
const url = 'mongodb://localhost:27017'
const dbName = 'metis'

mongodb.connect(url, (err, client) => 
        if (err) reject(err)
        else 
            const db = client.db(dbName)

            db.collection(type + ":" + entity).insertOne(document, (error, result) => 
                if (error) reject(error)
                else  resolve(result) 
            )

            client.close()
        
    )
)

当我只是自己启动节点应用程序和 mongodb-server 时,它可以正常工作。 ut 在 Docker 中编写时,我无法获得连接。我不知道为什么。如果您有任何问题,请随时提出。

使用 docker 本身构建 docker-image 也可以,但与任何外部 mongodb 没有连接。

我的问题是:

我应该如何在 Docker 中连接 MongoDB-Container 和我的应用程序?

【问题讨论】:

【参考方案1】:

不要使用localhost,而是使用给予mongo服务的服务名称mongo

const url = 'mongodb://mongo:27017'

还要检查你是否真的需要在主机上公开 mongo 端口。

【讨论】:

供参考:“默认情况下,Compose 为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问,并且它们可以在主机名与容器名称相同。” (docs.docker.com/compose/networking) 谢谢,确实是这个问题!

以上是关于使用 docker-compose 将 NodeJS-App 连接到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

如何使用NodeJ从Postgres返回INSERT命令中的所有数据

NodeJ中的密码术(SHA-1?)

“nvm ls”不显示任何已安装的 NodeJ

本地 CSS 或 JS 的 MIME 类型错误阻止在使用 NodeJ 时加载自定义样式

nodeJSwebstorm中设置nodej智能提示

markdown Nodej上没有缓存标头