Docker Compose中ASP.NET Core 6.0连接MySQL容器失败求助
ASP.NET Core 6.0 Docker容器连接MySQL失败
错误信息
workwise-aspnet-mvc-mysql-csharpemployeecrud-1 | ---> MySqlConnector.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. workwise-aspnet-mvc-mysql-csharpemployeecrud-1 | at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, MySqlConnection connection, Int32 startTickCount, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 433
问题描述
本地执行dotnet run时,应用能正常连接容器内的MySQL并完成所有CRUD操作;但通过docker compose up启动容器集群后,容器内的ASP.NET Core应用无法连接数据库。怀疑是连接字符串配置问题,但多次尝试后仍未解决。
相关配置文件
docker-compose.yml
version: '3.4' services: csharpemployeecrud: image: csharpemployeecrud build: context: . dockerfile: ./Dockerfile ports: - 5255:5255 db: container_name: 'employee_csharp' image: mysql:8.0.29 command: --default-authentication-plugin=mysql_native_password restart: always ports: - 3307:3306 environment: - MYSQL_ROOT_PASSWORD=root - TZ=America/Sao_Paulo
Program.cs
using Microsoft.EntityFrameworkCore; using CSharp_EmployeeCrud.Data; var builder = WebApplication.CreateBuilder(args); var connectionString = "server=localhost;port=3307;user=root;password=root;database=employee_csharp"; var serverVersion = new MySqlServerVersion(new Version(8, 0, 29)); // Add services to the container. builder.Services.AddControllersWithViews(); builder.Services.AddDbContext<EmployeeContext>( dbContextOptions => dbContextOptions .UseMySql(connectionString, serverVersion) // The following three options help with debugging, but should // be changed or removed for production. .LogTo(Console.WriteLine, LogLevel.Information) .EnableSensitiveDataLogging() .EnableDetailedErrors() ); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
已尝试的连接字符串配置
connectionString = "server=db;port=3307;user=root;password=root;database=employee_csharp"
connectionString = "server=db;port=3306;user=root;password=<PASSWORD>;database=employee_csharp"
connectionString = "server=localhost;port=3306;user=root;password=<PASSWORD>;database=employee_csharp"
也曾尝试省略port参数,问题依旧。
解决方案
1. 修正连接字符串核心配置
Docker Compose的默认网络中,服务之间通过服务名(即docker-compose.yml中的db)互相访问,且使用容器内部端口(MySQL默认的3306,而非映射到主机的3307)。
替换为正确的连接字符串:
var connectionString = "server=db;port=3306;user=root;password=root;database=employee_csharp";
2. 确保数据库初始化完成
MySQL容器启动需要时间加载数据,ASP.NET Core应用可能在数据库完全就绪前发起连接,导致失败。可以:
- 在
docker-compose.yml的csharpemployeecrud服务中添加启动依赖(仅保证容器启动顺序,不保证服务就绪):depends_on: - db - 或在应用中添加连接重试逻辑,例如使用
Microsoft.EntityFrameworkCore.RetryLimitExceededException捕获并重试。
3. 验证MySQL用户连接权限
默认root用户可能仅允许本地(localhost)连接,需授权其从容器网络访问:
- 进入MySQL容器:
docker exec -it employee_csharp mysql -uroot -proot - 执行授权SQL:
GRANT ALL PRIVILEGES ON employee_csharp.* TO 'root'@'%'; FLUSH PRIVILEGES;
4. 确认目标数据库存在
如果employee_csharp数据库未提前创建,连接会直接失败。可以:
- 在MySQL容器中手动创建:
CREATE DATABASE IF NOT EXISTS employee_csharp; - 或在
docker-compose.yml的db服务中挂载初始化脚本,自动创建数据库。
内容的提问来源于stack exchange,提问作者Bruno Miguel Groth
相关产品推荐
相关产品推荐

