Подключение к SQL Контейнеру Сервера из другого Контейнера по имени - PullRequest
0 голосов
/ 08 апреля 2020

Я только начинаю входить в Docker, и мне пока нравится мой прогресс. Но я озадачен следующей проблемой. Я пытаюсь запустить серверную базу данных SQL в одном контейнере, а мой веб-сервис. Net Framework 4.5 работает во втором контейнере. Если строка подключения в контейнере веб-службы использует IP-адрес контейнера db, подключение выполнено успешно. Если я пытаюсь использовать указанное имя хоста, выдается следующее исключение:

System.Data.Entity.Core.EntityException: базовый поставщик не удалось открыть.

System.Data.SqlClient.SqlException: ошибка сети, связанная с указанием экземпляра c, произошла при установлении соединения с SQL сервером. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Сервер настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL сервером)

System.ComponentModel.Win32Exception: сетевой путь не найден

I Я использую Docker для Windows Engine 19.03.8 на Windows 10 Enterprise и использую Windows Контейнеры. Вот команды и docker файлы, которые я использовал. Моё приложение для тестирования - это простое консольное приложение, которое использует Entity Framework 6 для вызова хранимой процедуры, которая возвращает данные из таблицы.

docker network create --driver nat mynat

Docker Файл для контейнера БД

FROM microsoft/mssql-server-windows-developer

ENV sa_password "Password123"
ENV attach_dbs "[]"

COPY . /

WORKDIR /

RUN powershell sqlcmd -S localhost,1433 -i CreateEMLDatabase.sql


RUN powershell set-itemproperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord 

CMD powershell ./start -sa_password Password123 -attach_dbs \"%attach_dbs%\" -Verbose -ACCEPT_EULA 'Y'

docker build --rm --no-cache --tag mailservicedb: последний.

docker run - net mynat --ip 172.30.157.42 -d --name maildbctr --hostname maildbctr mailservicedb: последний

Строка подключения для консоли тестера:

connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=maildbctr;initial catalog=EML;User Id=MyLogin;Password=MyPassword;MultipleActiveResultSets=True;App=EntityFramework""

Docker Файл для консоли тестера

FROM mcr.microsoft.com/windows/servercore:1903

WORKDIR /tester

COPY . .

#FIX DNS issues currently in Windows Containers
RUN powershell set-itemproperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord 

CMD ContainerDbTester.exe

docker build --rm --no-cache --tag dbtester: последний.

docker run -it - net mynat --ip 172.30.157.43 --name dbtestctr --hostname dbtestctr dbtester: последний cmd

Внутри контейнера Tester я могу пропинговать имя контейнера db:

ping maildbctr

Pinging maildbctr [fe80::11c5:f48c:92c1:7a36%4] with 32 bytes of data:
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time=1ms

Ping statistics for fe80::11c5:f48c:92c1:7a36%4:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms

Но когда Я запускаю консоль exe, я получаю исключение выше.

Любая помощь в выяснении того, какой шаг я пропускаю, очень ценится.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

У меня была похожая проблема. Моя установка была такой:

  • Порт 1433 отображения контейнера базы данных на порт хоста 31433;
  • Приложение A, работающее на хосте;
  • Приложение B в другом контейнере;

Приложение A смогло нормально подключиться к базе данных с помощью localhost,31433, а приложение B не смогло подключиться с помощью localhost.

После некоторых исследований я смог подключить приложение B в базу данных, используя host.docker.internal вместо localhost.

0 голосов
/ 09 апреля 2020

Я работал несколько раз с одинаковыми настройками (база данных + веб-платформа), и я использовал go для docker -компонентного подхода, обычно он более прост (по умолчанию создается сеть для каждой композиции). ) и позволил мне отслеживать различные конфигурации с течением времени. Документы D C даже представляют нам пример и как работает сеть:

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

В этом примере вы можете использовать «db» для ссылки на IP базы данных внутри вашей сети. применение.

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