用 Docker 快速搭建 MinIO 文件服务

存储云原生可观测开发与运维

在日常开发中,我们经常需要处理文件上传、下载、存储与访问的场景,比如图片、视频、日志文件、模型数据集等。传统的文件系统难以满足高并发、分布式部署以及云原生化的需求,而 MinIO 作为一款高性能、轻量级、兼容 Amazon S3 协议的对象存储服务,正是为此而生。

本文将带你从零开始,通过 Docker 部署 MinIO 服务,并结合 Java SDK 实现文件的上传与访问。

1 拉取 Minio 镜像
  
docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z  

picture.image

2 启动 Minio 容器

我们假设你希望访问端口为 9000(API)和 9001(Web 控制台),可以这样运行:

  
docker run -d \  
  --name minio \  
  -p 9000:9000 \  
  -p 9001:9001 \  
  -v /Users/zhangyong/docker/minio/data:/data \  
  -v /Users/zhangyong/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"  

01 参数说明

  • -p 9000:9000 :MinIO API 服务端口
  • -p 9001:9001 :Web 控制台端口
  • -v /Users/zhangyong/docker/minio/data:/data :映射数据目录
  • -v /Users/zhangyong/docker/minio/config:/root/.minio :保存配置
  • MINIO\_ROOT\_USERMINIO\_ROOT\_PASSWORD :管理员账号密码
  • server /data --console-address ":9001" :指定数据目录并启用控制台端口

02 启动后访问

picture.image

3 上传文件

MinIO (以及所有兼容 S3 的对象存储系统)中,桶(Bucket) 是最顶层的逻辑存储单元,可以理解为一个“命名空间”或“大文件夹”,它是所有对象(文件)的容器。

MinIO 不存在真正的目录结构,而是通过对象 key 的前缀来模拟目录层级

例如,我们可以创建一个 bucket 叫 datasets ,数据集下面的文件对象如下:

  
datasets/  
 ├── mydataset1/  
 │    ├── train/image1.jpg  
 │    └── train/image2.jpg  
 └── mydataset2/  
      ├── data.csv  
      └── labels.txt  

虽然看起来像目录树,但实际上存储系统中只有对象:

  
datasets/mydataset1/train/image1.jpg  
datasets/mydataset1/train/image2.jpg  
datasets/mydataset2/data.csv  
datasets/mydataset2/labels.txt  

MinIO 客户端(mc)或 SDK(Java/Python)在列举对象时,会自动把这些前缀识别为“目录”。

接下来,我们按照流程上传文件。

1、创建桶 datasets

picture.image

2、创建新路径 mydataset1

picture.image

3、上传图片

picture.image

4 访问授权

1、修改桶的访问策略

picture.image

图中,我们需要将访问策略从 Private 修改成 Public 。

picture.image

2、访问图片

MinIO 地址:http://localhost:9000

桶名:datasets

对象路径:mydataset1/父与女.png

因为桶已经设置为 Public ,所以我们可以直接访问如下的链接即可:

picture.image

5 Java 示例

01 创建 Access Key

picture.image

picture.image

02 Minio 上传示例

1、添加依赖

  
<dependency>  
    <groupId>io.minio</groupId>  
    <artifactId>minio</artifactId>  
    <version>8.5.10</version>  
</dependency>  

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("yHxFBiulXKsuhbg9nHqO", "qmsQU4JuWuwlr3ZgY4eMFbQ9LaTzzEHMV6T722kC")  
                    .build();  
  
            // 2. 文件信息  
            String bucketName = "datasets";  
            String objectName = "mydataset1/images/xiaoyuanjiang.webp"; // 上传路径(类似目录)  
            String filePath = "/Users/zhangyong/Pictures/xiaoyuanjiang.webp"; // 本地文件路径  
  
            // 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();  
        }  
    }  
}  

3、执行效果

picture.image


最后欢迎加入苏三的星球,你将获得:SaaS点餐系统(DDD+多租户)、100万QPS短链系统(超过并发)、复杂的商城微服务系统(分布式)、苏三AI项目、刷题吧小程序、秒杀系统、商城系统、码猿简历网站、代码生成工具等9个项目的源代码、开发教程和技术答疑。 系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。

还有1V1免费修改简历、技术答疑、职业规划、送书活动、技术交流。

扫描下方二维码,可以加入星球:

picture.image

数量有限,先到先得。 目前星球已经更新了6100+篇优质内容,还在持续爆肝中.....

星球已经被官方推荐了3次,收到了小伙伴们的一致好评。戳我加入学习,已有2000+小伙伴加入学习。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论