.NET Core application in docker cannot connect to mysql server

0

I have a .NET Core application running in docker.

For the connection string:

 "Server=localhost;port=3306;database=xxxxx;uid=xxxxx;password=xxxxx;"

When it connects to a non-docker mysql server on the same centos server, it shows:

MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. ---> System.AggregateException: One or more errors occurred. (Connection refused 127.0.0.1:3306) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:3306
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
   at System.Net.Sockets.Socket.MultipleAddressConnectCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.TcpClient.<>c.<ConnectAsync>b__28_1(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings)
   at MySql.Data.MySqlClient.NativeDriver.Open()
---> (Inner Exception #0) System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (111): Connection refused 127.0.0.1:3306
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
   at System.Net.Sockets.Socket.MultipleAddressConnectCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.TcpClient.<>c.<ConnectAsync>b__28_1(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)<---

However I have checked port 3306 is with LISTEN status. How can I fix this issue?

mysql
docker
asp.net-core
connection-refused
asked on Stack Overflow Mar 17, 2021 by Chris • edited Mar 17, 2021 by Chris

1 Answer

0

Prologue:

Ok, I see .. You need to connect from application in docker container to the host service directly.

I've solved this problem once, but in the end I preferred to switch to the solution: app container + database container

The second problem-free option is: app container + dedicated database machine (other then docker host). Definitely I recommend changing the setup.

Solution 1:

There is an option to connect from the docker container to the host. But that's not localhost. Change the connection string to (host.docker.internal):

"Server=host.docker.internal;port=3306;database=xxxxx;uid=xxxxx;password=xxxxx;"

And if you're on linux, add the --add-host option when starting the container:

docker run --add-host host.docker.internal:host-gateway <your_image>

Solution 2 (Linux only):

Leave the connection string as is (or change server from localhost to 127.0.0.1).

Change the networking method to host:

docker run --network=host <your_image>
answered on Stack Overflow Mar 17, 2021 by Martin Osusky

User contributions licensed under CC BY-SA 3.0