Подключиться к базе данных 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