【分布式文件存储系统Minio】使用Docker快速搭建 MinIO文件存储服务以及JAVA

一、MinIO介绍(概述)

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片、视频、文档。Golang语言实现,配置简单,单行命令可以运行起来。

MinIO是一个高性能、分布式对象存储系统,专为大规模数据基础设施而设计,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。

它一大特点就是轻量,使用简单,功能强大,支持各种平台,单个文件最大5TB,兼容 Amazon S3接口,提供了 Java、Python、GO等多版本SDK支持。

本文将带你从零开始,通过 Docker 部署 MinIO 服务,并结合 Java SDK 实现文件的上传与访问。无论你是想在本地搭建一个轻量文件中心,还是为企业内部系统构建一个可扩展的对象存储方案,这篇文章都能帮你快速上手。

官网:https://min.io

中文: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_USERMINIO_ROOT_PASSWORD:管理员账号密码
  • server /data --console-address ":9001":指定数据目录并启用控制台端口

三、MinIO Web控制台配置

  1. 启动后访问
  • 控制台地址(其他设备访问注意修改localhost为具体访问域名):http://localhost:9001
  • 登录账号:admin
  • 登录密码:admin123456
  1. 设置创建文件存储桶

进入创建

设置桶名称,创建

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

  1. 上传资源文件(图片、文档、视频等等)或资源文件夹
  1. 访问授权

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

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

四、MinIO API 服务调用示例

以Java 为例如下实现:

1.创建对接 Access Keys

创建之后会弹出一个窗口提示你下载一份刚刚创建的对接key内容json,可下载保存在本地,把json中的key对接内容发到java项目的配置文件中提供程序对接使用即可。

  1. 通过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 目录下 ‌;

相关推荐
2401_848009722 小时前
rabbitmq的高级知识-ttl与死信队列
分布式·rabbitmq·java-rabbitmq
wangjinxun3 小时前
LLM Xinference 安装使用(支持CPU、Metal、CUDA推理和分布式部署)
分布式
你这个代码我看不懂6 小时前
POD重启问题排查
分布式
无心水8 小时前
【任务调度:框架】10、2026最新!分布式任务调度选型决策树:再也不纠结选哪个
人工智能·分布式·算法·决策树·机器学习·架构·2025博客之星
上海锟联科技9 小时前
什么是DAS分布式光纤声波传感系统?原理与应用解析
数据结构·分布式·算法·分布式光纤传感
茶本无香9 小时前
【无标题】Kafka 系列博文(一):从零认识 Kafka,到底解决了什么问题?
java·分布式·kafka
czlczl200209259 小时前
插入时先写DB后写Redis?分布式中传统双写模式的缺陷
数据库·redis·分布式
斯普信专业组10 小时前
Kafka集群数据迁移方案:基于MirrorMaker2的集群迁移实施步骤
分布式·kafka·linq
yatum_201411 小时前
Hadoop 三种核心运行模式(伪分布式/分布式/混合模式)全总结
hadoop·分布式·wpf