如何在两个docker容器(mssql和.net core app)之间进行通信,Connection Connection 127.0.0.1:1433

时间:2018-06-12 13:05:46

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

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

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

以下是.net core 2.0 app中的连接字符串。

"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 - 捕获了内部异常)---&gt;   System.AggregateException:发生一个或多个错误。 (连接   拒绝127.0.0.1:1433)---&gt;   System.Net.Internals.SocketExceptionFactory + ExtendedSocketException:   连接被拒绝127.0.0.1:1433

注意:当我通过IDE(visual studio)运行我的.net应用程序并使用db作为docker mssql容器时,此方法正常。我分开运行这两个容器。然后我尝试使用docker-compose运行,但没有用。

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

2 个答案:

答案 0 :(得分:3)

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

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

这比将容器附加到同一网络命名空间更容易处理并更容易处理容器扩展/更新。

答案 1 :(得分:0)

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