.NET Core容器化后无法连接MySQL主机问题求助
解决Docker中.NET Core应用无法连接MySQL的问题
这个问题我之前也碰到过,核心原因是容器内的应用用127.0.0.1指向的是容器自身,而非docker-compose中定义的MySQL服务。下面是分步解决方案:
1. 修正数据库连接字符串
把你的连接字符串里的server=127.0.0.1替换成server=db——因为docker-compose会为每个服务创建DNS别名,服务名db就是MySQL容器在内部网络中的地址。另外注意你的连接字符串里数据库名是test,但docker-compose中配置的是onlinesmlogs,建议统一成一致的名称:
"server=db;port=3306;Database=onlinesmlogs;Uid=root;Pwd="
2. 确保MySQL服务初始化完成后再启动应用
MySQL容器启动后需要一点时间完成初始化,直接启动.NET Core应用可能会因为数据库还没准备好而报错。可以给db服务添加健康检查,让应用等待MySQL就绪后再启动:
修改你的docker-compose.yml,给db服务加上healthcheck配置,同时让onlinesm.logs服务依赖于db的健康状态:
version: '3.0' services: db: image: mysql:latest command: --lower_case_table_names=1 environment: MYSQL_DATABASE: onlinesmlogs MYSQL_USER: root MYSQL_ALLOW_EMPTY_PASSWORD: "true" volumes: - dbdata:/var/lib/mysql - _MySQL_Init_Script:/docker-entrypoint-initdb.d restart: always healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 onlinesm.logs: image: onlinesm build: context: . ports: - "8080:80" depends_on: db: condition: service_healthy volumes: dbdata: {} _MySQL_Init_Script : {}
3. 额外检查点
- 确认你的.NET Core项目中安装了正确的MySQL EF Core驱动(比如
MySql.EntityFrameworkCore),版本尽量和MySQL容器的版本兼容; - 检查
MYSQL_ALLOW_EMPTY_PASSWORD: "true"的配置是否生效,避免因为密码验证失败导致连接拒绝; - 不需要给
db服务映射宿主机端口(除非你需要从宿主机直接连接MySQL),容器内部通过服务名和3306端口就能正常访问。
按照以上步骤调整后,重新启动docker-compose,应用应该就能正常连接MySQL了。
内容的提问来源于stack exchange,提问作者Moji
相关产品推荐
相关产品推荐

