【分布式文件存储系统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 目录下 ‌;

相关推荐
yxy___3 小时前
达梦分布式集群DPC_重做副本-操作指南(DEM)_yxy
运维·分布式
里欧跑得慢8 小时前
Flutter 三方库 ethereum 鸿蒙分布式区块链数字资产上链钱包适配突破:接通 JSON-RPC 加密管线深入打通智能合约闭环实现高价值数字加密交互-适配鸿蒙 HarmonyOS ohos
分布式·flutter·harmonyos
2501_9333295511 小时前
技术深度拆解:Infoseek舆情系统的全链路架构与核心实现
开发语言·人工智能·分布式·架构
辣机小司13 小时前
【生产级 Kafka (KRaft) 双中心容灾演练:MirrorMaker 2.0 (MM2) 核心参数配置与回切踩坑指南】
分布式·kafka·集群同步·kafka双集群
softshow102615 小时前
SpringCloud Redis与分布式
redis·分布式·spring cloud
学渣y15 小时前
git分布式版本控制系统
分布式·git·elasticsearch
天天进步201516 小时前
源码级优化:Graphiti 的并发处理与分布式记忆存储架构
人工智能·分布式·架构
BPM_宏天低代码18 小时前
宏天CRM系统的消息中心:基于RabbitMQ的实践
分布式·rabbitmq
2501_9333295519 小时前
企业级舆情监测系统技术选型指南:Infoseek AI中台架构解析与实践评估
人工智能·分布式·重构·架构
chunyublog19 小时前
HBase 2.4.18 分布式集群搭建教程(适配 Hadoop 3.3.4 + ZooKeeper 3.5.6)
hadoop·分布式·hbase