资讯动态

Windows安装Docker全攻略:WSL2与MySQL/Redis实战

发布时间:2026/10/2 3:16:53 来源:尧图企业网站定制
先别急着去官网下载安装包Windows 上装 Docker门槛从来不在“下载”这一步而在安装之前的架构选择、系统设置以及安装之后那一串看着就头大的报错。我这两年帮人排查过太多 Docker Desktop 启动失败的问题十个里有八个是虚拟化没开剩下两个是 WSL2 环境没配对。这篇内容就是围绕“Windows 安装 Docker”这条完整链路来写的从最容易被忽略的硬件虚拟化检查到 Docker Desktop 的安装与配置再到 MySQL、Redis 这些真实落地场景最后把我踩过的坑和排查思路全部摊开。不管你是刚接触 Docker 的新手还是已经被“virtualization support wasnt detected”这类报错折磨过的老哥照着这篇文章一步步走基本能把环境问题一次解决。1. 搞懂 Docker 在 Windows 上怎么跑WSL2 与 Hyper-V 二选一很多人装上 Docker Desktop 之后启动失败根本原因不是软件坏了而是没搞明白 Docker 在 Windows 上到底靠什么运行。Windows 本身不是 Linux 系统Docker 容器又依赖 Linux 内核特性所以必须有一个轻量级虚拟机来承接。1.1 两种引擎模式的底层逻辑Docker Desktop 在 Windows 上提供两种后端基于 WSL2 的模式和基于 Hyper-V 的模式。WSL2 是微软自己做的轻量级虚拟机全称是“适用于 Linux 的 Windows 子系统第二代”它跑的是一个完整的 Linux 内核但和传统虚拟机相比启动更快、内存占用更小和 Windows 的文件系统交互也更顺畅。Docker Desktop 会把容器塞进 WSL2 的发行版里你在 Windows 上敲 docker 命令底层其实在跟 WSL2 里的 Linux 内核对话。Hyper-V 模式则是微软的硬件虚拟化方案适合那些没装 WSL2 或者特殊场景需要的用户。但 Hyper-V 有个让人头疼的问题一旦启用会和 VMware、VirtualBox 这类第三方虚拟化软件冲突而且整个 Windows 都变成一个虚拟化平台对老电脑来说性能开销明显更大。我的建议很简单能上 WSL2 就上 WSL2。这不是偏好问题而是实测下来 WSL2 的磁盘性能、内存回收机制都更成熟而且现在的 Docker Desktop 默认也是 WSL2 模式没必要跟默认趋势对着干。注意如果你用的是 Windows 10 家庭版很多教程会告诉你“家庭版没有 Hyper-V”这话一半对一半错。家庭版确实没有完整的 Hyper-V 管理工具但 WSL2 不受影响所以家庭版用户走 WSL2 路线完全没问题。1.2 安装前的检查清单别急着下载先把这三件事确认清楚能省掉后面 80% 的报错排查时间。第一件事确认 CPU 虚拟化已经在 BIOS 里开启。Windows 任务管理器里切到“性能”选项卡看右下角有没有“虚拟化已启用”。如果显示“已禁用”说明 BIOS 里虚拟化技术没打开。Intel CPU 找“Intel VT-x”或“Intel Virtualization Technology”选项AMD CPU 找“SVM Mode”把它们改成 Enabled 再重启。这一步不做后面 Docker Desktop 启动时大概率会报“virtualisation support wasnt detected”。第二件事确认系统版本。WSL2 要求 Windows 10 2004 及以上版本或者 Windows 11。老版本先别折腾直接在设置里把 Windows 更新跑完省得后面功能安装失败。第三件事启用必要的 Windows 功能。打开“控制面板 - 程序 - 启用或关闭 Windows 功能”把这三项勾上虚拟机平台、适用于 Linux 的 Windows 子系统、Hyper-V可选但建议勾上。勾完之后提示重启就重启别拖。2. Docker Desktop 详细安装步骤检查清单过完了接下来进入正题。这一步看着简单实际上有几个细节没注意后面会连续踩坑。2.1 下载、安装与关键勾选项去 Docker 官网找 Docker Desktop for Windows下载稳定版即可。下载的时候注意两点第一认准 Windows 版本而不是 Linux 版本搞错直接白费流量第二有条件的话尽量在官方渠道下载别从第三方站随便拉你不知道包被改过什么。安装包下载好之后双击运行一路 Next 没问题但有两个地方需要手动处理。第一个是安装界面里的“Use WSL 2 based engine”勾选框。如果之前已经勾选了 WSL2 相关的 Windows 功能这个选项默认就是勾上的保持勾选状态。第二个是“Add shortuct to desktop”建议勾上方便后续日常启动。安装结束后先别急着重启如果系统提示需要重启那就重启。很多人跳过重启直接去启动 Docker Desktop结果各种服务没注册上又开始瞎折腾。2.2 WSL2 环境准备与内核更新Docker Desktop 装完之后还需要确保 WSL2 内核是新的。打开一个 PowerShell 或者 Windows Terminal输入wsl --status如果提示 WSL2 内核版本过旧或者没有安装就执行wsl --update。这个命令会从微软服务器拉取最新的 WSL2 内核比手动下 MSI 安装包省事。接着执行wsl --set-default-version 2把默认版本设为 WSL2。这一步很关键否则以后装的发行版可能会默认用 WSL1Docker 跑起来会卡到怀疑人生。如果你想在 Windows 上顺便装一个 Linux 发行版比如 Ubuntu执行wsl --install -d Ubuntu装完之后进 Ubuntu 设置一个用户名密码。这一步不是 Docker 必需的但有了这个发行版之后排查容器网络、看 Linux 日志都会方便很多。注意wsl --update如果失败多半是网络问题可以多试几次或者检查 Windows 更新是否卡住了。实在不行手动去微软官网下载 WSL2 内核更新包执行安装后再执行wsl --shutdown重启 WSL 环境。2.3 启动后的初始化与基础配置WSL2 就绪之后双击桌面上的 Docker Desktop 图标。首次启动会花一点时间托盘图标会显示 Docker Desktop is starting等它变成 Docker Desktop is running就说明引擎起来了。启动之后先别急着跑容器打开 Docker Desktop 的设置界面做三件小事。第一件事确认所用的引擎。在 Settings - General 里看 “Use the WSL 2 based engine” 是否勾选。如果在安装时漏勾了也可以在这里补上。第二件事调整资源限制。Settings - Resources - Advanced 里可以给 Docker 分配内存和 CPU。默认设置比较保守但也不建议一开始就给满后台上限设个 4GB 内存、2 个 CPU 就够日常折腾了给太多反而会和 Windows 抢内存。第三件事配置镜像仓库地址。默认的 Docker Hub 在国内访问速度可能感人在 Settings - Docker Engine 的配置 JSON 里加本地镜像地址能让后续拉取镜像的体验大幅改善。这一步的底层逻辑是Docker 在 WSL2 模式下容器实际运行在 WSL2 的虚拟机里虚拟机能拿多少 CPU 和内存由 Docker Desktop 的资源限制决定。如果之后跑 Elasticsearch、MySQL 这类吃内存的容器再根据实际情况往上调。3. 安装与启动阶段的高频报错排查安装链接和启动阶段最容易出问题这一节我把频率最高的几个报错全部拆开讲。3.1 “virtualisation support wasnt detected”的完整解法这条报错的完整提示通常是“Docker Desktop failed to start because virtualisation support wasnt detected”。看到这句话90% 的情况是 BIOS 虚拟化没开或者 Windows 功能没启用少数情况是你在虚拟机里装的 Windows宿主没开嵌套虚拟化。排查顺序按下面来第一步打开任务管理器切到“性能”选项卡找到“CPU”那一栏看右下角的虚拟化状态。如果显示“已启用”说明 BIOS 层面没问题去第二步显示“已禁用”关机进 BIOS 开启 Intel VT-x 或 AMD-V 选项重新开机。这里要提醒一句BIOS 里关于虚拟化的叫法五花八门有的叫 VT-x有的叫 Virtualization Technology还有的叫 SVM Mode本质都是一回事。第二步确认 Windows 功能里“虚拟机平台”和“适用于 Linux 的 Windows 子系统”都勾选了。有时候你单独勾了 WSL但“虚拟机平台”没勾Docker Desktop 依然会认为虚拟化未启用。这俩得同时开着。第三步如果本身就是 Windows Server 或者虚拟机环境需要额外开启嵌套虚拟化。VMware 里对虚拟机开启“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”Hyper-V 里对虚拟机启用“嵌套虚拟化”。这一步通常只在测试环境下需要家用电脑不会遇到。3.2 “start the windows daemon from a non-elevated terminal”怎么处理这条报错原文大致是“error: start the windows daemon from a non-elevated terminal; shared clients...”看起来像终端权限问题实际往往不是。根据我碰到的实际情况这条报错的核心原因通常是Docker Desktop 引擎没起来或者 docker 命令当前连接的 context 不对。你在终端里执行 docker 命令时终端会去找本地的 Docker 引擎如果引擎没运行就会拿到一条含糊其辞的报错。处理步骤先看托盘图标Docker Desktop 是否处于运行状态。如果图标都没有先从开始菜单把 Docker Desktop 启动起来等它跑到“running”状态。再在终端执行docker context ls查看当前 context。正确情况下会有一个名为 desktop-linux 的 context而且带星号标记为当前使用。如果当前 context 指向别的机器执行docker context use desktop-linux切回来。最后在终端执行docker version分 Server 和 Client 两段输出Server 段只要不是报错而是正常显示版本号就说明连接正常了。如果 Server 段显示错误再去检查 Docker Desktop 的引擎状态。提示不要习惯性地用管理员身份打开终端去跑 docker 命令Docker Desktop 官方反而不推荐这么干很多环境下反而会触发奇怪权限问题。3.3 Docker 网络不通与镜像拉取失败的排查思路“docker 网络不通”这个问题出现的频率也很高而且表现形式五花八门容器里访问不了外网、容器之间互相 ping 不到、宿主机访问容器端口超时全在这里面。先说容器内访问外网的问题。Docker Desktop 在 WSL2 模式下容器通过 NAT 走 Windows 的网络栈出去。如果公司内网或者家庭网络用了特殊的 DNS 设置容器里解析域名会失败。排查办法也很直接在容器里执行cat /etc/resolv.conf看 DNS 配置如果 DNS 有问题可以在 Docker Desktop 的 Settings - Resources - Network 里手动指定 DNS 服务器比如通用的公共 DNS 地址。这一点在企业内网环境特别实用默认 DNS 往往落在内网上解析外部域名时容易被拦。容器之间的互访最省事的做法是创建一个自定义网络然后让同网络下的容器之间通过容器名互相访问。比如执行docker network create my-net启动容器时加--network my-net容器 A 要访问容器 B 就可以直接用容器名不需要硬记 IP。原理是 Docker 内置了一个 DNS 服务在自定义网络下会自动按容器名做解析。宿主机访问容器端口连不上优先检查端口映射。假设容器内跑了 MySQL 的 3306 端口启动容器时没加-p 3306:3306那宿主机当然访问不到。加了端口映射还访问不到就用netstat -ano | findstr :3306看看端口是不是被占用了。3.4 其他经典问题与速查表除了上面几个大问题还有一些零碎的、但很常见的坑放到一起说。Docker Desktop 一直卡在 starting多半是之前某个进程没退干净。试着彻底退出 Docker Desktop然后在任务管理器里结束所有 Vmmem、docker 相关进程再重新启动。再不行就重启 Windows别嫌麻烦这是最彻底的解决方式。执行 docker pull 很慢或者直接超时除了配置镜像加速也可能是客户端和引擎之间的网络代理设置不一致。如果是公司网络环境去 Settings - Proxies 里按需配置 HTTP/HTTPS 代理并确保代理地址能从宿主机访问到。如果不在公司网络环境优先排查 DNS 和镜像源。WSL2 发行版装了好几个Docker 用得停不下来可以在 PowerShell 执行wsl --list --verbose看所有发行版确认状态是不是 Running。如果 Docker Desktop 停掉之后发行版还在狂吃内存执行wsl --shutdown可以快速释放资源。最后整理成一张避坑速查表方便收藏问题现象优先排查方向常用操作启动报错虚拟化未检测到BIOS 虚拟化开关、Windows 功能开启 VT-x/AMD-V、勾选虚拟机平台与 WSLdaemon 连接报错Docker Desktop 引擎状态、context启动 Desktop、切换 desktop-linux context拉取镜像超时DNS 配置、镜像源设置调整 Docker Engine 配置、检查网络容器访问不了外网容器 DNS、Windows 防火墙改 Docker DNS、检查防火墙宿主机访问容器失败端口映射、端口占用调整 -p 映射、netstat 查占用磁盘空间被 WSL 吃满vhdx 膨胀见下文 5.2 节压缩方案4. 装好之后先跑起来MySQL 与 Redis 实战环境搞定之后光会启动 Docker Desktop 不算本事真正要用起来得跑点实际的服务。这一节用 MySQL 8.0 和 Redis 主从两个经典场景演示一下保证你能直接照着抄。4.1 验证 Docker 环境是否可用先跑一条最经典的命令验证环境docker run hello-world这条命令会从镜像仓库拉取一个 hello-world 镜像然后在容器里输出一段提示信息。如果顺利看到内容说明 Docker 引擎、镜像拉取链路、容器运行链路都是通的。接着再看一眼版本信息docker version docker infodocker info里的信息很值得看比如容器的运行根目录、存储驱动、CPU 和内存上限能够帮你确认资源限制是否生效。搞定这一步就可以放心进入实战了。4.2 用 Docker 部署 MySQL 8.0 并持久化数据直接把 MySQL 跑在容器里很简单一条命令搞定但有一个问题必须提前想清楚容器的文件系统是临时的容器一删数据就没了。所以启动时要做两件事挂载数据卷持久化数据、映射端口供宿主机访问。docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyour_password \ -v mysql-data:/var/lib/mysql \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci逐行解释一下关键参数。-d表示后台运行。--name mysql8是容器名。-p 3306:3306把宿主机的 3306 端口映射到容器的 3306 端口以后用 Navicat 或命令行连接 localhost:3306 即可。-e MYSQL_ROOT_PASSWORDyour_password是 MySQL 镜像要求的环境变量首次初始化时会设置 root 密码。-v mysql-data:/var/lib/mysql创建了一个名为 mysql-data 的命名数据卷MySQL 的数据都写在容器里的这个路径实际会保存到宿主机的 Docker 数据卷目录里容器删掉数据也不丢。最后两个参数是 MySQL 服务端的启动参数指定字符集为 utf8mb4避免中文乱码。启动之后用 Navicat 或者命令行连接确认能登录。再试着重启容器数据是否还在。如果本地 3306 端口已经被本机安装的 MySQL 占了启动会报端口冲突这个问题的处理方式放在后面的 5.3 节。4.3 用 Docker 搭一个 Redis 主从实例Redis 的主从模式用 Docker 来搭特别方便两三个命令就把主从复制的环境和效果演示出来了。先创建一个共享网络让主从容器之间能通过容器名互相通信docker network create redis-net启动主节点docker run -d \ --name redis-master \ --network redis-net \ -p 6379:6379 \ redis:7 \ redis-server --appendonly yes--appendonly yes开启了 AOF 持久化防止容器重启丢失内存中的缓存数据。因为容器加入了 redis-net 网络所以从节点可以直接用 redis-master 这个容器名来连接主节点。启动从节点docker run -d \ --name redis-slave1 \ --network redis-net \ -p 6380:6379 \ redis:7 \ redis-server --slaveof redis-master 6379--slaveof参数告诉这个 Redis 实例去复制 redis-master 这个地址的 6379 端口的数据。Redis 新版本也可以用--replicaof替代效果相同。然后进入从节点验证复制是否成功docker exec -it redis-slave1 redis-cli info replication看到role:slave并且master_link_status:up就说明主从复制已经跑通了。在主节点里写几条数据在从节点里读一下具体数据同步的效果一目了然。如果master_link_status不是 up先检查两个容器是不是都在 redis-net 网络里再确认容器名是否正确这个是最常见的失误点。4.4 用 docker compose 把服务编排到一起容器一多手敲docker run就变得低效了。docker compose 的价值在于用一份 YAML 文件把服务编排写好以后一条命令全部拉起一条命令全部停止。在某个工作目录下新建docker-compose.ymlservices: mysql8: image: mysql:8.0 container_name: mysql8 ports: - 3306:3306 environment: - MYSQL_ROOT_PASSWORDyour_password volumes: - mysql-data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci redis-master: image: redis:7 container_name: redis-master ports: - 6379:6379 networks: - redis-net command: redis-server --appendonly yes redis-slave: image: redis:7 container_name: redis-slave ports: - 6380:6379 networks: - redis-net command: redis-server --slaveof redis-master 6379 volumes: mysql-data: networks: redis-net:上面这份配置里有两个小细节值得注意。./mysql-init:/docker-entrypoint-initdb.d是 MySQL 镜像的一个特性首次初始化数据库时会自动执行该目录下的 .sql 脚本。如果希望 MySQL 启动后自动建库建表就不需要手动进容器执行 SQL 了把 SQL 文件放到宿主机工作目录的 mysql-init 文件夹里首次启动会自动导入。另一个细节是 compose 文件里不再手动建网络而是声明了一个 redis-net 网络两个 Redis 服务都挂进去和手工docker network create效果一致。在配置文件所在目录执行docker compose up -d这个命令会根据 docker-compose.yml 里的描述自动拉取镜像、创建网络、启动服务一次全搞定。-d表示后台运行。再执行docker compose ps看服务状态。以后想停止所有服务执行docker compose down。如果修改了 compose 文件执行docker compose up -d重新同步即可。日常调试会在一个项目目录里维护一个 compose 文件目录内用./data挂载配置文件备份和迁移都方便。5. 长期使用的避坑经验与资源管理Docker 装好、服务跑起来这只是开始。长期使用之后Windows 上 Docker 的资源占用、磁盘膨胀、端口冲突问题会逐渐冒出来这里集中分享一下经验。5.1 控制 Docker 的资源占用很多人的 Windows 电脑只有 16GB 内存Docker Desktop 默认配置下WSL2 虚拟机能吃掉的资源比你想象得多。跑一个 MySQL、一个 Redis 再加一个 Elasticsearch内存轻轻松松就干到 8GB。如果不做限制电脑会变得非常卡。但限制也不能拍脑袋得先看实际需求。ES 这类搜索引擎特别吃内存启动参数里给-Xms和-Xmx设置好宿主机剩余内存又够的话就给 Docker 多分一点否则容器跑起来很容易 OOM。在 Docker Desktop 的 Settings - Resources - Advanced 里可以调 CPU 和内存这个设置针对的是整个 WSL2 虚拟机。另外所有容器共享这一个虚拟机的资源资源分配要统筹考虑别为某一个容器把内存顶满。另一个更精细的控制是在 PowerShell 里编辑用户目录下的.wslconfig文件加上这样一段[wsl2] memory6GB processors4 swap2GB这个配置会全局限制 WSL2 虚拟机的资源。即便是 docker desktop 不运行的场景只要你在用 WSL它都会生效。改完后执行wsl --shutdown再重启 WSL 才会生效。5.2 WSL2 虚拟磁盘膨胀的处理这是 Windows 上使用 Docker 最著名的坑之一。WSL2 的虚拟磁盘会随着使用不断增大而且删除镜像、清理容器之后磁盘文件并不会自动缩小。C 盘空间一天天变少直到某天发现磁盘直接满了。处理思路分两步先清理 Docker 内部的无用数据再压缩 WSL2 虚拟磁盘。第一步执行 Docker 清理docker system prune该命令会清理停止的容器、未被使用的网络、悬空镜像以及构建缓存。如果想连未被任何容器引用的镜像一并清理加-adocker system prune -a执行前它会列出将要清理的内容让你确认建议看清楚再敲 y。第二步压缩虚拟磁盘。在 PowerShell 里执行wsl --shutdown把 WSL2 虚拟机完全停掉。然后在管理员 PowerShell 里先定位 vhdx 文件路径再用 diskpart 压缩wsl --manage Ubuntu --set-sparse true对于 Docker Desktop 自带的 docker-desktop 发行版可以在 cmd 里执行wsl --list --verbose找到发行版名称然后用 diskpart 的 compact 处理 vhdx 文件。具体做法管理员打开 diskpart输入select vdisk fileC:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx然后执行compact vdisk等它完成退出 diskpart。压缩完 C 盘能腾出几 GB 甚至几十 GB效果谁用谁知道。5.3 端口冲突处理“windows 关闭端口号”是热搜词里的常见诉求其实用 Docker 的时候也会撞见。最常见的场景就是本机已经装了 MySQL占用 3306本机装了 Redis占用 6379现在又要用 Docker 再跑一个端口冲突容器启动直接失败。处理方式也很好理解。如果不想动本机服务就改容器的宿主机端口映射比如把 MySQL 映射到 3307docker run -d --name mysql8 -p 3307:3306 -e MYSQL_ROOT_PASSWORDyour_password mysql:8.0如果确信本机的服务没啥用那就先查占用再结束进程。查占用的命令netstat -ano | findstr :3306最后一列是 PID再用命令结束它taskkill /PID 12345 /F这招对排查“端口被占用导致容器启动失败”非常有效。实际项目中同一台机器可能同时跑本地版 MySQL 和容器版 MySQL更推荐的做法是本地开发环境统一用容器本机直接装客户端工具连容器就行端口冲突能少一大半。5.4 善用 docker logs 解决“启动即退出”最后补充一个排查容器启动失败的通用思路。容器启动后立刻退出的原因很多启动命令不对、依赖的服务没起来、配置文件路径挂错了。这时候别瞎猜直接看容器日志docker logs 容器名或容器IDMySQL 起不来日志里会显示权限问题或初始化错误Redis 起不来日志里会显示配置解析失败。日志里没信息再用docker inspect 容器ID看容器的完整配置和状态、环境变量有没有生效、挂载卷是不是忙。观察容器退出码也很有帮助退出码 0 代表正常运行结束非 0 就代表启动阶段出错。处理完错误后记得把我之前的容器删掉重新跑docker rm 容器名 docker run ...别老想着docker start一个之前失败的容器很多时候启动参数写错了重启一百次都是错删掉重建反而快。说到最后我还是想强调一点在 Windows 上装 Docker本质不是“装软件”而是“配环境”。那些报错看起来吓人但只要理解 Docker Desktop 依赖 Windows 虚拟化、依赖 WSL2 内核以及容器数据的持久化方式排查方向就有了。我个人经验里教训最深的就是当初不懂.wslconfig和docker system prune硬生生把 C 盘吃满了最后花了一下午清理 vhdx。这篇文章里写的东西尤其是 5.2 节那段磁盘压缩操作建议你收藏备用等真正需要的时候照着做就行。如果你按步骤跑通了 MySQL 和 Redis 那套实战那么 Windows 上装 Docker 这件事就已经真正过关了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑