
一、MinIO介绍(概述)
MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片、视频、文档。Golang语言实现,配置简单,单行命令可以运行起来。
MinIO是一个高性能、分布式对象存储系统,专为大规模数据基础设施而设计,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
它一大特点就是轻量,使用简单,功能强大,支持各种平台,单个文件最大5TB,兼容 Amazon S3接口,提供了 Java、Python、GO等多版本SDK支持。
本文将带你从零开始,通过 Docker 部署 MinIO 服务,并结合 Java SDK 实现文件的上传与访问。无论你是想在本地搭建一个轻量文件中心,还是为企业内部系统构建一个可扩展的对象存储方案,这篇文章都能帮你快速上手。
中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/
二、快速搭建MinIO分布式文件存储系统
1. 拉取 Minio 镜像
我们这里使用的是支持访问上传图片的最新的MinIO旧版本,MinIO新旧版本不同,新版本只能创建库,不方便设置权限,而且不能访问上传的图片。
docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z

2. 启动 Minio 容器
我们假设你希望访问端口为 9000(API)和 9001(Web 控制台),可以这样运行
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-v /Users/river/docker/minio/data:/data \
-v /Users/river/docker/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123456" \
minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address ":9001"
对上面的参数做简单说明:
-p 9000:9000:MinIO API 服务端口-p 9001:9001:Web 控制台端口-v /Users/river/docker/minio/data:/data:映射数据目录-v /Users/river/docker/minio/config:/root/.minio:保存配置MINIO_ROOT_USER、MINIO_ROOT_PASSWORD:管理员账号密码server /data --console-address ":9001":指定数据目录并启用控制台端口
三、MinIO Web控制台配置
- 启动后访问
- 控制台地址(其他设备访问注意修改localhost为具体访问域名):http://localhost:9001
- 登录账号:
admin- 登录密码:
admin123456
- 设置创建文件存储桶
进入创建

设置桶名称,创建

增加文件存储桶的子路径(可设置也可不设置)

- 上传资源文件(图片、文档、视频等等)或资源文件夹


- 访问授权
设置指定存储桶的访问策略

去"Object Browser"目录的面板中找到桶 对应的文件,复制路径访问测试


四、MinIO API 服务调用示例
以Java 为例如下实现:
1.创建对接 Access Keys


创建之后会弹出一个窗口提示你下载一份刚刚创建的对接key内容json,可下载保存在本地,把json中的key对接内容发到java项目的配置文件中提供程序对接使用即可。
- 通过Minio API 上传示例
2.1、添加依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.10</version>
</dependency>
2.2、 编写代码对接文件存储系统
public class MinioUnitTest {
public static void main(String[] args) {
try {
// 1. 初始化 MinIO 客户端
MinioClient minioClient = MinioClient.builder()
.endpoint("http://localhost:9000") // MinIO 地址
// accessKey 和 secretKey
.credentials("bIyVsK4L5CG6HwAnRWAt", "9YMTN7932iH7vmMMMLfK6oXl3HkahdmQzlBScWDK")
.build();
// 2. 文件信息
String bucketName = "datasets";
String objectName = "datasets/current_child_path/08_avatar_middle.jpg"; // 上传路径(类似目录)
String filePath = "D:/Users/resource/08_avatar_middle.jpg"; // 本地文件路径
// 3. 上传文件(流式上传)
try (InputStream in = new FileInputStream(filePath)) {
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.stream(in, in.available(), -1)
.contentType("image/png") // 可根据文件类型设置
.build()
);
System.out.println("✅ 文件上传成功: " + objectName);
}
// 4. 拼接直链 URL(因为是 public bucket)
String publicUrl = String.format("http://localhost:9000/%s/%s", bucketName, objectName);
System.out.println("✅ 上传成功,直链地址:");
System.out.println(publicUrl);
// // 4. 生成临时访问链接(可选)
// String url = minioClient.getPresignedObjectUrl(
// GetPresignedObjectUrlArgs.builder()
// .method(Method.GET)
// .bucket(bucketName)
// .object(objectName)
// .expiry(60 * 60) // 1小时有效
// .build()
// );
// System.out.println("临时访问地址: " + url);
} catch (Exception e) {
e.printStackTrace();
}
}
}
自此结束完整的分布式文件存储服务器搭建及项目调用示例,后续需要对接测试上传、删除、下载等文件操作,以及创建、修改存储桶操作可参考官网提供的调用文档。
相关提问:
1、怎么查看我调用文件存储服务器上传的文件,都存到了服务器操作系统的哪个路径下了?
答:在 MinIO 的 Web 界面中,无法直接查看文件在宿主机或容器内的具体物理存储路径 。要确定文件实际存放在哪里,需根据 MinIO 的部署方式判断:
~ 文件存储路径由容器启动时的挂载参数(-v)决定;
~ 查看挂载路径的方法:
1.执行 docker ps 获取 MinIO 容器名称或 ID;
2.执行 docker inspect <容器名>,在输出中查找 "Mounts" 部分。
"Source":宿主机上的存储路径。"Destination":容器内的路径(通常是 /data)。
示例输出:
"Mounts": [
{
"Type": "bind",
"Source": "/mnt/minio/data",
"Destination": "/data",
"Mode": "rw"
}
]
根据上面的输出结果可判断,文件实际保存在宿主机的 【/mnt/minio/data】 目录下 ;