news 2026/9/30 3:34:28

Windows下用Docker跑Redis:从安装踩坑到主从复制实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows下用Docker跑Redis:从安装踩坑到主从复制实战

想在自己电脑上装个 Redis 练手,结果发现官方根本没有 Windows 安装包,这事儿你碰到过没有?我最早也走了一堆弯路,到处搜"Redis Windows 下载",找到的都是民间大神编译的版本,版本老不说,服务管理、配置文件的路径各个不一样,每次换电脑都要重新折腾一遍。后来我想通了:既然 Windows 上跑 Linux 容器的最佳方案就是 Docker Desktop,那直接在 Docker Desktop 里装 Redis 不就行了嘛。这篇文章就把我从安装 Docker Desktop 到跑起 Redis、再到配置持久化和主从复制的完整过程写下来,包括那些年我踩过的"Virtualization support not detected"之类的坑,给你一个从零到能存数据、可复现的实操方案。

这篇内容适合三类人:想在 Windows 上快速搭一套 Redis 环境做练习和本地开发的开发者;刚接触 Docker、想找一个轻量项目练手的朋友;以及准备做 Redis 主从、缓存治理等进阶实验但苦于环境装不起来的同学。我会尽量把每一步背后的原因也讲清楚,不只是贴命令,这样你遇到类似问题时能自己排查。

1. 为什么我不再折腾 Windows 原生 Redis,而选择 Docker 容器方案

先说结论:在 Windows 上跑 Redis,Docker 容器是最省心、最接近生产环境的方式。这不是因为我喜欢折腾容器,而是被原生安装方式折磨过之后做出的选择。

1.1 原生安装方案里的各种坑

Redis 官方从始至终没有发布过正式支持的 Windows 版本。你能搜到的"Redis-x64-xxx.zip",基本都是第三方基于旧版本编译的产物。这类版本有几个比较尴尬的问题:

  • 版本落后,很多新特性用不上,比如 Stream 类型、Redis 8 的自动调参等新功能想都别想。
  • 服务管理方式不统一,有的用 bat 脚本启动,有的需要注册成 Windows 服务,关个窗口服务就停了。
  • 配置文件、日志目录没有统一规范,换台机器重新部署成本高。
  • 崩溃了没人管,毕竟不是官方维护,遇到 bug 基本靠重启解决。

我知道有些人会用 WSL 直接装原生 Redis,这确实是另一个可行方案,但它的重复部署体验也不够好。你在这台机器上配好的环境,换一台电脑又得重来一遍,而且 WSL 里需要手动管理 Redis 进程,没有容器的进程守护和自启动机制。所以对我来说,Docker 才是那个"一次封装、到处运行"的正解。

1.2 Docker 方案解决了什么

Docker 容器解决问题的方式很简单:把 Redis 和它依赖的运行环境一起打包成镜像,你在任何装了 Docker 的机器上都能以完全一致的方式跑起来。

具体到 Windows 上,这个方案的收益非常直接:

  • 环境隔离彻底,Redis 跑在容器里,不会污染宿主机系统。
  • 版本切换干净利落,想换 Redis 版本就改镜像标签,然后重新跑一个容器。
  • 数据持久化用数据卷(Volume)实现,容器删了数据还在。
  • 主从、集群这些架构,可以用 docker-compose 一次性拉起多个实例,比在本地装多个原生服务方便太多。

提示:Docker Desktop 对大型企业有商业授权要求。如果你的公司规模在 250 人以上或年营收超过 1000 万美元,使用 Docker Desktop 需要购买订阅。个人学习和开发完全免费。

2. 先把 Docker Desktop 装好:安装流程与 Virtualization 报错排查

这是整个流程里最容易让人血压升高的一步。Docker Desktop 本身安装不复杂,但 Windows 环境的虚拟化配置千奇百怪,报错信息也五花八门。我一个个说。

2.1 下载与安装的完整步骤

Docker Desktop 的安装,说白了就三步:下载安装包、选择后端引擎、启动验证。但每一步都有值得注意的细节。

  1. 打开 Docker 官网的 Docker Desktop 下载页面,选择 Windows 版本下载。
  2. 双击安装包,进入安装界面后会有一个引擎选择的勾选项。这里我建议勾选"Use WSL 2 instead of Hyper-V"。WSL 2 的启动速度、内存占用和兼容性都比 Hyper-V 模式好,而且 Docker Desktop 官方现在也主推 WSL 2 后端。
  3. 安装完成后点Close and restart,Windows 会重启一次以启用相关功能。
  4. 重启后打开 Docker Desktop,等左下角的鲸鱼图标稳定不动,说明 Docker Engine 已经跑起来了。
  5. 打开 PowerShell 或 CMD,运行docker version能看到客户端和服务端版本信息,就说明安装成功了。

安装包默认会装在 C 盘。如果 C 盘空间紧张,可以在安装过程中改安装路径。不过有一点要提醒你:Docker Desktop 除了安装目录,还有一个虚拟磁盘文件(ext4.vhdx),这个是 WSL 2 后端用来存放镜像和容器数据的,默认也在 C 盘。长期使用下来这个文件会越涨越大,具体怎么迁移我后面会提一下。

2.2 "Virtualization support not detected" 这类报错怎么破

很多人在启动 Docker Desktop 时会碰到这句话:

Docker Desktop failed to start because virtualization support wasn't detected.

这句话字面意思是检测不到虚拟化支持,但实际原因可能有好几种,我按照出现概率从高到低排列:

第一种:主板 BIOS 里的虚拟化开关没打开

这个最经典。Intel 平台叫 Intel VT-x,AMD 平台叫 AMD-V。重启电脑,开机时按 Del 或 F2 进入 BIOS 设置,在 CPU Configuration、Advanced 或 Security 相关菜单下找到对应的虚拟化选项,设为 Enabled,保存并重启。

判断它是否开启有一个快捷办法:打开任务管理器,切到"性能"标签页,看"虚拟化"这一项。显示"已启用"就说明 BIOS 层面没问题。

第二种:Windows 的虚拟化相关功能没开启

即使 BIOS 打开了,Windows 系统层面的功能关闭也会导致这个问题。需要检查两项:

  • "虚拟机平台"(Virtual Machine Platform)
  • "适用于 Linux 的 Windows 子系统"(Windows Subsystem for Linux)

打开方式:控制面板 -> 程序 -> 启用或关闭 Windows 功能,在列表里找到这两项,勾上并重启电脑。

如果系统提示找不到 WSL 相关项,可以在管理员权限的 PowerShell 里手动安装:

wsl --install

这个命令会把 WSL 2 内核和默认发行版一并装好。之后检查一下默认版本:

wsl --set-default-version 2

第三种:和第三方安全软件或旧版本 WSL 冲突

某些杀毒软件会把 Docker Desktop 的虚拟化进程误判为风险行为,直接拦截启动。如果你装了非常规的安全软件,可以暂时退出后重新启动 Docker Desktop 试试。

第四种:Windows 家庭版缺少 Hyper-V

Windows 10/11 家庭版没有完整的 Hyper-V 功能,但 Docker Desktop 走 WSL 2 后端并不需要 Hyper-V。只要上面两个 Windows 功能正常开启,这个报错在家庭版上也能解决。

排查完这些,再打开 Docker Desktop 一般就正常了。如果还是报同样的错,建议看下 Windows 系统更新是不是没打全,W SL 2 的组件需要较新的系统版本支持。

3. 拉取 Redis 镜像:从 docker pull 到容器启动的每一步

Docker Desktop 跑起来之后,接下来就是本篇文章的重头戏:把 Redis 容器跑起来。这个过程我拆成镜像选择、启动命令、验证三部分。

3.1 镜像怎么选:版本号和 alpine 后缀

在 Docker Hub 上搜 redis,会看到一堆镜像标签。核心要理解两个维度:一个是版本号,一个是镜像风格。

Redis 镜像的版本号直接对应 Redis 版本。目前主流生产环境大多用 7.0 到 7.4,我建议你拉redis:7.4-alpine。7.4 是 Redis 7.x 系列里比较成熟的版本,稳定性有保障。alpine 后缀代表这个镜像基于 Alpine Linux 构建,体积小、资源占用少,下载速度快。全量版和 alpine 版的功能配置方式没有本质区别,只是 alpine 里很多命令工具不存在,排查问题时少了一些辅助工具而已。

3.2 docker run 命令参数逐个拆解

拉取镜像本身很简单,docker pull redis:7.4-alpine就行。真正的关键是启动命令。这里是我常用的一条:

docker run -d \ --name redis-demo \ -p 6379:6379 \ -v D:/docker-redis/data:/data \ redis:7.4-alpine \ redis-server --appendonly yes --requirepass 123456

我逐个参数解释一下:

  • -d:后台运行容器,不会霸占当前终端窗口。
  • --name redis-demo:给容器起一个名字,后面管理容器时直接叫名字,不用记那串随机 ID。
  • -p 6379:6379:端口映射,把容器内的 6379 端口映射到宿主机的 6379 端口。这样你可以在 Windows 本机上用 127.0.0.1:6379 直接访问容器里的 Redis。
  • -v D:/docker-redis/data:/data:数据卷挂载,把宿主机 D 盘下的 docker-redis/data 目录和容器里的 /data 目录关联起来。Redis 的 RDB 持久化文件默认写在 /data 下,这样容器删了重建,数据文件还留在宿主机上。
  • redis:7.4-alpine:镜像名和标签,注意启动命令里的镜像名要放在参数后面。
  • redis-server --appendonly yes --requirepass 123456:容器启动时执行的命令,前面是启动 Redis 服务,后面追加两个配置项。--appendonly yes开启 AOF 持久化,--requirepass 123456设置访问密码。

这里有个非常容易踩的坑:配置项跟在镜像名后面会被当作容器启动命令的参数,但如果你写成:

docker run -d -p 6379:6379 redis:7.4-alpine --requirepass 123456

Redis 也能启动,但--requirepass不是 Redis 服务的合法参数,Redis 会启动失败或用默认配置启动。正确做法是像上面一样,命令和参数用redis-server作为前缀。

3.3 容器状态验证与基本故障排查

启动之后,先看容器运行状态,这是判断一切是否正常的第一道关卡:

docker ps

看到redis-demo的状态是Up,说明容器起来了。接下来验证 Redis 是否真的能响应请求:

docker exec -it redis-demo redis-cli -a 123456 ping

这个命令进入了容器内部,用 redis-cli 带密码向本地 Redis 发送一个 PING,如果返回 PONG,说明 Redis 服务完全正常。

如果容器起来了但 Redis 访问不上,大概率是 protected-mode 在作怪。Redis 默认开启 protected-mode,当它检测到连接来自非本机地址且没有配置密码时,会拒绝访问。所以如果你启动命令里没加--requirepass,从 Windows 宿主机访问容器就会收到:

DENIED Redis is running in protected mode because protected mode is enabled and no password is set.

解决方法不是关闭 protected-mode,而是补上密码。这也是我一直建议你至少设个密码的原因,既解决了访问问题,也顺手提升了安全性。

3.4 镜像下载慢的应对思路

如果你的网络环境下 Docker Hub 拉取速度不太理想,有几个务实的办法。首先是检查 Docker Desktop 的镜像源设置里有没有配置国内可用的镜像服务;其次是避开高峰期多试几次;如果拉了一大半总是失败,可以试着分步拉取或者改用体积更小的镜像标签。这些属于网络环境差异问题,我只能说没有一个放之四海而皆准的配置,但 Docker Desktop 本身的重试机制和增量下载在多数情况下是能扛过去的。

4. 连上去实操:数据类型、常用命令与客户端工具

Redis 跑起来只是万里长征第一步,真正要用好它,得理解它的数据模型。这一小节我用"能存什么、怎么存、存了怎么查"的思路,带你快速过一遍。

4.1 Redis 的五种基本数据类型和典型场景

String(字符串)

这是最基础的类型,value 可以是任意字符串,甚至可以存放序列化后的 JSON 或二进制数据。常用操作:

# 进入容器执行 redis-cli,-a 是认证密码 docker exec -it redis-demo redis-cli -a 123456 # 设置 key 为 foo,value 为 bar SET foo bar # 读取 key 的值 GET foo # 设置带过期时间的 key,单位是秒 SET code:12345 abc EX 60

String 的高频场景包括:缓存页面片段、存会话信息、用SETNX实现分布式锁,以及用INCR做计数器。

Hash(哈希)

Hash 像是一个微型的行记录,适合存对象。比如一个用户信息:

HSET user:1001 name "tom" age 30 city "beijing" HGET user:1001 name HGETALL user:1001

它省去了把整个对象序列化成一个字符串的过程,只是需要单独维护一个 key,字段增删改都很灵活。

List(列表)

Redis 的 List 是双向链表,可以从左或右两边插入和弹出,适合做简单的消息队列:

LPUSH task:queue "job1" LPUSH task:queue "job2" RPOP task:queue

LPUSH往左边塞,RPOP从右边拿,先进先出就是一个队列模型。

Set(集合)

Set 的元素是唯一的,天然支持去重。经典场景是统计某活动页面的 UV:

SADD page:20250607:uv user001 SADD page:20250607:uv user002 SADD page:20250607:uv user001 SCARD page:20250607:uv

再加一个用户,SCARD 返回的还是 2,因为 user001 已经存在了。

ZSet(有序集合)

ZSet 是 Set 的进阶版,每个元素多带了一个分数(score),按分数自动排序。排行榜是它的拿手好戏:

ZADD leaderboard 100 "playerA" ZADD leaderboard 200 "playerB" ZADD leaderboard 150 "playerC" ZRANGE leaderboard 0 -1 WITHSCORES

这个命令会按分数从低到高列出全部成员和分数。如果要做从高到低排名,用ZREVRANGE leaderboard 0 -1 WITHSCORES。

注意:上面这几个命令我直接省去了密码参数。在实际复制到终端时,如果你启用了密码,redis-cli 交互模式一般不需要每次都加 -a,但非交互模式(比如docker exec ... redis-cli -a 密码)就需要带。

4.2 可视化客户端怎么选

命令行够用,但如果你管理多个 Redis 实例,或者刚接触 Redis、想更直观地看数据,可视化客户端确实能提高效率。我用过的不外乎这几个:

  • Redis Insight:Redis 官方出的免费客户端,界面现代,官方文档直接推荐,功能覆盖浏览数据、命令行、分析诊断。你如果不想花时间比较,直接选它。
  • Another Redis Desktop Manager:一个开源的跨平台客户端,免费且更新活跃,连接 Redis 的基本操作都能覆盖,兼容性也比较稳。
  • Redis Desktop Manager:老牌工具,当时很多教程推它,但它后面部分版本开始收费。新版本也有免费 IBM 兼容版本,但配置起来稍微麻烦一点。

从学习角度出发,我推荐你先用 Redis Insight。连接时填127.0.0.1、端口6379、密码就是你启动容器时设置的123456。能看到数据树、能敲命令、能查看内存统计,作为日常调试工具足够。

4.3 容器里的 Redis 坏了怎么快速重建

容器方案一个很大的好处是:容器状态搞坏了,重建一个就行。比如你手动改了容器里的某个配置文件导致 Redis 起不来,或者误删了容器,都不需要像物理部署那样从头安装一遍。执行docker rm -f redis-demo,再用之前的 docker run 命令新启一个容器,数据因为挂载在 D 盘而完好无损。这在日常实验和开发里特别实用。

5. 从实验走向生产:数据持久化与主从复制实践

做完上面的步骤,你已经有了一个能用的 Redis 环境。但如果你要拿它做正式项目,或者想学习 Redis 的高可用架构,还需要往前再走一步。

5.1 先搞懂持久化再动手

Redis 默认是把数据存在内存里的,一旦进程退出或机器重启,内存数据直接消失。所以持久化是生产场景的硬需求。Redis 提供了两种持久化方式:

  • RDB(快照):在特定时间点把内存数据全量写入磁盘文件。优点是恢复快、文件紧凑;缺点是最后一次快照之后的数据可能会丢。触发条件和策略在 redis.conf 里通过save配置项控制。
  • AOF(追加文件):以日志形式记录每一个写命令,重启时重放日志来恢复数据。优点是丢失数据范围小;缺点是文件体积大,恢复速度慢。通过appendonly yes开启。

前面启动命令里加的--appendonly yes就是 AOF 持久化的开关。RDB 默认就是开启的,所以实际上你只要不删容器,两种持久化文件都会生成在 /data 目录下。

如果你想更精细地控制 Redis 的行为,可以写一份 redis.conf 文件挂载进容器。我的常用写法是:

appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000

启动命令稍微改一下:

docker run -d \ --name redis-demo \ -p 6379:6379 \ -v D:/docker-redis/data:/data \ -v D:/docker-redis/redis.conf:/etc/redis/redis.conf \ redis:7.4-alpine \ redis-server /etc/redis/redis.conf

注意挂载 redis.conf 时,宿主机目录下的文件必须真实存在,否则 Docker 会因为路径不存在直接创建一个空目录,Redis 发现配置文件为空就会走默认配置,绕过你所有的设置。这个坑我踩过不止一次。

5.2 用 docker-compose 拉起一主一从

Redis 主从复制是学习和实验高可用最基础的一步。主节点负责写,从节点复制主节点的数据,可以提升读能力,也为后面的哨兵模式打基础。

用 docker-compose 比逐个敲 docker run 命令更省心,配置清晰直观。先创建一个目录,比如 D:\docker-redis,在里面放一个 docker-compose.yml 文件:

services: redis-master: image: redis:7.4-alpine container_name: redis-master ports: - "6379:6379" volumes: - D:/docker-redis/master-data:/data command: redis-server --appendonly yes --requirepass 123456 redis-slave: image: redis:7.4-alpine container_name: redis-slave ports: - "6380:6379" volumes: - D:/docker-redis/slave-data:/data command: redis-server --appendonly yes --requirepass 123456 --replicaof redis-master 6379

然后在当前目录执行:

docker compose up -d

这样会启动两个容器。master 监听宿主机的 6379 端口,slave 监听 6380 端口。redis-slave的启动参数里写明了--replicaof redis-master 6379,意思是它要复制 redis-master 节点也就是 6379 端口的数据。

验证主从是否正常,可以看从节点的复制状态:

docker exec -it redis-slave redis-cli -a 123456 info replication

输出里重点关注role:slave和master_link_status:up。只要 master_link_status 是 up,说明主从链路是通的。

然后做个实际写入测试:

# 往主节点写数据 docker exec -it redis-master redis-cli -a 123456 set myname "hello" # 从从节点读数据 docker exec -it redis-slave redis-cli -a 123456 get myname

能读到同样的值,主从复制就验证通过了。这个 docker-compose 文件稍微扩展一下,就能演化出"一主多从"甚至"主从加哨兵"的结构,后续做缓存治理、分布式锁实验,底子就在这里了。

5.3 构建真实业务中的 Redis 思路

环境搭好之后,你可以带着业务问题来做实验。比如:String 的 SETNX 可以用来实现分布式锁,但锁的过期时间怎么设才不会被极端情况拖垮?缓存治理里缓存穿透、缓存击穿、缓存雪崩分别用什么 Redis 特性应对?这些问题的共性是:它们都是围绕你对 Redis 底层机制的理解展开的,而容器环境让你能随时开一个集群式的 Redis 来验证想法,而不是对着理论干想。

最后分享一个我自己的小习惯

这套环境跑通之后,我平时开发时会固定维护一个 docker-compose.yml,里面放上 Redis 和 MySQL 两个容器,目录结构统一放在 D 盘一个专门文件夹下。每次新项目上来,docker compose up -d一键拉起全套依赖,项目结束了docker compose down也不会留下脏数据。如果你打算长期在 Windows 上用 Docker 做开发,我建议你也把镜像、容器、数据卷拆开放在非系统盘,养成这种"基础设施代码化"的习惯,后面维护起来真的会省心很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 3:34:14

H5与小程序的选型指南:从运行原理到实战场景深度对比

H5 和微信小程序,这几年几乎成了前端开发绕不开的两个词。我刚入行那会儿,大家对"H5"的定义还在移动端网页和响应式布局上打转;这两年再聊,几乎每个项目都要纠结一句:这东西是做小程序还是做 H5?…

作者头像 李华
网站建设 2026/9/30 3:34:08

操作系统到底在管什么?从资源管理看懂四大特征与五大模块

很多人第一次接触“操作系统”这个概念,都是在《计算机操作系统》这门课的第一章。教材上通常会给出一句很严谨的定义:操作系统是管理计算机硬件与软件资源的系统软件。这句话背下来不难,但真到做题或者面试的时候,很多人会发现&a…

作者头像 李华
网站建设 2026/9/30 3:34:08

MySQL数据类型选型与底层存储原理:从建表设计到性能优化的完整指南

1. 老生常谈却值得重新梳理的MySQL数据类型我从刚入行时就被前辈反复叮嘱:"建表之前先把数据类型想清楚,后面会少踩很多坑。"当时觉得不就是选个int、varchar嘛,能有多大差别。直到我维护过一个因为字段类型选错而被迫重构的业务系…

作者头像 李华
网站建设 2026/9/30 3:33:01

彻底搞懂MySQL整数类型:TINYINT、INT、BIGINT选型避坑指南

实际项目里我见过不少因为整数类型选错而引发的线上事故。就拿主键来说,某平台早期用INT自增,业务跑起来之后主键一度逼近21亿,新增记录直接报错,紧急改表的那几个小时全组人都盯着监控屏。反过来,我也见过状态字段明明…

作者头像 李华
网站建设 2026/9/30 3:32:14

近似模型别较真参数:够用就好是工程优化的核心原则

1. 为什么“较真参数”反而是最坑的一步先说个我自己的真实经历。前两年接了一个结构轻量化优化的活,客户给的有限元模型网格密度已经很高了,算一次需要四十分钟起步。为了跑优化迭代,我用响应面方法做了个代理模型,前前后后花了整…

作者头像 李华
网站建设 2026/9/30 3:32:00

SQL权限管理全解:GRANT、REVOKE、角色与生产环境排坑指南

做开发这么多年,我见过不少把SQL用得飞起,却连DCL是什么都不知道的同事。其实这也不怪谁,日常工作里SELECT、JOIN、GROUP BY这些查询语句占了九成,权限配置往往就扔给DBA或者运维了。但一旦要自己搭环境、给应用配账号、排查"…

作者头像 李华