2017-01-02 68 views
2

我爲我的.NET程序創建了一個Dockerfile。該程序在我的桌面上以及沒有Docker的Windows Server 2016(Azure VM)上運行良好。當我嘗試將其作爲容器運行時(基於microsoft/windowsservercore),那麼當連接到我的Azure SQL實例時,我經常會遇到數據庫錯誤。Windows容器導致Azure SQL連接失敗

我有兩個Azure SQL實例正在運行(P1和空載)。當建立連接時,它們非常快,但問題是連接通常無法建立。看起來網絡非常不穩定。這些是我扔的典型錯誤:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

內部異常報告網絡路徑找不到。起初我以爲它可能是我的本地機器,但它在Azure中的Windows Server 2016(帶容器)VM實例上也存在問題。

爲了查明問題,我創建了一個每5秒鐘連接到我的數據庫的測試程序(並運行SELECT COUNT(*) from sysobjects)。這個程序總是能夠找到數據庫。

看來,我的其他程序經常在啓動過程中失敗,但在初始化過程中有很多數據庫調用。我懷疑線程,連接池,有什麼不同...

任何線索?

回答

1

看起來很奇怪,錯誤消息來自命名管道提供程序,因爲Azure SQL只能通過TCP/IP進行連接。不知何故,它似​​乎回退到命名管道,可以通過在tcp:前加上主機名來阻止。所以,我的連接字符串看起來像:

Server=tcp:example.database.windows.net;Database=<dbname>;User Id=... 

這可以防止服務器從回落到嘗試使用命名管道和我還沒有看到這個問題了。

不幸的是,我還沒有找到在某些情況下使用命名管道提供程序的原因。它應該由microsoft/windowsservercore圖片中的某些配置引起,因爲我從來沒有看到Docker鏡像之外的錯誤消息。否則,我會懷疑Azure SQL的限制機制(儘管負載很低)。

+0

命名管道提供的是一個在哪些SQL嘗試,如果你沒有明確設置協議使用協議的順序。所以如果你想避免首先嚐試netpipes,你必須強制SQL使用tcp。 –

2

我們目前也遇到了Windows Container的更多網絡問題。但是對於像Azure/Containers一樣的軟件定義網絡,一般建議使用一些重試邏輯。

如果您使用實體框架,則可以插入不同的彈性和重試策略「SqlAzureExecutionStrategy」。這通常不僅適用於Azure,而且可以幫助減少異常。

本文介紹如何: https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx