如何从 Docker 组成的 C# 应用程序连接到本地 SQL Server Express 数据库?

问题描述

连接到 Azure 中的 sql Server 数据库的原始(工作正常)docker 文件如下所示:

version: '3.4'

services:
  my.service:
    build:
        dockerfile: Test/Test/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - MyDatabase__ConnectionString=Server=tcp:xxx.windows.net,1433;Initial Catalog=my-catalog;User ID=SA@dbs;Password='xxx';Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30

如果我想连接到本地 sql Server Express,“MyDatabase__ConnectionString”应该是什么?

我尝试了这些选项,但都不起作用?

  • tcp:host.docker.internal\\sqlEXPRESS,1433;***
  • tcp:host.docker.internal\\sqlEXPRESS;***
  • tcp:localhost\\sqlEXPRESS,1433;***
  • host.docker.internal\\sqlEXPRESS,1433;***
  • host.docker.internal\\sqlEXPRESS;***
  • localhost\\sqlEXPRESS;***

另请注意,我的本地 sql Server Express 已启用 TCP:

TCP is enabled

解决方法

我尝试了同样的事情,但没有成功。相反,我也在 docker 中运行 sqlserver。然后你可以:

  • 从另一个 docker 容器连接到 sqlserver: Server=host.docker.internal,1434;Database=UsersDb;User ID=sa;Password=P@ssw0rd12345!!
  • 从主机连接 Server=127.0.0.1,1434;Database=UsersDb;User ID=sa;Password=P@ssw0rd12345!!
,

按照这个 blog-post 我可以让它工作。

请参阅以下步骤:

1] 确保 TCP 已启用,并且此 SQLExpress 实例的“Listen All 设置为 Yes”: enter image description here

2] 定义一个(免费)固定的自定义端口,SQLExpress 实例应该在该端口上侦听(例如 49172) enter image description here

3] 确保 Windows 上的防火墙允许本地连接到此端口: enter image description here

4] 现在将连接字符串更改为此。

Server=host.docker.internal,49172;Initial Catalog=Initial Catalog=my-catalog;***

在本例中使用了 host.docker.internal,它会自动解析 Docker 内部 (nat) ip 地址。 就我而言,这是这样的: enter image description here

(但是如果你只使用host.docker.internal,你不需要使用这个IP地址)