连接Nodejs和Mongo与Docker



这是我的docker-compose-file:

version: "2"
services:
  rest-api:
    build: .
    ports:
      - "3007:3007"
    links:
      - mongo
  mongo:
    image: mongo
    volumes:
      - /data/mongodb/db:/data/db
    ports:
      - "27017:27017"

这是我的dockerfile:

FROM mhart/alpine-node:latest
RUN rm -rf /tmp/node_modules
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
WORKDIR /opt/app
ADD . /opt/app
EXPOSE 3007
CMD ["node", "index.js"]

当我运行图像时,节点无法连接到mongo:

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

可能是什么问题?我该如何调试?

更新:

在我的节点应用中,我有:

let connection = mongoose.connect('mongodb://localhost/myapp');

节点试图在localhost上连接到Mongo,该节点失败了,因为它没有在与Node的同一容器中运行。相反,它在其他容器中运行,即在其他主机上。

您的应用程序中可能有这样的行:

var url = 'mongodb://localhost:27017/myproject';

它定义了mongoDB的位置。您需要将localhost更改为实际主机,在您的情况下是mongo

在您的节点应用中,您需要引用容器而不是本地主机。

在您的连接字符串中,mongo使用名称 mongo作为主机,您可能只是在分钟时使用默认值

https://docs.mongodb.com/manual/reference/connection-string/

,例如

mongodb://mongo:27017/

您需要这样做,因为Mongo数据库在单独的容器中(使用不同的IP地址(,它们通过TCP链接,因此LocalHost与容器节点相关。