【问题标题】:How to communicate between two docker containers (mssql and .net core app) got Connection refused 127.0.0.1:1433如何在两个 docker 容器(mssql 和 .net 核心应用程序)之间进行通信,连接被拒绝 127.0.0.1:1433
【发布时间】:2018-06-12 13:05:46
【问题描述】:

我有一个使用 mssql 服务器.net core 2.0 项目。我为我的.net core 2.0 创建了一个docker image 和容器,并在9090:9090 上运行。我像下面这样创建它。

docker container run --name mytestapp --publish 9090:9090 --detach my_.netapp_image_name

以下是我在 .net core 2.0 应用程序中的连接字符串。

"DefaultConnection": "Server=127.0.0.1;Database=mydatabase;UserId=SA;Password=mydbpassword"

在此之前,我为mssql server 创建了一个容器,如下所示,

docker container run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -d microsoft/mssql-server-linux:2017-latest
  • 我的 .net 核心应用程序有数据库种子。每次它给我一个错误说

未处理的异常:System.Data.SqlClient.SqlException:A 建立时发生与网络相关或特定于实例的错误 到 SQL Server 的连接。未找到或未找到服务器 无障碍。验证实例名称是否正确以及 SQL 服务器配置为允许远程连接。 (提供者:TCP 提供者,错误:35 - 捕获到内部异常)---> System.AggregateException:发生一个或多个错误。 (联系 拒绝 127.0.0.1:1433) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: 连接被拒绝 127.0.0.1:1433

注意:当我通过 IDE(visual studio) 运行我的 .net 应用程序并将 db 用作 docker mssql 容器时,这可以正常工作。我分别运行这两个容器。然后我尝试使用docker-compose 运行,但没有成功。

我在这里做错了什么。希望您对此有所帮助。

【问题讨论】:

    标签: sql-server docker docker-container .net-core-2.0


    【解决方案1】:

    默认情况下,每个容器都有自己的网络命名空间。 Compose 会将所有容器放在共享网络上,并在 DNS 中为服务名称设置别名。因此,要在容器之间进行连接,您需要做的就是指向您的服务名称而不是 127.0.0.1(假设 mysql 是您的服务名称):

    "DefaultConnection": "Server=mysql;Database=mydatabase;UserId=SA;Password=mydbpassword"
    

    这比将容器附加到相同的网络命名空间更便携,并且可以更好地处理容器扩展/更新。

    【讨论】:

    • 对我不起作用。我得到SocketException: Connection refused
    • @ThomasEyde 确保您的应用程序在数据库完成启动之前没有连接,或者使用重试循环。
    【解决方案2】:

    所以这里的问题是 docker 沙盒。对于您运行的每个容器,您可以将其视为具有自己的主机名、IP 地址和网络的不同虚拟环境。使用-p 时,仅将该内部网络的端口转发到主机。因此,当您从 VS 运行时,您可以使用 localhost (127.0.0.1:1433) 指向您的数据库,因为您已经将该端口暴露给主机并且您的应用程序直接在主机上启动。当它在自己的容器中运行时,localhost 不再指代主机,而是指该 docker 环境。要解决此问题,您可以在同一网络中运行两个容器(运行时--network 参数)并通过主机名从一个容器引用另一个容器(运行时--name 参数)。

    docker container run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \
    -p 1433:1433 --name sql1 \
    -d microsoft/mssql-server-linux:2017-latest \
    --name sql_server
    
    docker container run \
    --name mytestapp 
    --publish 9090:9090 
    --detach my_.netapp_image_name 
    --network container:sql_server
    

    并在您的设置中将您的数据库称为sql_server。 为了让这个过程不那么痛苦,你可以研究docker-compose

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2019-10-20
      • 2020-07-08
      • 1970-01-01
      • 2020-12-31
      • 2017-05-09
      相关资源
      最近更新 更多