如何在两个 docker 容器(mssql 和 .net core 应用程序)之间进行通信 连接被拒绝 127.0.0.



我有一个使用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 Core 应用程序具有数据库种子。 每次它给我一个错误说

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

注意:当我通过IDE(Visual Studio(运行我的.net应用程序并使用db作为docker mssql容器时,这工作正常。我分别运行了这两个容器。然后我尝试使用docker-compose运行,但没有奏效。

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

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

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

这更具可移植性,并且比将容器附加到同一网络命名空间更好地处理容器缩放/更新。

所以这里的问题是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.

最新更新