Asp.net 主机中从docker容器到SQL Server dblocal的连接字符串

Asp.net 主机中从docker容器到SQL Server dblocal的连接字符串,asp.net,sql-server,docker,asp.net-core,Asp.net,Sql Server,Docker,Asp.net Core,我们有一个运行在linux docker容器中的Web服务器。在Windows 10主机上运行时,连接到本地SQL Server时出现以下错误: Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[1] An exception occurred in the database while iterating the results of a query. System.

我们有一个运行在linux docker容器中的Web服务器。在Windows 10主机上运行时,连接到本地SQL Server时出现以下错误:

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[1]
  An exception occurred in the database while iterating the results of a query.
  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: TCP Provider, error: 25 - Connection string is not valid) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address...
json中的连接字符串如下所示:

"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyAppDb;User ID=test;Password=test;",
当我在VisualStudio中使用相同的连接字符串调试Web服务器时,它可以工作。所以我不明白,为什么docker抛出的
连接字符串无效
错误

Web服务器使用.NET Core 1.1,因此连接到SQL Server的命名实例应该可以正常工作。我安装了两个SQL Server实例。与命名管道的连接将无法工作,因为linux docker不支持它

我将网络模式主机用于容器,因此它应具有与主机相同的网络环境:

docker run --rm -it --name MyApp -v c:\users\myself\MyApp.json:/app/appsettings.json --network="host" MyAppImage
有人有主意吗

我使用网络模式主机作为容器,因此它应该与主机具有相同的网络环境

如果我对这句话理解正确的话,这并不像你想象的那样。容器与主机具有相同的网络环境。但是,主机不是您的物理机器,而是Docker创建的运行Linux容器的VM。对Hyper-V网络有更全面的解释。下面的图表基于那篇文章中的图表

红色轮廓的网卡是您的计算机用于连接到Windows虚拟交换机Docker创建的网卡。蓝色轮廓的网卡是linux虚拟机用于连接到同一虚拟交换机的网卡。它也是容器在使用主机网络时看到的卡

当应用程序在容器中运行时,需要通过网络连接到数据库。讨论在Windows上使用Docker Compose构建多容器应用程序。尽管作者使用的是Windows容器,但他提供了一个示例,用于创建数据库容器和web容器以及用于将它们链接在一起的连接字符串

还有一个很好的NerdDinner应用程序对接的逐步演练。介绍如何将应用程序从使用
localdb
转换为容器化SQL Server

我使用网络模式主机作为容器,因此它应该与主机具有相同的网络环境

如果我对这句话理解正确的话,这并不像你想象的那样。容器与主机具有相同的网络环境。但是,主机不是您的物理机器,而是Docker创建的运行Linux容器的VM。对Hyper-V网络有更全面的解释。下面的图表基于那篇文章中的图表

红色轮廓的网卡是您的计算机用于连接到Windows虚拟交换机Docker创建的网卡。蓝色轮廓的网卡是linux虚拟机用于连接到同一虚拟交换机的网卡。它也是容器在使用主机网络时看到的卡

当应用程序在容器中运行时,需要通过网络连接到数据库。讨论在Windows上使用Docker Compose构建多容器应用程序。尽管作者使用的是Windows容器,但他提供了一个示例,用于创建数据库容器和web容器以及用于将它们链接在一起的连接字符串


还有一个很好的NerdDinner应用程序对接的逐步演练。介绍如何将应用程序从使用
localdb
转换为容器化SQL Server。

安装在web服务器上?容器位于不同的IP上,而不是本地主机上,因此如果您在本地计算机上运行db Server,则需要为数据库服务器启用TCP/IP网络,以及更新配置以使用主机环境的主机名或IP。。。理想情况下,这应该通过环境变量输入。@DavidG:LocalDb在Windows 10主机上运行。@Tracker1:您是对的,但我找不到通过IP/HOSTNAME连接LocalDb的方法,因此我将使用我的另一个SQL Server实例来连接DB。您需要在配置设置中启用TCP。。。我忘了节目的名字了。。然后,您可以使用主机IP作为IP,端口应为默认端口。容器是与主机不同的IP。此外,您还需要为防火墙访问启用它,因为这可能会受到限制。是否安装在web服务器上?容器位于不同的IP上,而不是本地主机上,因此如果您在本地计算机上运行db服务器,则需要为数据库服务器启用TCP/IP网络,以及更新配置以使用主机环境的主机名或IP。。。理想情况下,这应该通过环境变量输入。@DavidG:LocalDb在Windows 10主机上运行。@Tracker1:您是对的,但我找不到通过IP/HOSTNAME连接LocalDb的方法,因此我将使用我的另一个SQL Server实例来连接DB。您需要在配置设置中启用TCP。。。我忘了节目的名字了。。然后,您可以使用主机IP作为IP,端口应为默认端口。容器是与主机不同的IP。此外,您还需要为防火墙访问启用它,因为这可能也会受到限制。感谢您对主机的了解。很明显,我需要按照@Tracker1的建议通过IP或主机名进行连接。关于SQL Server的容器化,我们不希望出现这种情况。感谢您对主机的深入了解。很明显,我需要按照@Tracker1的建议通过IP或主机名进行连接。关于SQL Server的容器化,我们不希望在这种情况下出现这种情况。