Как подключиться к изображениям Docker в той же сети? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь подключить 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

приложение работает правильно с вывода консоли.Однако я не могу получить к нему доступ через свой браузер.

Я понимаю, что это потому, что я должен выставить порт 4000, когда я выполняю докер, как я делал раньше.

Однако проблема заключается в том, что когда я пытался работать таким образом, вместо этого

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

он выдает меня: docker: Ответ об ошибке от демона: конфликтующие опции: публикация порта и тип сети контейнераmode.

Как так, мой вопрос, как мне изменить эту команду и это лучший способ?

1 Ответ

0 голосов
/ 15 апреля 2019

Вы говорите своему приложению, что 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

Это создаст запись DNS для mongodb с тем же именем контейнера, которая будет разрешаться из любого контейнера в вашей пользовательской сети.

Другим решением будет использование docker-compose:

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

Поместите это в файл с именем docker-compose.yml в том же каталоге, где находится Dockerfile для sampleapp, и запустите docker-compose up

Поскольку docker-compose также создает пользовательскую сеть, вы можете получить доступ к mongodb с помощью записи DNS контейнера.

В любом случае измените приложение для подключения с использованием DNS, предоставленного Docker:

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

Подробнее о docker-compose и пользовательских сетях здесь: https://docs.docker.com/compose/overview/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...