【问题标题】:Connecting to SQL Server Container from another Container by name按名称从另一个容器连接到 SQL Server 容器
【发布时间】:2020-05-03 10:29:38
【问题描述】:

我刚刚开始接触 Docker,我喜欢我目前的进步。但我被以下问题难住了。我正在尝试在一个容器中运行 SQL Server 数据库,并让我的 .Net Framework 4.5 Web 服务在第二个容器中运行。如果 web 服务容器中的连接字符串使用了 db 容器的 IP 地址,则连接成功。如果我尝试使用我指定的主机名,则会引发以下异常:

System.Data.Entity.Core.EntityException:底层提供程序在打开时失败。

System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

System.ComponentModel.Win32Exception:找不到网络路径

我在 Windows 10 Enterprise 上运行 Docker for Windows Engine 19.03.8,并使用 Windows 容器。这是我使用的命令和 docker 文件。我的测试应用程序是一个简单的控制台应用程序,它使用 Entity Framework 6 调用从表中返回数据的存储过程。

docker network create --driver nat mynat

数据库容器的 Docker 文件

FROM microsoft/mssql-server-windows-developer

ENV sa_password "Password123"
ENV attach_dbs "[]"

COPY . /

WORKDIR /

RUN powershell sqlcmd -S localhost,1433 -i CreateEMLDatabase.sql


RUN powershell set-itemproperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord 

CMD powershell ./start -sa_password Password123 -attach_dbs \"%attach_dbs%\" -Verbose -ACCEPT_EULA 'Y'

docker build --rm --no-cache --tag mailservicedb:latest。

docker run --net mynat --ip 172.30.157.42 -d --name maildbctr --hostname maildbctr mailservicedb:latest

测试控制台的连接字符串:

connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=maildbctr;initial catalog=EML;User Id=MyLogin;Password=MyPassword;MultipleActiveResultSets=True;App=EntityFramework""

测试者控制台的 Docker 文件

FROM mcr.microsoft.com/windows/servercore:1903

WORKDIR /tester

COPY . .

#FIX DNS issues currently in Windows Containers
RUN powershell set-itemproperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord 

CMD ContainerDbTester.exe

docker build --rm --no-cache --tag dbtester:latest。

docker run -it --net mynat --ip 172.30.157.43 --name dbtestctr --hostname dbtestctr dbtester:latest cmd

在 Tester 容器中,我可以 ping db 容器名称:

ping maildbctr

Pinging maildbctr [fe80::11c5:f48c:92c1:7a36%4] with 32 bytes of data:
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time<1ms
Reply from fe80::11c5:f48c:92c1:7a36%4: time=1ms

Ping statistics for fe80::11c5:f48c:92c1:7a36%4:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms

但是当我运行控制台 exe 时,我得到了上面抛出的异常。

非常感谢任何帮助找出我缺少的步骤。

【问题讨论】:

    标签: sql-server windows docker containers


    【解决方案1】:

    我遇到了类似的问题。我的设置是这样的:

    • 数据库容器将1433端口映射到主机端口31433;
    • App A 在主机上运行;
    • 应用 B 在另一个容器中;

    App A 可以正常使用localhost,31433 连接数据库,而App B 无法使用localhost 连接。

    经过一些研究,我能够让 App B 使用 host.docker.internal 而不是 localhost 连接到数据库。

    【讨论】:

      【解决方案2】:

      我曾多次使用类似的设置(数据库 + Web 平台),我曾经使用 docker-compose 方法,它通常更简单(默认情况下它为每个 compose 创建一个网络)并允许我随着时间的推移跟踪多种不同的配置。 DC 的文档甚至向我们展示了 an example 以及网络的工作原理:

      version: "3"
      services:
        web:
          build: .
          ports:
            - "8000:8000"
        db:
          image: postgres
          ports:
            - "8001:5432"
      

      在本例中,您可以使用“db”来引用 Web 应用程序中的数据库 IP。

      【讨论】:

      • 学习 docker-compose 方法是我的学习路径。但现在,我首先尝试让独立容器更舒服:)
      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      相关资源
      最近更新 更多