![](/img/trans.png)
[英].NET Core Web API Application cannot connect to SQL server running on Docker
[英]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 實例時,它失敗了。
以下是一些細節:
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.