如何连接到同一网络中的Docker映像?

时间:2019-04-14 13:01:22

标签: node.js mongodb docker networking

我正在尝试将我的节点JS应用程序连接到我的mongoDB,而不使用ip地址。我已阅读的策略是,我必须将两个容器都放在同一网络中。

我的节点JS应用程序如下所示

var express = require('express');
var app = express();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var PORT = 4000;

// REQUIRE MIDDLEWARE
var instantMongoCrud = require('express-mongo-crud'); // require the module



mongoose.connect('localhost:27017/user');

var options = { //specify options
    host: `localhost:${PORT}`
}

//USE AS MIDDLEWARE
app.use(bodyParser.json()); // add body parser
app.use(instantMongoCrud(options)); // use as middleware

app.listen(PORT, ()=>{
    console.log('started');
})


我已经运行了数据库mongodb并将其附加到一个名为nodenetwork的网络中。

然后我按如下所示构建了docker应用程序:

docker build -t sampleapp:v1 . &&  docker run --net container:mongodb sampleapp:v1

该应用程序从控制台输出正确运行。但是,我无法通过浏览器访问它。

我了解这是因为我像以前一样在执行docker运行时必须公开端口4000。

但是,问题是当我尝试像这样运行时

docker build -t sampleapp:v1 . &&  docker run -p 4000:4000 --net container:mongodb sampleapp:v1

它抛出了我:docker:来自守护程序的错误响应:冲突的选项:端口发布和容器类型的网络模式。

如此,我的问题是如何修改此命令,这是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

您告诉您的应用程序mongodb在localhost上是可访问的,但不会,因为localhost将是应用程序容器,除非您使用--net=host和您的mongodb容器正在暴露27017端口或也在--net=host上运行。

您可以创建一个docker网络并将两个容器(mongodb和app)都连接到该网络。

示例:

$ docker network create mynetwork --driver bridge
$ docker run -d --name mongodb --net=mynetwork bitnami/mongodb:latest
$ docker run -d --name app -p 4000:4000 --net=mynetwork sampleapp:v1

这将为mongodb创建一个与容器名称相同的DNS记录,该名称可以从用户定义的网络中的任何容器中解析。

另一种解决方案是使用docker-compose:

version: '3'
services:
  mongodb:
    image: bitnami.mongodb:latest
  app:
    build: ./
    ports:
      - 4000:4000

将此文件放置在sampleapp的Dockerfile所在的目录下的名为docker-compose.yml的文件中,然后运行docker-compose up

由于docker-compose也创建了用户定义的网络,因此您可以使用容器DNS记录访问mongodb。

在任何情况下,请更改您的应用程序以使用docker提供的DNS进行连接:

mongoose.connect('mongodb:27017/user');

在此处详细了解docker-compose和用户定义的网络: https://docs.docker.com/compose/overview/

https://docs.docker.com/network/bridge/