簡體   English   中英

連接docker容器中的SQL服務器時出錯

[英]Error when connecting to SQL Server in docker container

我有一個 ASP.NET Core WebAPI 在 Windows Docker 容器中運行。 我在從應用程序內部連接到本地 SQL 實例時遇到問題。

這是錯誤消息:

(0x80131904):與 SQL 服務器建立連接時發生與網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱是否正確以及 SQL 服務器是否配置為允許遠程連接。 (提供程序:命名管道提供程序,錯誤:40 - 無法打開與 SQL 服務器的連接)---> System.ComponentModel.Win32Exception (53): The.network path was not found

在 github 上發現了這個問題,但它並不適用於我的情況。

我可以通過將實例名稱替換為服務器本地 IP 地址來使一切正常,如下所示:

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

這里發生了什么? 似乎 .NET 無法解析域機器主機名。


其他詳情

  • 使用.Net Core 2.2
  • 在 Windows 上使用 Docker Windows 容器
  • 嘗試在Windows 10Windows Server 2019上托管。 兩者都有完全相同的錯誤。
  • 我可以使用其主機名或本地 IP 從容器內部ping SQL 實例。
  • 當我用連接字符串中的本地 IP 地址替換實例名稱時,一切正常。
  • 如果我在 .NET CLI(不使用 Docker)中運行應用程序,一切正常
  • 我嘗試訪問的 SQL 實例未托管在 Docker 上。它托管在同一 local.network 上的另一台 Windows 服務器上。
  • 我可以使用DataSource=MyAzureServer.database.windows.net訪問托管在 Azure 上的其他 SQL 實例,沒有任何問題。

根據我在評論中的建議,如果服務器名稱不是完全限定的域名(FQDN),則可能在將服務器解析為IP時出現問題。

嘗試將服務器名稱調整為FQDN,希望能解決它。

如果做不到這一點,看看鏈接,如這一個從SQL Server的角度制定出名字解析,你會得到一些其他的想法,你如何解決此類問題。

檢查這個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:
  • 網絡被定義為彼此訪問容器。
  • 別名用於擁有命名資源,對於上面的代碼段,連接字符串是:

Server = mssql1; Database = whatever_is_need; User Id = sa; Password = Pass @ word;

我和你有同樣的問題。 連接字符串中的服務器名稱和容器名稱應該相同。

我不知道.NET Core但我可以給你一些提示,如果你的.NET Core在瀏覽器實例中運行,如瀏覽器無法使用“MySqlInstance”解析你的MYSQL服務器,因為容器只存在於主機中。 檢查..這可能就是為什么使用它工作的IP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM