2017-05-06 104 views
3

我有一個dockerized nodejs應用程序鏈接到一個mongo容器。這裏是dockerfile和泊塢窗,compose.yml:docker-compose NodeJS + Mongodb與貓鼬,動態獲取mongo容器ip

FROM node:boron 

# Create app directory 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

# Install app dependencies 
COPY package.json /usr/src/app/ 
RUN npm install 

# Bundle app source 
COPY . /usr/src/app 

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

version: "2" 
services: 
    web: 
    build: . 
    volumes: 
     - .:/usr/src/app 
    ports: 
     - "3000:3000" 
    links: 
     - mongo 
    mongo: 
    image: mongo 
    ports: 
     - "27017:27017" 

,這裏是我的app.js處理通過貓鼬工具蒙戈連接:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 


var index = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

//DB setup 
mongoose.connect('mongodb://172.19.0.2/test'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', index); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

我的應用程序啓動,如果我在我的計算機上登錄http://localhost:3000我的視圖顯示,並且在我的終端中,我看到mongo接受了連接。


問題是:

在我app.js我手動添加蒙戈容器IP。我相信如果我在github上推這個應用程序,並有人得到它。他的mongo容器IP將不會和我手動添加的相同。有沒有辦法讓所有這些動態化,以便我的應用程序自動獲取mongo容器ip

回答

7

在Docker Compose中檢出Networking部分。特別是這個有趣的段落:

每個容器現在可以查找主機名web或db,並取回適當容器的IP地址 。例如,web的應用程序 代碼可以連接到URL postgres:// db:5432並開始使用 Postgres數據庫。

所以給你的榜樣,您可以自由改變線

mongoose.connect('mongodb://172.19.0.2/test'); 

排隊該訣竅

mongoose.connect('mongodb://mongo/test'); 
+0

是;) –

+0

這樣一個簡單的變化,卻是一場噩夢,找出... +1官方文檔鏈接! –