Контейнер: сбой доступа к БД в пределах одной виртуальной машины - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь подключить свое приложение к базе данных Sql Server Express, обе из которых находятся в контейнерах.

Когда я запускаю свой контейнер приложений в отдельной виртуальной машине с БД, он подключается, и все хорошо. Однако, если контейнер приложения работает на той же виртуальной машине, что и контейнер БД, он не может подключиться.

Я попытался установить сетевой режим для хоста, но все равно ничего.

Я получил очень простую настройку как часть моих рук в обучении. Схема настройки ниже.

Модель A: Vm to VM - Соединение работает

Model A - VM to VM

Модель B: Внутренняя виртуальная машина - не удается подключиться, поэтому приложение не работает

enter image description here

Я немного читал в Docker (запустил простую настройку Docker), чтобы попытаться выяснить проблему, но пока не повезло.

Я также использовал docker-compose, чтобы попытаться помочь безуспешно.

Редактировать 1: Используемые команды.

SQL Server: согласно инструкциям концентратора докеров

docker run --restart always -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=RANDOMPASS01!' -e 'MSSQL_PID=Express' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu 

AppA

Это само по себе прекрасно работает в модели A

docker run -p 5000:80 -d appa:0.1

Я тоже пробовал

docker run -p 5000:80 --network host -d appa:01

1 Ответ

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

Я вижу, что вы делаете это (запуск контейнера приложения с net = host) должен работать без проблем, если вы используете localhost для подключения к БД.

Если это только для тестирования на вашем локальном компьютере, я бы предложил запустить оба контейнера в их собственной сети докеров и получить доступ к базе данных по имени контейнера, вы можете сделать это вручную или использовать docker-compose для этого.

Пример с docker-compose:

version: '3'
services:
  db:
    image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu
    ports:
      - 1433:1433
    environment:
      - MSSQL_PID=Express
      - SA_PASSWORD=RANDOMPASS01!
      - ACCEPT_EULA=Y
    restart: always
  app:
    # You can use this to tell docker-compose to build the image of you app
    # or use a prebuilt image like the db service is using
    image: appa:0.1
    ports:
      - 5000:80

Поместите это в файл с именем docker-compose.yml и начните с:

docker-compose up

Это создаст два контейнера в одной сети, а также предоставит вам запись DNS для каждого контейнера с именем предоставленной службы в файле docker-compose, поэтому вместо использования IP или localhost вы используете "БД" или "приложение".

Дополнительная информация для docker-compose: https://docs.docker.com/compose/overview/

Ручной способ:

docker network create mynetwork

Запустить контейнеры в сети:

docker run -p 5000:80 -d --net=mynetwork --name app appa:0.1
docker run --restart always -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=RANDOMPASS01!' -e 'MSSQL_PID=Express' -p 1433:1433 --net=mynetwork --name db -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Точно так же, как с помощью docker-compose, вы можете получить доступ к базе данных, используя запись db "db", которую docker создает на основе имени контейнера.

Вышеупомянутые записи DNS разрешаются только в контейнерах.

Дополнительная информация о пользовательских сетях: https://docs.docker.com/network/bridge/

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