Windows容器导致Azure SQL连接失败

我为我的.NET程序创build了一个Dockerfile。 该程序运行良好,在我的桌面上和没有Docker的Windows Server 2016(Azure VM)上运行。 当我试图运行它作为一个容器(基于microsoft / windowsservercore ),然后我连接到我的Azure SQL实例时,经常会遇到数据库错误。

我有两个Azure SQL实例正在运行(P1和空载)。 当一个连接可以build立,那么它们相当快,但问题是连接往往不能build立。 看起来networking非常不稳定。 这些是我引起的典型错误:

System.Data.SqlClient.SqlException:build立与SQL Server的连接时发生networking相关或实例特定的错误。 服务器未find或无法访问。 validation实例名称是否正确,并将SQL Serverconfiguration为允许远程连接。 (提供程序:命名pipe道提供程序,错误:40 – 无法打开连接到SQL Server)

内部exception报告未findnetworkingpath 。 起初,我以为它可能是我的本地机器,但它也有Azure中的Windows Server 2016(与容器)虚拟机实例的问题。

为了查明问题,我创build了一个testing程序,每5秒钟连接到我的数据库(并SELECT COUNT(*) from sysobjects运行SELECT COUNT(*) from sysobjects )。 这个程序总是能够find数据库。

看起来我的其他程序在启动时经常失败,但在初始化过程中有很多数据库调用。 我怀疑有线程,连接池,不同的东西…

任何人都有线索?

我们目前也遇到了Windows Container的更多networking问题。 但是对于像Azure / Containers那样的软件定义networking,一般build议使用一些重试逻辑。

如果您使用entity framework,则可以插入不同的弹性和重试策略“SqlAzureExecutionStrategy”。 这对Azure来说一般不仅是容器,而且可以帮助减lessexception。

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

看起来奇怪的是,错误消息来自命名pipe道提供程序 ,因为Azure SQL只能通过TCP / IP连接。 不知何故,它似​​乎回退到命名pipe道,这可以通过用tcp:前缀主机名来防止。 所以,我的连接string看起来像这样:

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

这可以防止服务器回落尝试使用命名pipe道,我还没有看到这个问题了。

不幸的是,我还没有find在某些情况下使用命名pipe道提供者的原因。 它应该是由microsoft / windowsservercore映像中的一些configuration引起的,因为我从来没有看到Docker映像外部的错误消息。 否则,我会怀疑Azure SQL的限制机制(尽pipe负载很低)。

Interesting Posts