从Docker容器连接到SQL Server数据库

22

我在我的电脑上安装了Docker for Windows。有一个针对 .NET Core 1.0.0 的控制台应用程序,尝试访问在不同虚拟机上运行的 SQL Server 数据库。我可以从我的机器上ping通运行SQL Server的虚拟机。

当我尝试使用命令提示符上的 dotnet run 运行控制台应用程序时,它能够正常工作。但是当相同的应用程序在 Docker 容器中运行时,我会收到以下信息:

建立到 SQL Server 的连接时出现与网络相关或特定于实例的错误。无法找到服务器或无法访问服务器。请验证实例名称是否正确,并确认 SQL Server 已配置为允许远程连接。(提供程序:TCP 提供程序,错误:40 - 无法打开到 SQL Server 的连接)

我已经尝试使用

docker run --add-host sqldemo:<VM running sql server ip here>

但这没有任何区别。


可以ping通并不意味着你能够连接到MySQL。 - YOU
你是如何构建连接字符串的? - Brad
@Brad 使用 (var conn = new SqlConnection(@"Data Source=<vm ip here>;Initial Catalog=DemoDb;User id=demo;Password=demo")) - Learning Docker
尝试使用--add-host添加的主机名sqldemo而不是IP地址。 - Brad
@Brad 我已经尝试过了,但不起作用。从 Docker 主机无法 ping 到运行 SQL Server 的虚拟机。我阅读了很多有关 Docker 网络的文章,但仍然无法解决这个问题。大多数文章都谈论使用覆盖网络驱动程序来连接多个主机,但在我的情况下,这并不适用,因为 SQL Server 不是在 Docker 容器中运行的。 - Learning Docker
显示剩余3条评论
3个回答

9

假设条件

  • Microsoft SQL Server 2016
  • Windows 10周年更新版
  • Windows容器
  • ASP.NET Core应用程序

向SQL数据库添加SQL用户。

  • 在MS SQL中展开数据库
  • 右键单击“Security / Logins”
  • 选择“New Login”
  • 创建用户名和密码。
  • 分配“Server Role(s)”...我使用了sysadmin,因为我只是在测试
  • 在“User Mapping”下,将我的新用户添加到我的数据库,并使用“dbo”作为模式。

更改SQL身份验证以允许SQL Server身份验证模式

右键单击您的数据库,选择“属性/安全性/服务器身份验证/SQL Server和Windows身份验证模式”单选按钮。重新启动MS SQL服务。

使用新的用户名和密码更新您的appsettings.json

示例

"ConnectionStrings": {
        "DefaultConnection": "Server=YourServerName;Database=YourDatabaseName;MultipleActiveResultSets=true;User Id=UserNameYouJustAdded;Password=PassordYouJustCreated"
},

请确保删除Trusted_Connection=True

创建Docker文件

我的示例Docker文件

FROM microsoft/dotnet:nanoserver
ARG source=.
WORKDIR /app 
EXPOSE 5000 
EXPOSE 1433 
ENV ASPNETCORE_URLS http://+:5000 
COPY $source .

发布应用程序

在以管理员权限运行的PowerShell中,从与Docker文件相同的位置运行

dotnet publish

docker build bin\Debug\netcoreapp1.0\publish -t aspidserver

docker run -it  aspidserver cmd

我想要运行容器并在PowerShell中看到输出结果。

一旦容器在命令提示符中启动并运行,我就启动了我的应用程序。

dotnet nameOfApplication.dll

如果一切按计划进行,系统应该已经启动并运行。

4

您可以使用设置为host的网络设置运行Docker容器。这样的容器将与Docker主机共享网络堆栈,并且从容器的角度来看,localhost(或127.0.0.1)将指向Docker主机。

docker run --net=host ... 

然后,您应该从Docker容器内部获取SQL Server数据库,就像从主机获取一样。


1
不行。目前SQL Server无法在容器中运行(除了在Linux上可用的仅限于私有预览的SQL Server 2016之外)。在我的情况下,它正在运行在一个不同的Windows虚拟机上(就像单独安装一样)。 - Learning Docker
5
我认为他指的是在本地主机上运行的SQL Server(不是在容器中,只是通过本地主机端口连接到实例)。此外,请参考我之前的回答,WinDocks提供了一个适用于Windows操作系统系列的Docker引擎,支持在容器中运行SQL Server(即,SQL Server 2008到2016镜像支持)。 - paul stanton
这个能够支持可信连接吗?也就是说,如果主机使用Windows身份验证连接到数据库,那么这个身份验证是否能够传递到Docker容器中? - Frank

0

就像这个答案所示

Linux Docker中的SQL Server实例字符串连接

来自微软的Saurabh Singh的说法

实例名称支持在 .Net Core 的 v1.1 中可用。在 .Net Core 的 v1.0 中,除了 Windows 之外的操作系统不支持实例名称。

因此,我认为您无法使用实例名称从运行在 Linux 上的 .Net Core 1.0 连接到 SQL Server。

您的选择似乎是:

don't use instance name
wait for .Net Core 1.1 (planned for "Fall 2016")
use pre-release version of .Net Core 1.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接