前言
最近在开发一个前后端分离项目(前端Vue 3,后端.NET 10 + ABP 9)。目前刚做完用户登录和前后端联调。为了让本地开发环境更加整洁,我决定将本地原本运行的MySQL和Redis迁移到Docker容器中运行。
在配置和安装过程中,遇到了一些由于环境冲突和粗心导致的“小插曲”,特此整理记录,希望能给遇到类似问题的同学提供参考。
一、 解决 Docker Desktop 启动无限转圈问题
1. 现象
首次运行 Docker Desktop 时,界面一直卡在 Starting the Docker Engine... 循环转圈。在任务管理器里结束它,后台服务又会自动把它拉起来。
2. 原因与解决
这大概率是由于上一次安装过程中某些底层组件损坏或配置冲突导致的。仅仅卸载重装由于残留数据的存在往往不起作用。
解决步骤:
停止后台自动拉起:以管理员身份运行 CMD,停止服务并强制杀死进程:
codeCmd
net stop com.docker.service taskkill /F /IM "Docker Desktop.exe" taskkill /F /IM "com.docker.backend.exe" wsl --shutdown清理卸载残留(防止再次继承错误环境):
在控制面板卸载 Docker 后,去手动删除以下三个残留文件夹:C:\Users\<用户名>\.docker
C:\Users\<用户名>\AppData\Local\Docker(旧虚拟磁盘的藏身处,务必删除)
C:\Users\<用户名>\AppData\Roaming\Docker
彻底注销旧虚拟机分发:
在 CMD 中执行,抹掉旧的容器系统残留:codeCmd
wsl --unregister docker-desktop wsl --unregister docker-desktop-data升级底层的 WSL 组件:
执行命令将 WSL 升级到最新的 2.7.8 版本:codeCmd
wsl --update纯净重装:
重新下载并安装 Docker Desktop。这一次,环境被彻底净化,启动后瞬间秒开,进入了正常的主界面!
二、 将本地 MySQL + Redis 一键迁移至 Docker
在开发阶段,使用 Docker 跑数据库和缓存(MySQL+Redis),代码在本地 IDE 中调试,既能享受热更新,又能保持宿主机整洁。
1. 备份本地数据库
在停用本地数据库前,先用 Navicat 连接本地 MySQL,将项目数据库导出为 backup.sql(包含结构和数据)。
2. 停用本地服务,释放 3306 端口
由于 Docker 里的 MySQL 默认也要使用 3306 端口,需要先停掉 Windows 原生服务:
Win + R 输入 services.msc 打开服务列表。
找到MySQL80服务,将其启动类型改为“手动”,并点击“停止”。
3. 创建 docker-compose.yml
在一个干净的文件夹(如 E:\Docker)下创建配置文件 docker-compose.yml,一键拉起 MySQL 和 Redis:
codeYaml
version: '3.8' services: # 1. MySQL 数据库服务 my-mysql: image: mysql:8.0 container_name: abp-mysql restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword123 # 这里是 Docker 里的 MySQL 密码 ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql # 2. Redis 缓存服务(ABP 运行极其依赖它) my-redis: image: redis:alpine container_name: abp-redis restart: always ports: - "6379:6379" volumes: mysql-data:4. 极速一键启动与数据恢复
在 VS Code 的终端或在该文件夹路径下打开 CMD,运行命令:
codeBash
docker compose up -d等待拉取完成后,打开 Navicat 新建连接,连接到 127.0.0.1:3306(密码:rootpassword123)。
新建与原来同名的数据库 inspect_system(字符集选 utf8mb4,排序规则选 utf8mb4_0900_ai_ci)。
在新库上右键点击,运行 SQL 文件,导入我们之前导出的 backup.sql。
三、 一个粗心引发的小乌龙:Access denied for user 'root'@'172.18.0.1'
在配置好一切后,我满怀信心地启动 .NET 后端程序,结果控制台直接抛出了异常:
MySqlException: Access denied for user 'root'@'127.0.0.1' (using password: YES)
排查后发现,纯属我个人的一个低级失误:
我连接本地数据库的密码和在 docker-compose 里设置的 MYSQL_ROOT_PASSWORD(rootpassword123)不一致。但我忘记去后端项目的 appsettings.json 中修改连接字符串里的 Pwd 参数了。
解决办法:
直接将连接字符串中的密码和数据库名改为最新的配置:
codeJSON
"ConnectionStrings": { "Default": "Server=127.0.0.1;Port=3306;Database=inspect_system;Uid=root;Pwd=rootpassword123;Character Set=utf8mb4;" }修改后保存,再次启动项目,数据瞬间连通,Vue 3 前端联调成功,登录和数据拉取完全正常!
总结
通过这次折腾,主要收获了两点经验:
重装 Docker 之前一定要彻底清理卸载残留,尤其是 AppData 下的虚拟磁盘缓存和 WSL 注册信息,否则重装也会继承之前的安装错误。
配置连接字符串时,千万要仔细核对密码。这种由于自己粗心导致的数据库拒绝连接错误,往往一不留神就会折腾大半天。
把 MySQL 和 Redis 托管给 Docker 后,本地开发环境清爽了许多。后续功能开发可以继续愉快地推进了!