Я только начинаю входить в 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, я получаю исключение выше.
Любая помощь в выяснении того, какой шаг я пропускаю, очень ценится.