Docker容器无法连接到远程服务器上的SQL Server

14
我有一个托管在容器中的ASP.NET Core应用程序,但它无法连接到远程服务器上的SQL Server。
错误信息如下:
“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并验证 SQL Server 是否已配置为允许远程连接。”
这是我已经检查过的内容:
- 尝试在主机机器和 DB 服务器上禁用防火墙:仍然出现错误; - 编辑连接字符串以使用 IP 和端口号:仍然出现错误; - 从应用程序容器 ping DB 服务器:我可以正常 ping 到 DB 服务器; - 通过 SQL Server Management Studio 连接到数据库服务器:我可以正常连接。
因此,我认为容器能够看到 DB 服务器,但无法连接。我需要检查什么其他内容吗?
非常感谢您的帮助。
更新:
Dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 1433

#our sql server was use this port for connect
EXPOSE 64608

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /src

COPY Web.API.sln ./
COPY MyProject.Core/*.csproj ./MyProject.Core/
COPY MyProject.API/*.csproj ./MyProject.API/

RUN dotnet restore
COPY . .

WORKDIR /src/MyProject.API
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyProject.API.dll"]

运行Docker命令:

docker build -t myproject-api:latest .

docker run -d -p 7991:80 --name myproject-api myproject-api:latest

连接字符串:

"data source=172.16.0.88\\SQL_DEV,64608; initial catalog=MyProject; persist security info=True; user id=myuser; password=mypassword;"

假设远程 SQL Server 是在 1433 端口上侦听的默认实例,请使用 powershell -Command echo ((new-object Net.Sockets.TcpClient).Client.Connect('your-database-server', 1433)) 'success' 命令从容器内部检查远程端口连接性。 - Dan Guzman
请发布Docker文件和您用于运行容器的命令。 - Max
@DanGuzman 谢谢您的建议。我对Docker还很陌生。在我找到如何在容器中运行PowerShell命令之后,我会尝试它。 - LLF
@Max,我已经在帖子中更新了Docker文件和命令。谢谢。 - LLF
@LLF,您如何检查运行为容器的 SQL Server 实例的 TCP/IP 设置? - Golide
显示剩余5条评论
3个回答

4
这很可能是由于连接字符串引起的问题。请将您的连接字符串更改为以下内容:
Server=172.16.0.88\\SQL_DEV,64608;Database=MyProject;UserId=myuser;Password=mypassword

或者

Server=172.16.0.88,64608;Database=MyProject;User Id=myuser;Password=mypassword

无论哪种都可以。

移除“persist security info”。 - prisar
你能否在Visual Studio中连接调试模式? - prisar
它在VS上完美运行,或者可以直接部署在IIS上。你刚才编辑中删除了实例名称吗? - LLF
@prisar已经尝试编辑连接字符串,但无论是VS还是Docker都没有起作用。我认为这是因为我的数据库在SQL_DEV实例中。 - LLF
@prisar非常感谢您的帮助。最终,我发现在尝试在连接字符串上添加实例后,您是完全正确的。似乎在Linux容器上运行的aspnetcore需要使用不同的连接字符串格式。更多信息请参见:https://stackoverflow.com/questions/55454878/invalid-sql-server-connection-string-on-linux-entity-framework-core - LLF
显示剩余4条评论

3

我曾经也遇到过同样的问题,后来我更换了Dockerfile镜像。

我进行了替换。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

使用这行代码

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base

现在它可以工作了!

1

这是一个解决方法。问题在于这两个系统是独立的,属于两个不同的网络和隔离级别。 - RobyB

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