Docker容器中ASP.NET Core无法连接AWS RDS MySQL公网数据库
ASP.NET Core Web API Docker容器无法连接AWS RDS MySQL的排查方案
问题背景
我有一个ASP.NET Core Web API,需要连接AWS RDS上的公有MySQL实例(带公网IP)。用MySQL Workbench和本地HTTP模式运行应用时,都能正常连接数据库;但Docker启动应用后,API本身可以正常运行,却无法连接数据库。连接代码使用Dapper实现:
db = new MySqlConnection(masterConnection); await db.OpenAsync();
报错信息
MySqlConnector.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. at MySqlConnector.Core.ServerSession.OpenTcpSocketAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 1146 at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, MySqlConnection connection, Int32 startTickCount, ILoadBalancer loadBalancer, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 438 at MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, String logMessage, Int32 startTickCount, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ConnectionPool.cs:line 403 at MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, String logMessage, Int32 startTickCount, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ConnectionPool.cs:line 408 at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, Int32 startTickCount, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ConnectionPool.cs:line 98 at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, Int32 startTickCount, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ConnectionPool.cs:line 128 at MySqlConnector.MySqlConnection.CreateSessionAsync(ConnectionPool pool, Int32 startTickCount, Activity activity, Nullable`1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlConnection.cs:line 929 at MySqlConnector.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlConnection.cs:line 423 at coolco_backend.Data.CollectiblesData.GetCollectiblesByUserId(Int32 idUser) in E:\Apes\Proyectos\coolco-backend\Data\CollectiblesData.cs:line 28 at coolco_backend.Domain.CollectiblesDomain.GetCollectiblesByUserId(Int32 id) in E:\Apes\Proyectos\coolco-backend\Domain\CollectiblesDomain.cs:line 28 at coolco_backend.Controllers.CollectiblesController.GetContentByIdUser(Int32 idUser) in E:\Apes\Proyectos\coolco-backend\Controllers\CollectiblesController.cs:line 23 at lambda_method8(Closure, Object) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
排查与解决方案
1. 检查RDS安全组与Docker网络IP
默认Docker使用桥接网络,容器IP与宿主机IP不同。如果RDS安全组仅允许宿主机IP访问,容器会被拦截:
- 临时测试:启动容器时添加
--network host参数,让容器共享宿主机网络。若能连接,说明是安全组IP限制问题。 - 永久解决:将Docker容器所在网段(或具体容器IP)添加到RDS安全组的入站规则,开放3306端口。
2. 修正连接字符串
本地运行时的localhost或宿主机IP在容器内无效:
- 必须使用RDS的公网域名或公网IP,不要用
localhost。 - 进入容器执行
ping <RDS域名>,测试DNS解析是否正常;检查连接字符串的端口、用户名、密码是否正确。
3. 测试容器内网络连通性
进入容器内部验证网络链路:
- 执行
docker exec -it <容器ID> bash(Alpine镜像用sh)。 - 用
telnet <RDS公网IP> 3306或nc -zv <RDS公网IP> 3306测试端口连通性。若不通,排查宿主机防火墙、Docker网络规则或RDS安全组。
4. 验证MySqlConnector版本兼容性
确保MySqlConnector包版本与RDS MySQL版本匹配,部分新版本可能存在协议适配问题:
- 尝试降级或升级
MySqlConnector包,重新构建镜像测试。
5. 补充Docker镜像依赖
若使用Alpine等轻量镜像,可能缺少SSL相关依赖:
- 在Dockerfile中添加
RUN apk add --no-cache openssl,解决SSL连接失败问题。
内容的提问来源于stack exchange,提问作者D4rWiNS
相关产品推荐
相关产品推荐

