在日常开发或测试中,我们经常会遇到需要同时使用多个 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 和虚拟机平台的支持,步骤如下:

  1. 打开「控制面板」→「程序」→「程序和功能」(或直接在 Windows 搜索栏输入「启用或关闭 Windows 功能」)

  2. 在弹出的窗口中,勾选以下两个选项:

    • 适用于 Linux 的 Windows 子系统

    • 虚拟机平台

        

3.点击「确定」,系统会自动安装所需组件,完成后提示重启电脑,点击「立即重启」。

2.2 升级 WSL 2 内核(关键步骤)

默认情况下,Windows 安装的 WSL 可能是旧版本(WSL 1),而 Docker 需要 WSL 2 支持,因此必须升级内核:

  1. 下载 WSL 2 最新内核更新包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

  2. 双击下载的 wsl_update_x64.msi,按照提示完成安装(全程下一步即可)。

  3. 安装完成后,设置 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:通过微软商店安装(网络不佳时)
  1. 打开「微软商店」,搜索「Ubuntu 22.04」,点击「获取」进行安装。

  2. 安装完成后,在开始菜单找到「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 的支持,步骤如下:

  1. 访问 Docker 官网下载安装包: https://www.docker.com/products/docker-desktop

  2. 双击安装包,勾选「Use WSL 2 instead of Hyper-V」(关键!确保使用 WSL 2 后端),然后点击「OK」完成安装。

  3. 安装完成后启动 Docker Desktop,首次启动需要登录 Docker 账号(若无账号,点击「Sign Up」免费注册即可)。

  4. 验证 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

若输出中包含 mysql57mysql80,且「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(与启动容器时设置的一致)

五、关键配置与注意事项

  1. 端口冲突解决: 若宿主机已安装 MySQL 并占用 3306 端口,启动容器时需修改宿主机端口(如 3308:3306),确保每个容器的映射端口唯一。

  2. 防火墙设置: 若通过其他设备连接 Windows 上的容器,需在 Windows 防火墙中开放对应的端口(3306、3307 等): 「控制面板」→「系统和安全」→「Windows Defender 防火墙」→「高级设置」→「入站规则」→「新建规则」→ 选择「端口」,按提示开放所需端口。

  3. 容器管理常用命令

    命令 作用
    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 查看容器运行日志(排查启动失败问题)
  4. 数据持久化: 由于我们通过 -v 参数将数据目录挂载到了宿主机,即使删除容器,数据也会保存在 /mydata 目录中,重新创建容器时只需挂载相同目录即可复用数据。

六、常见问题解决

  1. WSL 启动失败: 错误提示:WSL 2 需要更新其内核组件 → 重新安装 WSL 2 内核更新包(见 2.2 节)。

  2. Docker 启动提示「WSL 2 未安装」: 打开 Docker Desktop 设置 → 「Resources」→「WSL Integration」,确保已勾选 Ubuntu 22.04 并点击「Apply & Restart」。

  3. MySQL 连接超时

    • 检查容器是否启动:docker ps

    • 检查端口映射是否正确:docker port mysql57

    • 检查防火墙是否开放对应端口。

  4. 拉取镜像速度慢: 可配置 Docker 镜像加速(如阿里云、网易云镜像): Docker Desktop →「Settings」→「Docker Engine」,在配置中添加:

    "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]  # 替换为实际镜像地址

七、总结

通过「WSL 2 + Docker」的方案,我们可以轻松实现 SQL 多版本的隔离与共存,不仅解决了传统安装方式的冲突问题,还能通过容器化技术简化环境配置流程。本文以 MySQL 为例,但该方案同样适用于 PostgreSQL、SQL Server 等其他数据库,只需替换对应的 Docker 镜像和配置即可。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐