You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:35:18