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

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)连接,需授权其从容器网络访问:

  1. 进入MySQL容器:
    docker exec -it employee_csharp mysql -uroot -proot
    
  2. 执行授权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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:50:24