我有一个使用 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
未处理的异常: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
运行,但没有用。
我在这里做错了什么。希望你对此有所帮助。
答案 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
。