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

时间:2016-07-25 23:11:24

标签: c# docker asp.net-core docker-compose .net-core

我的机器上安装了windows的docker。有一个针对.net core 1.0.0的控制台应用程序,它试图访问在不同VM上运行的SQL Server数据库。我可以从我的机器上ping运行SQL Server的VM。

当我尝试在我的机器上从命令提示符使用dotnet run运行控制台应用程序时,它可以正常工作。但是当在docker容器中运行相同的应用程序时,我收到一条消息

  

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

我尝试使用

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

但这没有任何区别。

3 个答案:

答案 0 :(得分:6)

假设

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

将SQL用户添加到SQL数据库。

  • 在MS SQL中展开数据库
  • 右键点击&#39;安全/登录&#39;
  • 选择“新登录”&#39;
  • 创建用户名和密码。
  • 分配&#39;服务器角色&#39; ...我使用了sysadmin,因为我只是在测试
  • 用户映射&#39;我将我的新用户添加到了我的数据库并使用了“dbo&#39; for schema。

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

右键单击您的数据库,选择&#39;属性/安全性/服务器身份验证/ SQL Server和Windows身份验证模式&#39;单选按钮。重新启动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

如果一切按计划进行,那么应该启动并运行。

答案 1 :(得分:2)

您可以运行网络设置为host的泊坞广告容器。这样的容器将与docker主机共享网络堆栈,从容器的角度来看,localhost(或127.0.0.1)将引用docker主机。

docker run --net=host ... 

然后,您应该像在主机上一样从Docker容器中获取SQL Server数据库。

答案 2 :(得分:0)

如同这个答案

SQL Server instance string connection in Linux Docker

来自Microsoft的

According to Saurabh Singh

  

.Net Core的v 1.1中提供了实例名称支持。在v1.0中   除.Net之外,OS不支持实例名称   视窗。

所以我认为您不能使用实例名从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