2017-02-25 48 views
1

我有基于loopback的restful API连接到mongodb。它工作正常。但是,当我将它放入码头集装箱时,它将无法连接。码头容器中的环回不能连接到mongo

DockerFile

# 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 [email protected] 
npm info using [email protected] 
npm info lifecycle [email protected]~prestart: [email protected] 
npm info lifecycle [email protected]~start: [email protected] 

> [email protected] 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) 

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

回答

2

检查什么是你在泊坞窗网IP(并确保MongoDB是侦听此IP) ifconfig 应该给你某事像:

docker0:标志= 4099 MTU 1500 INET 172.17。 0.1网络掩码255.255.0.0广播0.0.0.0

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

+0

谢谢你kisiel。我明白了。 – Shawn

+0

如果我不想在每次部署时都更改docker的mongo连接代码,该怎么办?我在没有docker的情况下进行开发和测试,因此每次需要发布代码时都会产生一个更改ip的问题。 **任何建议?** –

+0

@Shawn您是否设法解决此问题?我遇到同样的问题,但无法理解上述提供的解决方案。你能通过我的问题在这里[链接](https://stackoverflow.com/questions/47314547/docker-compose-with-loopback-and-mongodb-fail-to-connect-mongdb) – surajnew55

0

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

$搬运工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 

在回环的 “datasources.json”,正确的入口应该是:

“蒙戈”:{ “主人”:“MongoDB的“, ”port“:27017, ...

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

相关问题