一、简介
Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。 例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
官网地址:https://min.io/
二、Docker部署MinIo
2.1 拉取镜像
docker pull minio/minio
使用如下命令查看是否已经拉取到本地
docker images
2.2 创建目录
mkdir -p /software/minio/config #用来存放配置
mkdir -p /software/minio/data #用来存储上传文件
2.3 创建MinIo容器并运行
docker run \
--name minio \
-p 9000:9000 \
-p 9090:9090 \
-d \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /software/minio/data:/data \
-v /software/minio/config:/root/.minio \
minio/minio server /data --console-address ":9090" --address ":9000"
2.4 创建网络并加入(可选)
# 创建网络
docker network create liming
# 查看网络
docker network ls
# 将minio容器加入到自己的网络
docker network connect liming minio
2.5 查看是否启动成功
docker ps
三、MinIO核心概念
下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。
对象(Object)
对象是实际的数据单元,例如我们上传的一个图片。
存储桶(Bucket)
存储桶是用于组织对象的命名空间,类似于文件夹。每个存储桶可以包含多个对象。
端点(Endpoint)
端点是MinIO服务器的网络地址,用于访问存储桶和对象,例如
http://192.168.10.101:9000
注意:
9000
为MinIO的API的默认端口,前边配置的9090
以为管理页面端口。Access Key 和 Secret Key
Access Key是用于标识和验证访问者身份的唯一标识符,相当于用户名。
Secret Key是与Access Key关联的密码,用于验证访问者的身份。
四、MinIO管理页面操作
4.1 登录
- 访问:http://ip:9090 或者 http://ip:9000
- 用户名:minio
- 密码:minio123
4.2 创建存储桶
4.3 上传文件
4.4 访问文件
由于MinIO提供了HTTP访问功能,所以可以通过浏览器直接访问对象。对象URL为MinIO的
Endpoint
+对象的存储路径
,例如下图中的图片对象的URL为http:ip:9000/test/20210624192032101.png。
不出意外的话,使用浏览器访问上述URL,会得到如下响应,很显然是没有访问权限
若想继续访问图片,需要修改图片所在桶的访问权限,如下图所示
如上图所示,可选的访问权限共有三个选项,分别是Private
、Public
和Custom
,具体说明如下:
Private
: 只允许桶的所有者对该桶进行读写。Public
: 允许所有人对该桶进行读写。Custom
: 自定义访问权限。
若想将权限设置为只允许所有者写,但允许所有人读,就需要自定义访问权限。自定义访问权限,需要使用一个规定格式的JSON字符串进行描述,具体格式可参考官方文档。
例如以下JSON字符串表达的含义是:允许(Allow
)所有人(*
)读取(s3:GetObject
)指定桶(test
)的所有内容。
重新访问图片查看是否正常,图片正常显示
五、MinIO Java SDK
MinIO提供了多种语言的SDK供开发者使用,本文介绍Java SDK,下面通过一个简单案例熟悉一下其基本用法,具体内容可参考官方文档。
创建一个Maven项目(过程省略)
引入如下依赖
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.10</version> </dependency>
编写如下内容
package com.liming; import io.minio.*; import io.minio.errors.MinioException; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; /** * Hello world! */ public class App { public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException { try { //构造MinIO Client MinioClient minioClient = MinioClient.builder() .endpoint("http://192.168.10.101:9000") .credentials("minio", "minio123") .build(); //创建hello-minio桶 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("hello-minio").build()); if (!found) { //创建hello-minio桶 minioClient.makeBucket(MakeBucketArgs.builder().bucket("hello-minio").build()); //设置hello-minio桶的访问权限 String policy = """ { "Statement" : [ { "Action" : "s3:GetObject", "Effect" : "Allow", "Principal" : "*", "Resource" : "arn:aws:s3:::hello-minio/*" } ], "Version" : "2012-10-17" }"""; minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket("hello-minio").config(policy).build()); } else { System.out.println("Bucket 'hello-minio' already exists."); } //上传图片 minioClient.uploadObject( UploadObjectArgs.builder() .bucket("hello-minio") .object("1.jpeg") .filename("C:\\Users\\lsx\\Pictures\\1.jpeg") .build()); System.out.println("上传成功"); } catch (MinioException e) { System.out.println("Error occurred: " + e); } } }
查看图片