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等环境变量,确保代码能正确读取。
验证操作
- 停止并清理现有容器:
docker-compose down - (可选)重置数据库数据卷:
docker volume rm your_project_name_datafiles - 重新构建并启动服务:
docker-compose up --build - 查看web服务日志排查问题:
docker-compose logs web
内容的提问来源于stack exchange,提问作者Sasan
相关产品推荐
相关产品推荐

