SQLServer在Docker容器中的连接字符串

66

我正在使用带有dotnet Core和EF Core的Visual Studio 2017 Mac版。在设置了Docker容器中的mssql映像后,我尝试添加连接字符串,但出现了连接错误。我尝试使用不同的选项,例如IP地址、容器名称、主机名等作为服务器名称,但它们都没有起作用。

 "Default": "Server=172.17.0.2; Database=ERPDb; User=sa; Password =******;"

带有容器名称

 "Default": "Server=ecstatic_hermann; Database=ERPDb; User=sa; Password=******;"

使用主机名:

 "Default": "Server=f45840a59623; Database=ERPDb; User=sa; Password=******;"

在终端中使用localhost连接时,连接成功

$ mssql -s localhost -p Technocrat123
Connecting to localhost...done

sql-cli version 0.6.2
Enter ".help" for usage hints.

但是当运行应用程序时,连接失败。

感谢任何帮助。提前致谢。

如果使用本地主机,则错误为

Login failed for user ''. Reason: An attempt to login using SQL authentication failed. Server is configured for Integrated authentication only.

SQL Server是否在容器内运行?连接代码是否也在容器内运行?如果两者都是,它们是否在同一网络中?如果不是,服务器的SQL端口是否已暴露? - omu_negru
@omu_negru SQL服务器正在容器内运行。应用程序在机器内而不是容器内运行。如何暴露SQL端口?你能指导我吗? - user2695433
这是对我有效的连接字符串:Data Source=localhost;Initial Catalog=<database>;User ID=sa;Password=<password> - Bruno Serrano
@BrunoSerrano,谢谢你的留言。我最初是从本地主机开始的,但没有成功。感谢你在这里分享。 - user2695433
@user2695433,你试过使用Data Source代替ServerInitial Catalog代替Database吗?当我更改这些名称时,它开始工作了。 - Bruno Serrano
显示剩余14条评论
6个回答

70
sudo docker pull microsoft/mssql-server-linux:2017-latest
docker run \
  -e 'ACCEPT_EULA=Y' \
  -e 'MSSQL_SA_PASSWORD=YourSTRONG!Passw0rd' \
  -p 1401:1433 \
  -n sql1 \
  -d microsoft/mssql-server-linux:2017-latest

那么,

private static string _connStr = @"
  Server=127.0.0.1,1401;
  Database=Master;
  User Id=SA;
  Password=YourSTRONG!Passw0rd";

4
可以使用 server=(LocalDb)\InstanceName 的格式连接吗? - amorimluc
你能提供更多有关你的设置的信息吗?为什么要使用命名实例? - rjminchuk
因为我们的软件团队大多使用Windows,但我使用的是Mac。他们正在使用我提到的格式进行连接。我无法以那种方式连接我的Docker SQL Server容器。 - amorimluc
我不确定在MacOS的命令行中是否可以使用servername\instance格式连接。我已经尝试了许多基于@@servername和@@servicename(实例名称)的不同连接方式,但都没有成功。我一直遇到网络错误。 - rjminchuk

28

与在团队环境中使用有问题的IP地址不同,您还可以使用host.docker.internal来解析为您的主机IP。

Data Source=host.docker.internal,1433;Initial Catalog=MyDB;User ID=MyUser;Password=MyPassword

我相信这只适用于Linux容器(之前我被迫使用Windows容器时就遇到了这个问题。所以在这里要小心)。 - The Senator

24

很可能您的服务器名称是localhost以及端口1401(这是Docker容器设置的默认值)。因此,您需要使用以下连接字符串:

"Default": "Server=localhost,1401; Database=ERPDb; User=sa; Password =******;"

8
今天我遇到了这个问题,我使用了一个单独的网络来解决它(而不是使用默认的“bridge”网络)。
  1. docker network create test_network

  2. docker container run -p 1433:1433 -d --name mssql -v mssql_data:/var/opt/mssql -e SA_PASSWORD=********** -e ACCEPT_EULA=Y --network=test_network microsoft/mssql-server-linux

  3. docker container run -p 5000:80 --rm -e ASPNETCORE_ENVIRONMENT=Development --name aspnetcore --network=test_network aspnetcore-image

此外,我有这样的连接字符串:

Server=mssql;Database=master;User=sa;Password=**********;

关于使用IP地址的连接字符串的先前答案,这不是一个好的方法,因为该地址可以动态更改,最好使用容器名称作为主机名。


1
IP地址127.0.0.1永远不会改变。它就像本地主机一样是一个自我引用。 - Paul - Soura Tech LLC

1

我通过检查 SQL Server 容器的 IP 地址来解决了这个问题,如下所示:

容器 IP 地址

docker inspect -f "{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}" <ContainerID | ContainerName>

这个IP地址在大多数环境中都无法使用(包括MacOS和Windows主机),你不需要查找它。 - David Maze

1
在我的情况下,有效的方法是使用仅本地主机,但添加TrustServerCertificate=True。
 "Server=localhost;Database=ERPDb;User Id=SA;Password=YourSTRONG!Passw0rd;TrustServerCertificate=True"

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