无法从Docker容器连接到SQL Server

时间:2019-01-02 14:55:41

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

我们有一个ASP.NET Core 2.2应用程序,它的后端数据库完美地托管在单独的服务器上。所有CRUD操作均完美无缺。我们对应用程序进行了docker化处理,但开始收到以下错误消息:

  

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:SQL网络接口,错误:26-指定服务器/实例时出错)

docker撰写文件看起来像以下代码:

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

1 个答案:

答案 0 :(得分:1)

通常情况下,您可以通过以下方式通过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"

很遗憾,此issue在composer文件中添加extra_hosts无效,我希望他们尽快解决该问题。

因此,为了使连接正常工作,请用SQL Server的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