簡體   English   中英

ASP.NET Core Web API 服務無法連接到同一網絡上的 Docker SQL Server

[英]ASP.NET Core Web API Service cannot connect to Docker SQL Server on same network

我有一個 ASP.NET Core v3 Web API 服務。 它可以正常運行並連接到普通的 Windows 托管 SQL Server 實例。 但是當我嘗試將它連接到 Docker Linux 托管的 SQL Server 實例時,它失敗了。

以下是一些細節:

  • 兩個容器都在我的 Windows 10 開發機器上運行
  • Web API 服務容器是基於 Linux 的,它本身可以正常工作
  • Linux SQL Server 容器本身運行良好
    • 我可以毫無問題地通過 SSMS 連接和運行查詢。
  • 兩個容器都是同一個默認 Bridge 網絡。
    • 我運行docker network inspect bridge -f "{{json .Containers }}"並列出了兩個容器。

這是我的數據庫連接字符串:

“服務器=本地主機;數據庫=MyDatabase;用戶ID=MySqlUser;密碼=MyPassword”

我還嘗試在我的 localsql hosts文件中創建一個條目,設置為 127.0.0.0。 localhost 和 localsql 都可以使用 SSMS 連接到 docker 數據庫。

這是實際的錯誤消息:

與 SQL Server 建立連接時發生與網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱是否正確以及 SQL Server 是否配置為允許遠程連接。 (提供程序:TCP 提供程序,錯誤:40 - 無法打開與 SQL Server 的連接)

當我嘗試從我的主機文件中使用 localsql 時,它有一個內部異常並顯示此消息"Name or service not known"

連接字符串指向 localhost。 容器中的 localhost 是指容器本身,因此 ASP.NET Core Container 會嘗試在同一容器上查找 SQL Server。

在連接字符串中使用 SQL Server 容器的名稱而不是 localhost。 為了使其工作,您需要創建一個用戶定義的網橋,兩個容器都連接到該網橋:

docker network create sql-server-test

運行容器時,您需要指定容器連接到的網絡,如下所示:

# Please note the --name and --network parameters
docker run -e ACCEPT_EULA=Y -e 'SA_PASSWORD=<PWD>' -d --name sql-server --network sql-server-test mcr.microsoft.com/mssql/server:2019-latest
# Please note the --network parameter
docker run -d -p 8889:80 --name aspnet-core --network sql-server-test aspnet-core

由於兩個容器現在都連接到同一網絡,您可以在連接字符串中使用 Sql Server 容器的名稱(在同一個 sql-server 中),並使用此連接字符串連接到 Sql Server:

"Data Source=sql-server;Initial Catalog=master;User ID=sa;Password=<PWD>"

有關 Docker 網絡的詳細信息以及有關如何在容器之間設置通信的其他選項,請參閱此鏈接

Markus 的回答非常好,但我想擴展或使其更全面他寫的內容。 基本上它是關於默認橋接和用戶定義橋接 如果使用默認橋接,您也可以通過鏈接容器來實現這一點。 查看這篇文章了解更多信息

您還可以使用創建用戶定義的橋

$ docker network create my-net

然后,當您像 Markus 的示例代碼一樣創建新容器時。 您可以在創建命令中指定此網橋名稱。

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

如果您已經創建了容器,則可以使用下面的此命令將您創建的網橋連接到現有容器。 對 sql server 和 api 執行此操作(sql1 是 sql server 的名稱)。 然后你不需要在你的連接字符串中定義 localhost 因為它們將在同一個網絡中。

$ docker network connect my-net sql1 

實際上每次停止 docker 和重新部署(調試)容器時都非常煩人,您可能需要通過以下步驟

  • 第一次斷開連接: docker network disconnect my-net sql1
  • 刪除網絡: docker network rm my-net
  • 再次連接: docker network connect my-net sql1

暫無
暫無

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

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