适用场景:Windows(含家庭版,WSL 2 后端)+ Docker Desktop,本地/内网部署 MinIO 对象存储,给若依做文件/图片存储,前端可直接通过 URL 访问图片。
全程用 Docker,不下载任何本地二进制。
一、环境准备
- 安装 Docker Desktop(Windows 家庭版选 WSL 2 后端,无需 Hyper-V)。
- 启动 Docker Desktop,任务栏鲸鱼图标为稳态(不是退出/报错)。
- 确认命令行可用
docker:
docker --version
docker compose version
提示:本文命令在 PowerShell 中执行。复制命令时只复制命令本身,不要带前面的
PS C:\...>提示符,也不要把上一条命令的输出一起粘进去(否则 PowerShell 会把PS当成Get-Process而报错)。
二、用 docker-compose 部署 MinIO
在工作目录(例如 C:\Users\leven\WorkBuddy\2026-08-26-12-05-28)新建 docker-compose.yml:
services:
minio:
image: minio/minio:latest
container_name: minio
command: server /data --console-address ":9001"
ports:
- "9000:9000" # S3 兼容 API
- "9001:9001" # Web 控制台
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: changeme123456 # 改成你自己的强密码(至少 8 位)
volumes:
- ./data:/data # 数据持久化到当前目录下的 data 文件夹
restart: unless-stopped
启动:
docker compose up -d
预期输出:[+] up ... ✔ Container minio Started。
三、验证 MinIO 启动
docker ps # STATUS 应为 Up
docker logs minio --tail 20 # 应出现 API: ...:9000 / WebUI: ...:9001
浏览器打开 http://localhost:9001 ,用 MINIO_ROOT_USER / MINIO_ROOT_PASSWORD(默认 admin / changeme123456)登录。
日志里
API: http://172.x.x.x:9000是容器内部地址,不用管;端口已映射到宿主0.0.0.0:9000-9001,外部用localhost访问即可。
单盘部署会出现WARNING: Host local has more than 0 drives...,属正常提示,意思是单机无冗余,开发测试无所谓。
四、创建 Bucket(以 ruoyi 为例)
MinIO 的桶名必须小写、DNS 兼容。
通过 minio/mc 容器去操作(它要和 minio 在同一 Docker 网络,用服务名 minio 访问):
第 1 步:获取 minio 所在网络名(compose 项目名默认取目录名,网络名形如 <项目名>_default):
docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{end}}' minio
把输出记下来,下文用 ${MINIO_NETWORK} 代替(本例为 2026-08-26-12-05-28_default)。
第 2 步:建桶
docker run --rm --entrypoint sh --network ${MINIO_NETWORK} minio/mc -c "mc alias set local http://minio:9000 admin changeme123456 && mc mb --ignore-existing local/ruoyi"
预期:Bucket created successfully \local/ruoyi``。
五、生成 Access Key(供若依上传用)
桶默认是私有的,上传(写)需要 Access Key;下载可读权限我们下一步单独开。
docker run --rm --entrypoint sh --network ${MINIO_NETWORK} minio/mc -c "mc alias set local http://minio:9000 admin changeme123456 && mc admin accesskey create local --name ruoyi-key"
输出示例:
Access Key: V0NF0QF3ZM6312MICWM7
Secret Key: xxxxxxxx你的密钥xxxxxxxx
Expiration: NONE
Name: ruoyi-key
把 Access Key / Secret Key 记好,不要提交到代码仓库、不要外泄。
六、让图片可直接通过 URL 访问(匿名读)
若依前端要直接 <img src="..."> 显示图片,需要桶对"下载"开放匿名访问(不开放列举,仅知道确切文件名可下载):
docker run --rm --entrypoint sh --network ${MINIO_NETWORK} minio/mc -c "mc alias set local http://minio:9000 admin changeme123456 && mc anonymous set download local/ruoyi"
预期:Access permission for \local/ruoyi` is set to `download``。
设置后,图片可通过 http://localhost:9000/ruoyi/<文件名> 直接在浏览器打开。
想收回公开读:
mc anonymous set none local/ruoyi。
更规范但不省事的做法是不改桶权限,由后端用 SDK 生成「预签名 URL」给前端临时访问(私有、安全、可控)。
七、对接若依(RuoYi)
在若依的 application.yml(或对应配置)中填入:
minio:
endpoint: http://localhost:9000 # 若依也跑在 Docker 内同一网络则用 http://minio:9000
accessKey: 你的AccessKey
secretKey: 你的SecretKey
bucketName: ruoyi
-
Endpoint 选择:若依程序跑在 Windows 宿主上 →
http://localhost:9000;若依也跑在 Docker 容器里(同网络)→http://minio:9000。 -
图片访问地址:因为
ruoyi桶已公开读,前端直接拼http://localhost:9000/ruoyi/<文件名>即可显示,无需预签名。
不同若依版本(RuoYi-Vue 单体 / RuoYi-Cloud / 二开带 MinIO 模块)配置位置略有差异,但核心就是上面四项。若你的若依已有 MinIO 工具类,替换这四项即可。
八、常用运维命令
docker compose down # 停止并移除容器(数据在 data/ 不丢)
docker compose up -d --force-recreate # 改了 compose 后重建
docker run --rm --entrypoint sh --network ${MINIO_NETWORK} minio/mc -c "mc alias set local http://minio:9000 admin changeme123456 && mc ls local" # 列出所有桶
docker run --rm --entrypoint sh --network ${MINIO_NETWORK} minio/mc -c "mc alias set local http://minio:9000 admin changeme123456 && mc anonymous get local/ruoyi" # 查看桶权限
九、踩坑记录(Windows + Docker Desktop)
host.docker.internal解析不到
在minio/mc容器里用host.docker.internal连 MinIO 会报dial tcp: lookup host.docker.internal ... no such host(它跑去公网 DNS 查了)。
解决:让 mc 容器加入 minio 所在网络,用服务名minio:9000访问(见上文--network ${MINIO_NETWORK})。minio/mc镜像不能直接sh -c
minio/mc镜像的 ENTRYPOINT 是mc,写成docker run minio/mc sh -c "..."会变成mc sh -c "..."而报错sh is not a recognized command。
解决:加--entrypoint sh,即docker run --rm --entrypoint sh minio/mc -c "..."。PowerShell 粘贴报错
复制命令时若把PS C:\...>提示符或上一条输出一起粘进去,会触发Get-Process/CommandNotFoundException等红字。这只是粘贴姿势问题,不是 docker 失败。只复制命令那一行即可。
十、安全建议
-
MINIO_ROOT_PASSWORD用强密码,且不要和示例相同。 - Access Key 的 Secret Key 视为密码,仅存放在服务端配置/环境变量,切勿提交到 git。
- 生产环境建议:桶保持私有 + 预签名 URL;或对
ruoyi配置更细的匿名策略(仅开放特定前缀),不要整桶裸奔。 - 本文的
ruoyi公开读仅适合本地/内网测试;暴露到公网前请重新评估权限。