无法从 Docker 容器连接到 SQL Server

3
我们有一个ASP.NET Core 2.2应用程序,其与后端数据库托管在不同的服务器上完美地配合工作。所有CRUD操作都无缺陷。我们将应用程序Docker化,但出现了以下错误信息:
“在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并配置SQL Server以允许远程连接。(提供程序:SQL Network Interfaces,错误:26 - 找不到服务器/指定的实例)”
docker-compose文件如下所示:
version: '3.4'

services:
  services.webapi:
    image: ${DOCKER_REGISTRY-}serviceswebapi
    build:
      context: .
      dockerfile: Services.WebApi\Dockerfile
      network: host

这个配置可能有问题,导致应用程序无法与 SQL Server 实例通信。
更新1: SQL Server 没有使用 docker 化。
更新2: 应用程序从 appsettings.json 文件中读取 SQL 连接字符串。这是重命名服务器名称和凭据后的连接字符串:
Server=WIN-MSSQL1\\MSSQLSERVER2017;Initial Catalog=ServiceDB;User ID=cruduser;Password=foo;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

这是完整的Compose文件还是更多的服务?SQL也被Docker化了吗? - AtomiX84
是的,那就是完整的Compose文件。SQL服务器没有被Docker化。 - Arash
Docker化的应用程序如何知道如何访问SQL服务?我的意思是在配置文件中有SQL服务器的主机名吗?如果是,您可以尝试在docker的hosts文件中添加一个附加主机选项:'extra_hosts: - "somehost:162.242.195.82"'。 - AtomiX84
请查看问题中的更新2,我在那里发布了连接字符串。 - Arash
请确认一下:您能否在 Docker 之外的控制台应用程序中使用完全相同的连接字符串并确认连接是否正常工作? - mason
1个回答

2
在正常情况下,您可以通过composer文件将sql主机名添加到容器的/etc/hosts文件中来修复此问题,如下所示:
version: '3.4'

services:
  services.webapi:
    image: ${DOCKER_REGISTRY-}serviceswebapi
    build:
      context: .
      dockerfile: Services.WebApi\Dockerfile
      network: host
    extra_hosts:
      - "WIN_MSSQL1:192.168.0.1"

很不幸,由于此问题,在composer文件中添加extra_hosts将无法起作用,希望他们尽快解决这个问题。

因此,为了让连接工作,请用SQL服务器的IP地址替换主机名:

从这个开始:

Server=WIN-MSSQL1\\MSSQLSERVER2017;Initial Catalog=ServiceDB;User ID=cruduser;Password=foo;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

转换为:

Server=192.168.0.1\\MSSQLSERVER2017;Initial Catalog=ServiceDB;User ID=cruduser;Password=foo;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

如果你进入容器,能否ping通SQL主机? "docker exec -it '容器名称' ping WIN_MSSQL1 - AtomiX84
是的,它正在运行在Windows上。 - Arash
不确定是否有帮助,因为在容器内部对 SQL Server 的 IP 地址 192.168.1.2 进行 ping 测试失败了。 - Arash
1
好的,我知道了,我正在开车回家,你尝试使用docker桥接而不是网络:主机(只需删除network: host这一行),然后再次尝试通过IP地址ping SQL服务器。 - AtomiX84
1
好的,@Arash根据评论我修改了答案,请审核连接字符串。 - AtomiX84
显示剩余12条评论

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