使用 Docker 快速搭建 MinIO 文件存儲服務(wù)
在日常開發(fā)中,我們經(jīng)常需要處理文件上傳、下載、存儲與訪問的場景,比如圖片、視頻、日志文件、模型數(shù)據(jù)集等。傳統(tǒng)的文件系統(tǒng)難以滿足高并發(fā)、分布式部署以及云原生化的需求,而 MinIO 作為一款高性能、輕量級、兼容 Amazon S3 協(xié)議的對象存儲服務(wù),正是為此而生。
本文將帶你從零開始,通過 Docker 部署 MinIO 服務(wù),并結(jié)合 Java SDK 實(shí)現(xiàn)文件的上傳與訪問。
1.拉取 Minio 鏡像
docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z
2.啟動 Minio 容器
我們假設(shè)你希望訪問端口為 9000(API)和 9001(Web 控制臺),可以這樣運(yùn)行:
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"1)參數(shù)說明
- -p 9000:9000:MinIO API 服務(wù)端口
- -p 9001:9001:Web 控制臺端口
- -v /Users/zhangyong/docker/minio/data:/data:映射數(shù)據(jù)目錄
- -v /Users/zhangyong/docker/minio/config:/root/.minio:保存配置
- MINIO_ROOT_USER、MINIO_ROOT_PASSWORD:管理員賬號密碼
- server /data --console-address ":9001":指定數(shù)據(jù)目錄并啟用控制臺端口
2)啟動后訪問
- 控制臺地址:http://localhost:9001
- 登錄賬號:admin
- 登錄密碼:admin123456
圖片
3.上傳文件
在 MinIO(以及所有兼容 S3 的對象存儲系統(tǒng))中,桶(Bucket) 是最頂層的邏輯存儲單元,可以理解為一個“命名空間”或“大文件夾”,它是所有對象(文件)的容器。
MinIO 不存在真正的目錄結(jié)構(gòu),而是通過對象 key 的前綴來模擬目錄層級。
例如,我們可以創(chuàng)建一個 bucket 叫 datasets ,數(shù)據(jù)集下面的文件對象如下:
datasets/
├── mydataset1/
│ ├── train/image1.jpg
│ └── train/image2.jpg
└── mydataset2/
├── data.csv
└── labels.txt雖然看起來像目錄樹,但實(shí)際上存儲系統(tǒng)中只有對象:
datasets/mydataset1/train/image1.jpg
datasets/mydataset1/train/image2.jpg
datasets/mydataset2/data.csv
datasets/mydataset2/labels.txtMinIO 客戶端(mc)或 SDK(Java/Python)在列舉對象時,會自動把這些前綴識別為“目錄”。
接下來,我們按照流程上傳文件。
1)創(chuàng)建桶 datasets
圖片
2)創(chuàng)建新路徑 mydataset1
圖片
3)上傳圖片
圖片
4.訪問授權(quán)
1)修改桶的訪問策略

圖中,我們需要將訪問策略從 Private 修改成 Public 。
圖片
2)訪問圖片
MinIO 地址:http://localhost:9000
桶名:datasets
對象路徑:mydataset1/父與女.png
因?yàn)橥耙呀?jīng)設(shè)置為 Public ,所以我們可以直接訪問如下的鏈接即可:
圖片
5.Java 示例
1)創(chuàng)建 Access Key
圖片
圖片
2.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") // 可根據(jù)文件類型設(shè)置
.build()
);
System.out.println("? 文件上傳成功: " + objectName);
}
// 4. 拼接直鏈 URL(因?yàn)槭?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)執(zhí)行效果
圖片































