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

Docker Desktop运行.NET Core API时无法连接MySQL实例求助

解决Docker中.NET Core API无法连接MySQL的问题

1. 修正MySQL连接端口

容器间通过Docker网络通信时,必须使用容器内部的端口,而非宿主机映射的端口。你的database服务内部MySQL运行在3306端口,但代码中连接字符串误用了宿主机映射的3307端口,这是连接失败的核心原因。

修改ConfigureServices中的端口配置:

public void ConfigureServices(IServiceCollection services)
{
    var host = "database";
    var port = "3306"; // 替换原有的3307
    var password = Configuration["MYSQL_PASSWORD"] ?? Configuration.GetConnectionString("MYSQL_PASSWORD");
    var userid = Configuration["MYSQL_USER"] ?? Configuration.GetConnectionString("MYSQL_USER");
    var usersDataBase = Configuration["MYSQL_DATABASE"] ?? Configuration.GetConnectionString("MYSQL_DATABASE");

    var connectionString = $"server={host}; userid={userid};pwd={password};port={port};database={usersDataBase}";
    services.AddDbContext<EFDbContext>(
        options => options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString))
            .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking), ServiceLifetime.Transient);
}

2. 处理MySQL服务就绪延迟

depends_on仅保证容器启动顺序,无法确保MySQL服务已完全启动并接受连接。可以通过两种方式解决:

方式一:添加健康检查(推荐)

修改docker-compose.yml中的database服务,添加健康检查配置,让web服务等待MySQL就绪后再启动:

database:
  image: mysql:8.0.28
  ports:
    - "3307:3306"
  volumes:
    - datafiles:/var/lib/mysql
    - "~/sql-scripts/setup.sql:/docker-entrypoint-initdb.d/1.sql"
  restart: always
  environment: 
    MYSQL_ROOT_PASSWORD: ******
    MYSQL_USER: sa
    MYSQL_PASSWORD: ******
    MYSQL_DATABASE: Pand
  networks:
     - hub_network
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p******"]
    interval: 5s
    timeout: 5s
    retries: 5

同时更新web服务的depends_on,添加健康检查依赖:

web:
  build: .
  ports: 
    - "8090:80"
  depends_on:
    database:
      condition: service_healthy
    selenium-hub:
      condition: service_started
    chrome:
      condition: service_started
  restart: always
  networks:
    - hub_network
  environment: 
    - DBHOST=database
    - ASPNETCORE_ENVIRONMENT=Development
    - MYSQL_PASSWORD=******
    - MYSQL_USER=sa
    - MYSQL_DATABASE=Pand

方式二:启动脚本等待

在API的Dockerfile中添加启动脚本,等待MySQL端口就绪后再启动服务:

# 先安装netcat用于端口检测
RUN apt-get update && apt-get install -y netcat

# 替换原ENTRYPOINT
ENTRYPOINT ["sh", "-c", "until nc -z database 3306; do sleep 1; done; dotnet YourApiAssemblyName.dll"]

3. 统一环境变量配置

建议将数据库敏感信息通过Docker环境变量传递,避免在配置文件中硬编码。如上述docker-compose配置中,给web服务添加MYSQL_PASSWORD、MYSQL_USER等环境变量,确保代码能正确读取。

验证操作

  1. 停止并清理现有容器:docker-compose down
  2. (可选)重置数据库数据卷:docker volume rm your_project_name_datafiles
  3. 重新构建并启动服务:docker-compose up --build
  4. 查看web服务日志排查问题:docker-compose logs web

内容的提问来源于stack exchange,提问作者Sasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:48:23