我有一个使用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
.