Windows 下通过 Docker 实现 SQL 多版本共存:从环境搭建到实战操作
在日常开发或测试中,我们经常会遇到需要同时使用多个 SQL 版本的场景(例如兼容旧项目的 MySQL 5.7 和新项目的 MySQL 8.0)。直接在 Windows 系统中安装多个版本的 SQL 容易出现端口冲突、配置混乱等问题,而通过 Docker 容器化技术可以完美解决这一痛点。本文将详细介绍如何基于 Windows 自带的 WSL 环境,通过 Docker 实现 SQL 多版本的隔离与共存,步骤清晰可落地,即使是新手也能快速上手。
一、前置知识:为什么选择 WSL + Docker?
在 Windows 中运行 Docker 有两种主流方案:基于 Hyper-V 虚拟机或基于 WSL 2(Windows Subsystem for Linux)。相比 Hyper-V,WSL 2 具有启动更快、资源占用更低、与 Windows 系统集成更紧密的优势,尤其适合开发环境。
本文采用「WSL 2 + Docker Desktop」的方案,核心优势在于:
-
容器与宿主机隔离,不同 SQL 版本的配置、数据互不干扰
-
无需手动管理端口冲突(通过端口映射灵活分配)
-
环境可复制性强,换设备后只需简单配置即可复用
二、准备工作:启用 WSL 2 环境
2.1 启用 Windows 功能
首先需要开启 Windows 对 WSL 和虚拟机平台的支持,步骤如下:
-
打开「控制面板」→「程序」→「程序和功能」(或直接在 Windows 搜索栏输入「启用或关闭 Windows 功能」)
-
在弹出的窗口中,勾选以下两个选项:
-
适用于 Linux 的 Windows 子系统
-
虚拟机平台
-

3.点击「确定」,系统会自动安装所需组件,完成后提示重启电脑,点击「立即重启」。
2.2 升级 WSL 2 内核(关键步骤)
默认情况下,Windows 安装的 WSL 可能是旧版本(WSL 1),而 Docker 需要 WSL 2 支持,因此必须升级内核:
-
下载 WSL 2 最新内核更新包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
-
双击下载的
wsl_update_x64.msi,按照提示完成安装(全程下一步即可)。 -
安装完成后,设置 WSL 2 为默认版本:
打开 Windows 终端(PowerShell 或 cmd),执行命令:
wsl --set-default-version 2
2.3 安装 Linux 发行版(以 Ubuntu 22.04 为例)
WSL 需要搭配具体的 Linux 发行版使用,推荐 Ubuntu 22.04(兼容性好、社区支持完善):
方法 1:通过命令行安装(推荐,网络良好时)
在 Windows 终端中执行:
wsl --install -d Ubuntu-22.04
等待安装完成,首次启动会提示设置用户名和密码(记住此密码,后续 sudo 操作需要)。
方法 2:通过微软商店安装(网络不佳时)
-
打开「微软商店」,搜索「Ubuntu 22.04」,点击「获取」进行安装。
-
安装完成后,在开始菜单找到「Ubuntu 22.04」并启动,同样需要设置用户名和密码。
2.4 验证 WSL 环境
安装完成后,通过以下命令验证环境是否正常:
# 查看已安装的 Linux 发行版及 WSL 版本 wsl --list --verbose
若输出中 Ubuntu 22.04 的「VERSION」为 2,则说明 WSL 2 环境配置成功。
三、安装 Docker Desktop
Docker Desktop 是 Windows 下管理 Docker 容器的可视化工具,集成了对 WSL 2 的支持,步骤如下:
-
访问 Docker 官网下载安装包: https://www.docker.com/products/docker-desktop
-
双击安装包,勾选「Use WSL 2 instead of Hyper-V」(关键!确保使用 WSL 2 后端),然后点击「OK」完成安装。
-
安装完成后启动 Docker Desktop,首次启动需要登录 Docker 账号(若无账号,点击「Sign Up」免费注册即可)。
-
验证 Docker 是否正常运行:
打开 Ubuntu 终端(或 Windows 终端切换到 Ubuntu),执行:
bash
docker --version
若输出 Docker 版本信息(如:Docker version 24.0.6, build ed223bc),则说明安装成功。
四、实战:通过 Docker 部署多版本 MySQL
以 MySQL 5.7 和 MySQL 8.0 为例,演示如何实现多版本共存。
4.1 拉取 MySQL 镜像
Docker 镜像相当于软件的安装包,首先需要拉取所需版本的 MySQL 镜像:
# 拉取 MySQL 5.7 镜像 docker pull mysql:5.7 # 拉取 MySQL 8.0 镜像 docker pull mysql:8.0
拉取完成后,通过 docker images 命令可查看已下载的镜像:
docker images | grep mysql
4.2 为每个版本创建独立的数据和配置目录
为了避免容器删除后数据丢失,需要将 MySQL 的数据和配置文件挂载到宿主机(WSL 的 Linux 系统)的目录中,建议为每个版本创建独立目录:
# 为 MySQL 5.7 创建目录 sudo mkdir -p /mydata/mysql57/data # 数据存储目录 sudo mkdir -p /mydata/mysql57/conf # 配置文件目录 # 为 MySQL 8.0 创建目录 sudo mkdir -p /mydata/mysql80/data sudo mkdir -p /mydata/mysql80/conf # 授予目录权限(避免容器内权限不足) sudo chmod -R 777 /mydata
4.3 启动 MySQL 容器(核心步骤)
通过 docker run 命令启动容器,关键是通过「端口映射」区分不同版本(避免端口冲突)。
启动 MySQL 5.7 容器
docker run -d \ --name mysql57 \ # 容器名称(自定义,唯一) -p 3306:3306 \ # 端口映射:宿主机 3306 → 容器 3306 -v /mydata/mysql57/data:/var/lib/mysql \ # 挂载数据目录 -v /mydata/mysql57/conf:/etc/mysql/conf.d \ # 挂载配置目录 -e MYSQL_ROOT_PASSWORD=123456 \ # 设置 root 密码 mysql:5.7 # 使用的镜像版本
启动 MySQL 8.0 容器
docker run -d \ --name mysql80 \ # 容器名称(与 5.7 不同) -p 3307:3306 \ # 端口映射:宿主机 3307 → 容器 3306(避免与 5.7 冲突) -v /mydata/mysql80/data:/var/lib/mysql \ -v /mydata/mysql80/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0
4.4 验证容器运行状态
执行以下命令查看容器是否正常启动:
docker ps
若输出中包含 mysql57 和 mysql80,且「STATUS」为 Up X minutes,则说明启动成功。
4.5 连接 MySQL 容器
可以通过 Windows 上的数据库工具(如 Navicat、DataGrip)或命令行连接容器中的 MySQL。
命令行连接示例:
# 连接 MySQL 5.7(端口 3306) mysql -h 127.0.0.1 -P 3306 -u root -p # 输入密码 123456 后,执行 SELECT VERSION(); 验证版本 # 连接 MySQL 8.0(端口 3307) mysql -h 127.0.0.1 -P 3307 -u root -p # 同样执行 SELECT VERSION(); 验证版本
工具连接注意事项:
-
主机地址:
127.0.0.1(或 WSL 的 IP,通过wsl hostname -I获取) -
端口:5.7 对应 3306,8.0 对应 3307
-
用户名:
root -
密码:
123456(与启动容器时设置的一致)
五、关键配置与注意事项
-
端口冲突解决: 若宿主机已安装 MySQL 并占用 3306 端口,启动容器时需修改宿主机端口(如 3308:3306),确保每个容器的映射端口唯一。
-
防火墙设置: 若通过其他设备连接 Windows 上的容器,需在 Windows 防火墙中开放对应的端口(3306、3307 等): 「控制面板」→「系统和安全」→「Windows Defender 防火墙」→「高级设置」→「入站规则」→「新建规则」→ 选择「端口」,按提示开放所需端口。
-
容器管理常用命令:
命令 作用 docker stop mysql57停止 MySQL 5.7 容器 docker start mysql57启动 MySQL 5.7 容器 docker restart mysql57重启 MySQL 5.7 容器 docker rm mysql57删除 MySQL 5.7 容器(需先停止) docker logs mysql57查看容器运行日志(排查启动失败问题) -
数据持久化: 由于我们通过
-v参数将数据目录挂载到了宿主机,即使删除容器,数据也会保存在/mydata目录中,重新创建容器时只需挂载相同目录即可复用数据。
六、常见问题解决
-
WSL 启动失败: 错误提示:
WSL 2 需要更新其内核组件→ 重新安装 WSL 2 内核更新包(见 2.2 节)。 -
Docker 启动提示「WSL 2 未安装」: 打开 Docker Desktop 设置 → 「Resources」→「WSL Integration」,确保已勾选 Ubuntu 22.04 并点击「Apply & Restart」。
-
MySQL 连接超时:
-
检查容器是否启动:
docker ps -
检查端口映射是否正确:
docker port mysql57 -
检查防火墙是否开放对应端口。
-
-
拉取镜像速度慢: 可配置 Docker 镜像加速(如阿里云、网易云镜像): Docker Desktop →「Settings」→「Docker Engine」,在配置中添加:
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] # 替换为实际镜像地址
七、总结
通过「WSL 2 + Docker」的方案,我们可以轻松实现 SQL 多版本的隔离与共存,不仅解决了传统安装方式的冲突问题,还能通过容器化技术简化环境配置流程。本文以 MySQL 为例,但该方案同样适用于 PostgreSQL、SQL Server 等其他数据库,只需替换对应的 Docker 镜像和配置即可。
更多推荐


所有评论(0)