2017-05-06 62 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官方文档链接! –