【问题标题】:loopback in docker container cannot connect to mongodocker容器中的环回无法连接到mongo
【发布时间】:2017-12-28 12:56:41
【问题描述】:

我有连接到 mongodb 的基于环回的 restful api。它工作正常。但是当我将它放入一个 docker 容器时,它不会连接。

Docker 文件

# Create image based on the official Node 6 image from the dockerhub
FROM node:6

# Create a directory where our app will be placed
RUN mkdir -p /opt/src/app

# Change directory so that our commands run inside this new directory
WORKDIR /opt/src/app

# Copy dependency definitions
COPY package.json /opt/src/app

# Install dependecies
RUN npm install

# Get all the code needed to run the app
COPY . /opt/src/app

# Expose the port the app runs in
EXPOSE 3000

# Serve the app
CMD ["npm", "start"]

.dockerignore

node_modules/

package.json

{
  "name": "my-api",
  "version": "1.0.0",
  "main": "server/server.js",
  "scripts": {
    "lint": "eslint .",
    "start": "node . -H 0.0.0.0",
    "posttest": "npm run lint && nsp check",
    "build:sdk": "./node_modules/.bin/lb-sdk server/server.js ../project-app/src/app/shared/sdk -l angular2 -d ng2web -i enabled"
  },
  "dependencies": {
    "compression": "^1.0.3",
    "cors": "^2.5.2",
    "helmet": "^1.3.0",
    "lodash": "^4.17.4",
    "loopback": "3.1.1",
    "loopback-boot": "^2.23.0",
    "loopback-component-explorer": "^4.0.0",
    "loopback-connector-mongodb": "^1.18.0",
    "serve-favicon": "^2.0.1",
    "strong-error-handler": "^1.0.1"
  },
  "devDependencies": {
    "@mean-expert/loopback-sdk-builder": "^2.1.0-rc.8.2",
    "eslint": "^2.13.1",
    "eslint-config-loopback": "^4.0.0",
    "nsp": "^2.1.0"
  },
  "repository": {
    "type": "",
    "url": ""
  },
  "license": "UNLICENSED",
  "description": "my-api"
}

构建到容器中

$ docker build -t my-api:dev . --no-cache=true

运行它

$ docker run -it --name my-api -p 3000:3000 my-api:dev

错误

npm info it worked if it ends with ok
npm info using npm@3.10.10
npm info using node@v6.10.0
npm info lifecycle my-api@1.0.0~prestart: my-api@1.0.0
npm info lifecycle my-api@1.0.0~start: my-api@1.0.0

> my-api@1.0.0 start /opt/src/app
> node . -H 0.0.0.0

Web server listening at: http://127.0.0.1:3000
Browse your REST API at http://127.0.0.1:3000/explorer
Connection fails: MongoError: failed to connect to server [localhost:27017] on first connect
It will be retried for the next request.

/opt/src/app/node_modules/mongodb/lib/mongo_client.js:336
          throw err
          ^
MongoError: failed to connect to server [localhost:27017] on first connect
    at Pool.<anonymous> (/opt/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35)
    at emitOne (events.js:96:13)
    at Pool.emit (events.js:188:7)
    at Connection.<anonymous> (/opt/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12)
    at Connection.g (events.js:291:16)
    at emitTwo (events.js:106:13)
    at Connection.emit (events.js:191:7)
    at Socket.<anonymous> (/opt/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49)
    at Socket.g (events.js:291:16)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at emitErrorNT (net.js:1278:8)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

我错过了什么以及如何解决?

【问题讨论】:

    标签: mongodb docker loopback


    【解决方案1】:

    如果您从 Dockerized 容器运行 MongoDB,则只需将您的“主机名”替换为 MongoDB 的“容器”名称。

    $ docker ps

    CONTAINER ID     IMAGE    COMMAND                  CREATED             STATUS              PORTS                            NAMES
    baf89457ec65     mongo    "docker-entrypoint..."   8 minutes ago       Up 9 minutes        0.0.0.0:32779->27017/tcp         mongodb
    

    在 Loopback 的“datasources.json”中,正确的条目应该是:

    “蒙哥”:{ “主机”:“mongodb”, “端口”:27017, ...

    您可以使用“docker-compose”将 Docker 与 Node.js 和 MongoDB 一起运行。按照说明here。

    【讨论】:

    • 你救了我的命。谢谢
    【解决方案2】:

    检查您在 docker 网络中的 ip 是什么(并确保 MongoDB 正在侦听此 ip) ifconfig 应该给你一些喜欢的东西:

    docker0: 标志=4099 mtu 1500 inet 172.17.0.1 网络掩码 255.255.0.0 广播 0.0.0.0

    我已将您应该在您的节点应用程序中使用的 IP 加粗。

    【讨论】:

    • 谢谢你,kisiel。我明白了。
    • 如果我不想在每次部署时更改 docker 的 mongo 连接代码怎么办。我在没有 docker 的情况下进行开发和测试,因此每次我需要发送代码时都会产生更改 ip 的问题。 有什么建议吗?
    • @Shawn 你解决了这个问题我有同样的问题,但无法理解上面提供的解决方案。你能在这里解决我的问题吗link
    猜你喜欢
    • 2018-08-11
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多