Не удается связаться с размещенным в Docker SQL-сервером из док-станции веб-приложения на том же хосте - PullRequest
0 голосов
/ 25 февраля 2019

На той же виртуальной машине (удаленной, Ubuntu) у меня есть

  • SQL Server , работающий в Docker
  • .NETБазовое приложение 2.2 (IdentityServer), запущенное в докере
  • Экземпляр jwilder.nginx-proxy , служащий в качестве обратного прокси-сервера для каждого веб-приложения наустройство
  • Множество других приложений .NET Core

Я могу подключиться ко всем своим веб-сайтам, используя IP-адрес компьютера и имя домена, что означает обратный прокси-серверработает, как и ожидалось, и докеры хорошо настроены

Я могу подключиться к SQL Server , используя SSMS с моей локальной машины, что означает, что SQL ServerДокер правильно перенаправляет TCP-соединение через порт 1433

. Веб-приложение IdentityServer .NET Core 2 может подключаться к SQL Server при запуске на моей локальной машине .

Приложение IdentityServer удаленного докераИон не может получить доступ к экземпляру SQL Server со следующей ошибкой (сокращено для ясности - удалена трассировка стека)

System.Data.SqlClient.SqlException (0x80131904):

Связанный с сетью или экземплярошибка при установлении соединения с SQL Server.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений.

(поставщик: TCP Provider, error: 40 - не удалось открыть соединение с SQL Server) на [...]

Я знаю, что сервер SQL работает и доступен из Интернетаи я знаю, что код приложения не виноват, потому что я протестировал оба.

Так что я понял, что это должен быть докер IdentityServer, который блокировал соединение.Поэтому я попытался:

  • Используя команду --expose 20 на панели настройки IdentityServer
  • Открытие, отображающее порт 20 внутри контейнера на некоторый порт за пределами -p 45264:20 в дополнение к уже выставленномупорт 80
  • Первоначально я работал над использованием порта 1433 с обеих сторон сопоставления, но так как он не работал, я попытался использовать другой порт снаружи (20).Ничего не изменилось

Вот строка соединения, используемая IdentityServer (конфиденциальные данные скрыты):

Data Source=***.***.***.***,20;Initial Catalog=Identity;Persist Security Info=True;User ID=**;Password=******************

Почему мой докер IdentityServer не может связаться с докером SQL Serverв то время как сам SQL Server вполне достижим?Как я могу заставить эту настройку работать?

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Я отказался от того, чтобы заставить это работать на одном хосте, поэтому я просто решил запустить SQL Server на отдельном компьютере.

0 голосов
/ 25 февраля 2019

Используйте tcp, 127.0.0.1 и порт хоста для подключения.Упомяните в настройках Docker сервера идентификации, что это зависит от контейнера сервера базы данных SQL.Например,

identityservice:
   ...
   depends_on:
      - sqldataservice

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

"ConnectionString": "Server=tcp:127.0.0.1,8433;Database=dbname;User Id=sa;Password=abc@1234;"
0 голосов
/ 04 марта 2019

Как я понял, вы запускаете Sql Server и IdentityServer (у которого есть проблема с подключением) в отдельных контейнерах Docker.

Если это так, то ссылка на localhost (т. Е. 127.0.0.1) неверна.Потому что в этом случае IdentityServer пытается подключиться к себе.Это будет работать, если IdentityServer запущен на хост-компьютере, поскольку вы перенаправляете на него порт SQL-сервера.Но в вашем случае вам следует подключиться к IP-адресу контейнера SQL-сервера.Учитывая все вышесказанное, я вижу три варианта решения этой проблемы:

  1. Вы можете получить IP-адрес контейнера SQL Server, запустив docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <sql_container_name_or_id>
  2. Запуск контейнера SQL со статическим IP через docker run --ip <static_ip_value> <sql_container_name_or_id> и затем используйте статический ip, указанный в строке подключения.
  3. Запустите контейнер SQL с указанным именем хоста через docker run --hostname <sql_host_name> <sql_container_name_or_id>, а затем используйте указанное имя хоста в строке подключения.

Какой путь вам решать?

0 голосов
/ 25 февраля 2019

При упаковке SQL-сервера в Docker первое, что нужно ожидать, - это способ соединения.SQL Server предпочитает именованные каналы, и вы должны явно установить режим на tcp.

Если подключение выполняется локально, не используйте localhost, измените его на 127.0.0.1.Также может помочь написание явного префикса tcp:, например: Server=tcp:x.y.z.q,1433

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