MinIO 技术分享:自建 S3 兼容对象存储与 Spring Boot 集成实践
作者注:随着云原生、微服务和大数据的普及,对象存储在企业开发中的应用越来越广泛。本文将带你快速了解 Amazon S3 与 MinIO 的关系,并通过 Docker 部署 MinIO、配置访问策略,以及在 Spring Boot 项目中集成 AWS S3 SDK 来访问 MinIO。
1. 什么是 Amazon S3?
S3 全称 Simple Storage Service(简单存储服务),是亚马逊 AWS 在 2006 年推出的公共云对象存储服务。
它的核心特点:
- 可以存储任意类型数据(文本、图片、视频、日志、备份等)
- 使用 桶(Bucket) 组织数据,桶内文件称为 对象(Object)
- 数据唯一标识 = 桶名 + 对象名
- 提供 HTTP/HTTPS API(REST / SDK)进行上传、下载、管理
- 高可用、高持久,适用于海量非结构化数据
在 S3 权限策略中,常见的概念:
- 操作:如
s3:GetObject
(下载对象)、s3:PutObject
(上传对象) - 资源 ARN:如
arn:aws:s3:::mybucket
(桶)、arn:aws:s3:::mybucket/*
(桶内对象)
2. 什么是 MinIO?
MinIO 是一个 开源、自托管、与 Amazon S3 API 100% 兼容 的对象存储服务器。
- 不是 AWS 官方 S3,但 API 协议完全兼容
- 可部署在本地机房、云服务器、Kubernetes 等
- 支持自建文件存储、备份存储、图片/视频分发等场景
- 由于完全兼容 S3 API,任何访问 S3 的代码/工具,只需修改endpoint、access key、secret key 就可以访问 MinIO
常见 S3 API 权限(MinIO 也支持):
- 下载:
s3:GetObject
- 上传:
s3:PutObject
- 列出对象:
s3:ListBucket
- 整桶资源 ARN 示例:
arn:aws:s3:::mybucket
+arn:aws:s3:::mybucket/*
3. Docker 安装 MinIO
首先,部署 MinIO 服务器:
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-v /data/minio/data:/data \
-v /data/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin123" \
quay.io/minio/minio server /data --console-address ":9001"
参数说明:
-p 9000:9000
→ S3 API 端口-p 9001:9001
→ Web 控制台端口MINIO_ROOT_USER
/MINIO_ROOT_PASSWORD
→ 管理账号(密码要求≥8位)/data
→ 对象存储数据路径(挂载到宿主机保证持久化)/root/.minio
→ MinIO 配置路径--console-address ":9001"
→ 启动 Web 控制台
访问方式:
- Web 控制台:
http://服务器IP:9001
- API 地址:
http://服务器IP:9000
4. 安装与使用 MinIO 客户端(mc)
MinIO 提供了 mc
(MinIO Client)命令行工具,方便管理桶、上传文件、设置权限。
安装 mc:
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
配置别名:
mc alias set local http://服务器IP:9000 minioadmin minioadmin123
新建桶:
mc mb local/mybucket
设置公共只读(匿名可下载)权限:
mc anonymous set download local/mybucket
文件下载 URL 格式:
http://<IP>:9000/<bucket>/<object>
例:
http://192.168.1.100:9000/lxzs/somefile.txt
5. HTTPS 支持
生产环境建议开启 HTTPS,防止明文传输 Access Key/Secret Key。
配置步骤概述:
- 获取 SSL 证书(Let’s Encrypt 或自签名)
- 将证书放到 MinIO 容器的
/root/.minio/certs
目录:public.crt private.key
- 启动 MinIO 时映射证书目录
- 使用
https://
访问
6. Spring Boot 集成 MinIO
由于 MinIO 兼容 AWS S3 API,可以直接使用 AWS 官方 S3 SDK 访问。
Maven 依赖(版本建议升级到至少 1.12.x,这里是原有的 1.11.80 示例):
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.80</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>1.11.80</version>
</dependency>
Java 示例代码:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://127.0.0.1:9000", "")
)
.withCredentials(new AWSStaticCredentialsProvider(
new BasicAWSCredentials("minioadmin", "minioadmin123")
))
.withPathStyleAccessEnabled(true)
.build();
// 上传
s3Client.putObject("mybucket", "test.txt", "Hello MinIO");
// 下载
String content = s3Client.getObjectAsString("mybucket", "test.txt");
System.out.println(content);
关键点:
endpoint
改成 MinIO API 地址- 必须
.withPathStyleAccessEnabled(true)
,否则可能因虚拟主机模式报错 region
可以传空字符串
7. 总结
- S3 是 AWS 的云对象存储服务,MinIO 是开源、自托管、S3 兼容的对象存储服务器
- MinIO 部署简单,三步即用:Docker 启动 → mc 管理 → 权限配置
- API 层兼容 AWS S3,可直接复用现有 S3 SDK 和工具
- 安全部署建议:
- 生产开启 HTTPS
- Access Key/Secret Key 不要硬编码
- 桶策略按需限制(不要随意全部公共读写)
- 数据卷记得持久化挂载,防止容器删除导致数据丢失
📌 后续进阶可参考:
- MinIO 集群部署(分布式高可用)
- 使用 MinIO Gateway 代理访问 Amazon S3、Azure Blob、GCS 等
- 对象生命周期管理 + 版本控制
- 与 CDN 结合做大文件分发