我正在尝试将我的节点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:来自守护程序的错误响应:冲突的选项:端口发布和容器类型的网络模式。
如此,我的问题是如何修改此命令,这是最好的方法吗?
答案 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/