如何在两个 docker 容器(mssql 和 .net 核心应用程序)之间进行通信,连接被拒绝 127.0.0.1:1433
How to communicate between two docker containers (mssql and .net core app) got Connection refused 127.0.0.1:1433
我有一个使用 mssql server 的 .net core 2.0
项目。我在 9090:9090
上为我的 .net core 2.0
和 运行ning 创建了一个 docker image
和容器。我创建它如下所示。
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 核心应用程序有数据库种子。每次它给我一个错误说
Unhandled Exception: System.Data.SqlClient.SqlException: A
network-related or instance-specific error occurred while establishing
a connection to SQL Server. The server was not found or was not
accessible. Verify that the instance name is correct and that SQL
Server is configured to allow remote connections. (provider: TCP
Provider, error: 35 - An internal exception was caught) --->
System.AggregateException: One or more errors occurred. (Connection
refused 127.0.0.1:1433) --->
System.Net.Internals.SocketExceptionFactory+ExtendedSocketException:
Connection refused 127.0.0.1:1433
注意:当我通过 IDE(visual studio) 运行 我的 .net 应用程序并将 db 用作 docker mssql 容器。我运行这两个容器分开。然后我尝试使用 docker-compose
运行,但没有成功。
我做错了什么。希望您对此有所帮助。
所以这里的问题是 docker 沙盒。对于您 运行 的每个容器,您可以将其视为具有自己的主机名、IP 地址和网络的不同虚拟环境。使用 -p
时仅将端口从内部网络转发到主机。因此,当您从 VS 运行ning 时,您可以使用 localhost (127.0.0.1:1433)
指向您的数据库,因为您已经将该端口公开给主机并且您的应用程序直接在主机上启动。当它 运行 在它自己的容器中时 localhost
不再指代主机而是指那个 docker 环境。要解决此问题,您可以 运行 同一网络中的两个容器(运行 上的 --network
参数)并通过主机名从一个到另一个引用([=24 上的 --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
.
默认情况下,每个容器都有自己的网络命名空间。 Compose 会将所有容器放在共享网络上,并在 DNS 中为服务名称设置一个别名。因此,要在容器之间进行连接,您需要做的就是指向您的服务名称而不是 127.0.0.1(假设 mysql 是您的服务名称):
"DefaultConnection": "Server=mysql;Database=mydatabase;UserId=SA;Password=mydbpassword"
这比将容器附加到同一个网络名称空间更便携,并且处理容器 scaling/updating 更好。
我有一个使用 mssql server 的 .net core 2.0
项目。我在 9090:9090
上为我的 .net core 2.0
和 运行ning 创建了一个 docker image
和容器。我创建它如下所示。
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 核心应用程序有数据库种子。每次它给我一个错误说
Unhandled Exception: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 35 - An internal exception was caught) ---> System.AggregateException: One or more errors occurred. (Connection refused 127.0.0.1:1433) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:1433
注意:当我通过 IDE(visual studio) 运行 我的 .net 应用程序并将 db 用作 docker mssql 容器。我运行这两个容器分开。然后我尝试使用 docker-compose
运行,但没有成功。
我做错了什么。希望您对此有所帮助。
所以这里的问题是 docker 沙盒。对于您 运行 的每个容器,您可以将其视为具有自己的主机名、IP 地址和网络的不同虚拟环境。使用 -p
时仅将端口从内部网络转发到主机。因此,当您从 VS 运行ning 时,您可以使用 localhost (127.0.0.1:1433)
指向您的数据库,因为您已经将该端口公开给主机并且您的应用程序直接在主机上启动。当它 运行 在它自己的容器中时 localhost
不再指代主机而是指那个 docker 环境。要解决此问题,您可以 运行 同一网络中的两个容器(运行 上的 --network
参数)并通过主机名从一个到另一个引用([=24 上的 --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
.
默认情况下,每个容器都有自己的网络命名空间。 Compose 会将所有容器放在共享网络上,并在 DNS 中为服务名称设置一个别名。因此,要在容器之间进行连接,您需要做的就是指向您的服务名称而不是 127.0.0.1(假设 mysql 是您的服务名称):
"DefaultConnection": "Server=mysql;Database=mydatabase;UserId=SA;Password=mydbpassword"
这比将容器附加到同一个网络名称空间更便携,并且处理容器 scaling/updating 更好。