Публікація

Підключення до локально встановленого SQL Server з Docker контейнера

В останні десятиліття сфера інформаційних технологій пережила революцію у розгортанні та керуванні програмними додатками. Стартапи та корпорації, розробники та адміністратори, усі знайомі з проблемами, пов’язаними зі схоронністю, масштабованістю та надійністю роботи програмних додатків. Саме тут на сцену виходить Docker який став справжньою революцією у сфері контейнеризації. В даній статті я покажу як підключитися з Docker контейнера до локально встановленого MS SQL Server (на вашому ПК, а не в середині Docker контейнера).

Вступ


Для прикладу у мене є .net core застосунок який використовує SQL базу даних. Для роботи з БД я використовую EF core і для підключення до БД у мене є наступні налаштування:

1
2
3
"ConnectionStrings": {
  "DatabaseConnection": "Server=.\\SQLEXPRESS;Database=dotnetapp;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=False;"
}

Тут все просто, у нас є:

  1. Server=.\\SQLEXPRESS - вказується на екземпляр сервера або бази даних для підключення, у нашому випадку локальний екземпляр SQL Server Express.
  2. Database=dotnetapp - ім’я бази даних.
  3. Trusted_Connection=True - вказує на те, що для встановлення з’єднання слід використовувати автентифікацію Windows (також відому як Trusted_Connection). Якщо для параметра Trusted_Connection встановлено значення “True”, це означає, що облікові дані користувача, який наразі ввійшов у систему, використовуватимуться для автентифікації та підключення до бази даних.
  4. MultipleActiveResultSets=true - дає змогу одночасно виконувати кілька запитів на одному з’єднанні із БД.
  5. Encrypt=False - це означає, що зв’язок між програмою та SQL Server не буде зашифровано (використовувати слід тільки для локальної розробки).

Якщо запустити додаток все буде чудово працювати, але якщо розгорнути додаток в Docker контейнері ми отримаємо помилку, що не можемо підключитися до БД.

Налаштування TCP/IP протокол для SQL Server


Docker контейнер працює як окрема машина на вашому головному комп’ютері, значить, щоб підключитися до бази даних SQL на вашому хості, вам потрібно ввімкнути віддалене підключення до сервера SQL. Для цього потрібно відкрити SQL Server Configuration Manager, який розташований за наступною адресою C:\Windows\SysWOW64\SQLServerManager15.msc, відкрити SQL Server Network Configuration -> Protocols for SQLEXPRESS та ввімкнути TCP/IP протокол. Також потрібно переконатися, що TCP Port не порожній.

sql-tcp-ip

Після налаштування TCP/IP протоколу потрібно перезавантажити SQL Server сервіс. Для цього потрібно перейти на розділ SQL Server Services, вибрати SQL Server (SQLEXPRESS) та перезапустити його.

Також потрібно переконатися що SQL Server Browser служба запущена, якщо це не так то запустіть її. SQL Server Browser використовується в Microsoft SQL Server для надання інформації про розташування різних екземплярів SQL Server` у вашій мережі та спрощує процес з’єднання клієнтських програм з SQL Server, особливо в ситуаціях, коли ви маєте багато інстанцій SQL Server на одному сервері або в одній мережі.

sql-server-browser

В загальному це все що потрібно зробити для налаштування TCP/IP протокол, але щоб не виникало проблем, переконайтеся що віддалені підключення до вашого SQL Server ввімкнені. Відкрийте Microsoft SQL Server Management Studio, підключіться до сервера і після цього відкрийте його властивості.

sql-server-remote-connections

Зміна рядка підключення до БД


Щоб підключитися до локально встановленого SQL Server з Docker контейнера потрібно змінити шлях до сервера, в нашому випадку замість \\SQLEXPRESS ми повинні вказати адресу нашої хост машини. Для цього потрібно використовувати host.docker.internal - це спеціальна DNS-назва, яку надає Docker, щоб дозволити контейнеру підключатися до служб, що працюють на хост машині (ваш ПК в нашому випадку), а також потрібно вказати TCP/IP порт вашого SQL Server.

В результаті наш рядок підключення буде мати наступний вигляд:

1
2
3
"ConnectionStrings": {
  "DatabaseConnection": "Server=host.docker.internal,48475;Database=dotnetapp;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=False;"
}

Але все ж таки, якщо ви запустите додаток в Docker контейнері, він не буде працювати і ви піймаєте наступну помилку:

1
dotnetcore : Cannot access Kerberos ticket. Ensure Kerberos has been initialized with 'kinit'...

В чому ж тобі проблема? Проблема в тому, що ми використовуємо Trusted_Connection=True - який вказує що для встановлення з’єднання слід використовувати автентифікацію Windows. Docker контейнер не має доступу до інформації про автентифікацію Windows і відповідно не може підключити вас до БД.

Вам потрібно створити нове імя для підключення до SQL Server та надати доступ до dotnetapp, та замінити Trusted_Connection=True на User=<YOUR_ID>;Password=<YOUR_PWD>.

Фінальний рядок підключення повинен виглядати наступним чином:

1
2
3
"ConnectionStrings": {
  "DatabaseConnection": "Server=host.docker.internal,48475;Database=dotnetapp;User=Admin;Password=Pa$$w0rd;MultipleActiveResultSets=true;Encrypt=False;"
}

Ось тепер якщо ви запустите додаток в Docker контейнері все буде працювати і у вас буде доступ до SQL Server яки встановлений на вашому локальному ПК.

Висновок


В даній статті ми розглянули ефективний спосіб підключення до локально встановленого SQL Server сервера з Docker контейнера. За допомогою зразка рядка підключення, ми навчилися налаштовувати параметри для забезпечення успішного з’єднання, визначивши сервер, порт, ім’я користувача та пароль, а також ім’я бази даних.

Ця стаття розкрила ключові аспекти налаштування з’єднання з базою даних, використовуючи рядок підключення, і надала розуміння того, як здійснюється комунікація між Docker контейнером та SQL Server сервером. Дотримуючись цих інструкцій, ви зможете ефективно працювати з SQL Server у віртуальному середовищі контейнера для розробки та тестування вашого програмного забезпечення.

Публікація захищена ліцензією CC BY 4.0 .