Подключиться к базе данных SQL Server из контейнера докеров

У меня есть докер для окон, установленных на моей машине. Существует консольное приложение, нацеленное на .net core 1.0.0, которое пытается получить доступ к базе данных SQL Server, работающей на другой виртуальной машине. Я могу выполнить ping виртуальную машину под управлением SQL Server с моей машины.

Когда я пытаюсь запустить консольное приложение с помощью dotnet run из командной строки на моей машине, он отлично работает. Но когда одно и то же приложение запускается внутри контейнера докера, я получаю сообщение

Произошла ошибка, связанная с сетью или конкретным экземпляром, в то время как установление соединения с SQL Server. Сервер не найден или был недоступен. Проверьте правильность имени экземпляра и SQL Server настроен для удаленного подключения. (поставщик: TCP Провайдер, ошибка: 40 - Не удалось открыть соединение с SQL Server)

Я попытался использовать

docker run --add-host sqldemo:<VM running sql server ip here>

но это не имело значения.

Ответ 1

Предположения

  • Microsoft SQL Server 2016
  • Обновление 10-летней версии Windows
  • Контейнеры Windows
  • Основное приложение ASP.NET

Добавьте пользователя SQL в базу данных SQL.

  • В MS SQL развернуть базу данных
  • Щелкните правой кнопкой мыши на "Безопасность/логины"
  • Выберите "Новый вход"
  • Создайте имя пользователя и пароль.
  • Назначить "Роль сервера"... Я использовал sysadmin, так как я просто тестирую
  • В разделе "Пользовательское сопоставление" я добавил своего нового пользователя в свою базу данных и использовал "dbo" для схемы.

Изменить аутентификацию SQL, чтобы разрешить режим проверки подлинности SQL Server

Щелкните правой кнопкой мыши на своей базе данных, выберите переключатель "Свойства/Безопасность/Аутентификация сервера /SQL Server и Режим проверки подлинности Windows". Перезапустите службу MS SQL.

Обновите свой appsettings.json новым именем пользователя и паролем

Пример "ConnectionStrings": { "DefaultConnection": "Server=YourServerName;Database=YourDatabaseName;MultipleActiveResultSets=true;User Id=UserNameYouJustAdded;Password=PassordYouJustCreated" },

Убедитесь, что вы удалите Trusted_Connection=True.

Создать файл Docker

Мой пример файла Docker

FROM microsoft/dotnet:nanoserver ARG source=. WORKDIR /app EXPOSE 5000 EXPOSE 1433 ENV ASPNETCORE_URLS http://+:5000 COPY $source .

Опубликовать приложение

Выполняется из того же места, что и файл Docker в повышенной PowerShell

dotnet publish

docker build bin\Debug\netcoreapp1.0\publish -t aspidserver

docker run -it aspidserver cmd

Я хотел запустить контейнер и посмотреть вывод, как он работал в PowerShell.

Как только контейнер был запущен и запущен в контейнере в командной строке, я отпустил приложение.

dotnet nameOfApplication.dll

Если все пойдет по плану, нужно запустить и запустить.

Ответ 2

Вы можете запустить контейнер докеров с сетевыми настройками, установленными на host. Такой контейнер будет совместно использовать сетевой стек с хостом докеров и с точки зрения контейнера, localhost (или 127.0.0.1) будет ссылаться на хост докера.

docker run --net=host ... 

Затем вы должны получить базу данных SQL Server из контейнера докеров, как и с вашего хоста.

Ответ 3

как в этом ответе

Строковое соединение экземпляра SQL Server в Linux Docker

По словам Саураб Сингха от Microsoft:

Поддержка имени экземпляра доступна в версии 1.1.Net Core. В версии 1.0.Net Core, имена экземпляров не поддерживаются на ОС, кроме Windows.

Поэтому я не думаю, что вы можете подключиться из .Net Core 1.0, работающего под Linux, к SQL Server с использованием имени экземпляра.

Ваш выбор выглядит следующим образом:

don't use instance name
wait for .Net Core 1.1 (planned for "Fall 2016")
use pre-release version of .Net Core 1.1