sql-server - ASP.NET Core Web API 服务无法连接到同一网络上的 Docker SQL Server

标签 sql-server docker asp.net-core .net-core

我有一个 ASP.NET Core v3 Web API 服务。它可以正常运行并连接到普通的 Windows 托管 SQL Server 实例。但是当我尝试将它连接到 Docker Linux 托管的 SQL Server 实例时,它失败了。

以下是一些细节:

  • 两个容器都在我的 Windows 10 开发机器上运行
  • Web API 服务容器是基于 Linux 的,它本身可以正常工作
  • Linux SQL Server 容器本身运行良好
  • 我可以毫无问题地通过 SSMS 连接和运行查询。
  • 两个容器都是同一个默认 Bridge 网络。
  • 我跑了docker network inspect bridge -f "{{json .Containers }}"它列出了两个容器。

  • 这是我的数据库连接字符串:

    "Server=localhost;Database=MyDatabase;User Id=MySqlUser;Password=MyPassword"



    我也尝试在我的 hosts 中输入localsql 文件设置为 127.0.0.0。 localhost 和 localsql 都可以使用 SSMS 连接到 docker 数据库。

    这是实际的错误消息:

    A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)



    当我尝试从我的主机文件中使用 localsql 时,它有一个内部异常,此消息 "Name or service not known"

    最佳答案

    连接字符串指向 localhost。容器中的 localhost 是指容器本身,因此 ASP.NET Core Container 会尝试在同一容器上查找 SQL Server。

    在连接字符串中使用 SQL Server 容器的名称而不是 localhost。为了使其工作,您需要创建一个用户定义的网桥,两个容器都连接到该网桥:

    docker network create sql-server-test
    

    运行容器时,您需要指定容器连接到的网络,如下所示:
    # Please note the --name and --network parameters
    docker run -e ACCEPT_EULA=Y -e 'SA_PASSWORD=<PWD>' -d --name sql-server --network sql-server-test mcr.microsoft.com/mssql/server:2019-latest
    # Please note the --network parameter
    docker run -d -p 8889:80 --name aspnet-core --network sql-server-test aspnet-core
    

    由于两个容器现在都连接到同一网络,您可以在连接字符串中使用 Sql Server 容器的名称(在同一个 sql-server 中),并使用此连接字符串连接到 Sql Server:
    "Data Source=sql-server;Initial Catalog=master;User ID=sa;Password=<PWD>"
    

    有关 Docker 网络的详细信息以及有关如何在容器之间设置通信的其他选项,请参阅此 link .

    关于sql-server - ASP.NET Core Web API 服务无法连接到同一网络上的 Docker SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59461691/

    相关文章:

    sql - LOG 和 EXP 函数中的舍入问题

    docker - 未应用 ASPNETCORE_URLS(在 docker 容器中部署)

    c# - 请求和操作之间的 Asp.net 核心中间件路由延迟

    c# - 如何删除每个响应上的一些 httpresponse header (例如 Server 和 ETag)?

    c# - .NET Core - 无法加载文件或程序集

    sql - 将数据从 Excel 移动到 SQL Server 表

    sql-server - SQL Server 合并语句

    python - MS SQL Python 日期时间晚于但不等于 '>' 返回结果为 '>='

    sockets - 如何使用 unix 套接字从容器内部与 docker 守护进程进行通信?

    api - 如何在Docker容器中计时执行时间?