Ошибка при подключении к SQL Server в Docker-контейнере - PullRequest
3 голосов
/ 01 апреля 2019

У меня ASP.NET Core WebAPI работает внутри контейнера Windows Docker.У меня проблемы с подключением к локальному экземпляру SQL изнутри приложения.

Это сообщение об ошибке:

(0x80131904): сетевое или специфичное для экземплярапроизошла ошибка при установлении соединения с SQL Server.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений.(поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server) ---> System.ComponentModel.Win32Exception (53): Сетевой путь не найден

Я обнаружил эту проблему на github , но она не имеет отношения к моей ситуации.

Я могу заставить все работать, заменив имя экземпляра на локальный IP-адрес серверавот так:

"ConnectionString_ThrowingError": "Data Source=MySqlInstance; (...)"
"ConnectionString_WorkingFine":   "Data Source=192.168.0.123; (...)"

Что здесь происходит?Кажется, .NET не может разрешить имя хоста компьютера домена.


Другие детали

  • Использование .Net Core 2.2
  • Использование контейнера Docker Windows в Windows
  • Пробный хостинг на Windows 10 и Windows Server 2019.У обоих была одинаковая ошибка.
  • Я могу ping экземпляр SQL изнутри контейнера, используя его имя хоста или локальный IP.
  • Все работает, когда я заменяю имя экземпляра на локальноеIP-адрес в строке подключения.
  • Все работает нормально, если я запускаю приложение в .NET CLI (не используя Docker)
  • Экземпляр SQL, к которому я пытаюсь получить доступ, не размещен наДокер.Он размещен на другом сервере Windows в той же локальной сети.
  • Я могу связаться с другим экземпляром SQL, размещенным на Azure, используя DataSource=MyAzureServer.database.windows.net без проблем.

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Согласно моему предложению в комментариях, если имя сервера не является полностью определенным доменным именем (FQDN), то могут возникнуть проблемы с разрешением сервера на IP.

Попробуйте настроить имя сервера для полного доменного имени и, надеюсь, это разрешит его.

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

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

Проверьте это docker-composer.yaml, сети и псевдонимы разделы важны, выше настройки могут быть созданы с помощью команд Docker вместо yaml.

    version: '3.4'

    services:
      some.api:
        image: ${DOCKER_REGISTRY-}someapi
        container_name: some.api
        build:
          context: .
          dockerfile: /Dockerfile
        ports:
          - "40080:80"
          - "44443:443"
        networks:
        - database
      some.db:
        image: microsoft/mssql-server-linux:2017-latest
        container_name: mssql1
        networks:
          database:
            aliases:
              - mssql1
        environment:
          - SA_PASSWORD=Pass@word
          - ACCEPT_EULA=Y
        ports:
          - "5454:1433"
    networks:
  database:
  • Сетиопределен для доступа к контейнерам один из другого.
  • Псевдоним используется для того, чтобы иметь именованный ресурс, для приведенного выше фрагмента строка подключения:

Сервер = mssql1; База данных = what_is_need; Идентификатор пользователя = sa; Пароль = Pass @ word;

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

Я не знаю о .NET Core, но могу дать вам несколько советов, если ваш .NET Core работает в экземпляре браузера, например в веб-приложении, браузер не может разрешить ваш сервер MYSQL с помощью «MySqlInstance», поскольку контейнер существует только на хосте. машина. Проверьте это .. это может быть, поэтому, используя IP, он работает.

...