MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。MinIO 在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。
本文是在虚拟机里的 CentOS7 系统下安装 MinIO
首先,新建文件夹:
mkdir -p ~/minio/data
注: 我是用
root
用户登录,所以执行命令后新建了目录/root/minio/data
然后,使用 Docker 安装和运行 MinIO:
docker run \
--restart=always \
-d \
-p 9000:9000 \
-p 9090:9090 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
quay.io/minio/minio server /data --console-address ":9090"
注:
如果还没有安装 Docker 可以参考文章:CentOS7安装Docker
默认情况下,MinIO 会在每次服务器启动时为 MinIO 控制台选择一个随机端口。访问 MinIO 服务器的浏览器客户端会自动重定向到动态选择的端口上的 MinIO 控制台。
使用
--console-address ":9090"
指定了 MinIO 控制台的静态端口为:9090如果无法访问 9000 和 9090 端口,可能是端口没开放,可以通过以下命令来查询和开放端口:
查询端口是否开放
firewall-cmd --query-port=端口号/协议
例:查询 9000 端口是否开放
firewall-cmd --query-port=9000/tcp
打开端口
firewall-cmd --permanent --add-port=端口号/协议
例:打开 9000 端口
firewall-cmd --permanent --add-port=9000/tcp
重新载入
firewall-cmd --reload
用 Docker 成功安装和运行 MinIO 后,访问:http://192.168.200.128:9090/ 进入到 MinIO 的控制台页面
注: 这里的地址
http://192.168.200.128:9090/
是我虚拟机的 ip 地址,访问时要以自己实际的 ip 地址为主, Linux 系统下可通过ifconfig
命令来查看本机的 ip 地址
这里的 Username 和 Password 都是:minioadmin
注: 可以在使用 Docker 运行 MinIO 时通过
-e "MINIO_ROOT_USER=minioadmin"
和
-e "MINIO_ROOT_PASSWORD=minioadmin"
来指定 Username 和 Password
如果MINIO_ROOT_USER
或MINIO_ROOT_PASSWORD
未设置,则它们都默认为minioadmin
成功登录进入后,可以看到该页面:
点击 Create a Bucket 创建一个 Bucket
输入要创建的 Bucket 名称,然后点击 Create Bucket 即可创建一个 Bucket ,这里创建一个名为:test-bucket 的 Bucket
可以在 Administrator 下面的 Buckets 里查看和管理创建的 Bucket
点击 test-bucket 进入到该 Bucket 的设置页面
这里要将 test-bucket 的 Access Policy 修改为 public,设置为 public 后所有的用户都可以直接通过链接来访问对象
<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.5.1version>
dependency>
注意: 最低要求 JDK8 及以上版本
private static final MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.200.128:9000")
.credentials("minioadmin", "minioadmin")
.build();
@Test
void testUploadObject() {
try {
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket("test-bucket")
.object("pic.jpg")
.filename("D:\\images\\pic.jpg")
.build();
minioClient.uploadObject(uploadObjectArgs);
System.out.println("上传成功!");
} catch (Exception e) {
System.out.println("上传失败!");
}
}
该方法将D:\\images\\pic.jpg
文件上传到 MinIO 的test-bucket
上保存为pic.jpg
我们可以在 MinIO 的控制台中查看是否上传成功:
可以看到D:\\images\\pic.jpg
文件成功上传到 MinIO 的 test-bucket 上,文件名为 pic.jpg
我们还可以通过访问http://192.168.200.128:9000/test-bucket/pic.jpg来查看该文件
注: 在 MinIO 中存储文件的地方称为 Bucket ,Bucket 中的文件是一个 object
这里 test-bucket 就是一个 Bucket ,里面的文件 pic.jpg 是该 Bucket 的 object
@Test
void testUploadObject2() {
try {
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket("test-bucket")
.object("2023/1/14/pic.jpg")
.filename("D:\\images\\pic.jpg")
.build();
minioClient.uploadObject(uploadObjectArgs);
System.out.println("上传成功!");
} catch (Exception e) {
System.out.println("上传失败!");
}
}
这里用当前日期作为多级目录,使用方式跟上面的testUploadObject
测试方法类似,创建多级目录可以在.object("2023/1/14/pic.jpg")
里写上对应的路径来创建。运行该方法后,可以在控制台上查看是否成功上传到指定的多级目录下:
可以看到文件成功上传到指定的目录下
我们同样可以通过访问 http://192.168.200.128:9000/test-bucket/2023/1/14/pic.jpg 来查看该文件
@Test
void testRemoveObject() {
try {
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder()
.bucket("test-bucket")
.object("pic.jpg")
.build();
minioClient.removeObject(removeObjectArgs);
System.out.println("删除成功!");
} catch (Exception e) {
System.out.println("删除失败!");
}
}
该方法删除了 MinIO 的test-bucket
下的pic.jpg
文件
可以看到之前上传的pic.jpg
文件已经成功删除
@Test
void testDownloadObject() {
try {
DownloadObjectArgs downloadObjectArgs = DownloadObjectArgs.builder()
.bucket("test-bucket")
.object("2023/1/14/pic.jpg")
.filename("D:\\images\\pic2.jpg")
.build();
minioClient.downloadObject(downloadObjectArgs);
System.out.println("下载成功!");
} catch (Exception e) {
System.out.println("下载失败!");
}
}
这个方法将 MinIO 的test-bucket
下的2023/1/14/pic.jpg
文件下载到D:\\images\\pic2.jpg
运行该测试方法后,查看是否成功下载到相应的路径下:
可以看到文件成功从 MinIO 上下载下来了
package com.lin.project;
import io.minio.DownloadObjectArgs;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import io.minio.UploadObjectArgs;
import org.junit.jupiter.api.Test;
/**
* @author lin
*/
public class MinIOTest {
private static final MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.200.128:9000")
.credentials("minioadmin", "minioadmin")
.build();
@Test
void testUploadObject() {
try {
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket("test-bucket")
.object("pic.jpg")
.filename("D:\\images\\pic.jpg")
.build();
minioClient.uploadObject(uploadObjectArgs);
System.out.println("上传成功!");
} catch (Exception e) {
System.out.println("上传失败!");
}
}
@Test
void testUploadObject2() {
try {
UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
.bucket("test-bucket")
.object("2023/1/14/pic.jpg")
.filename("D:\\images\\pic.jpg")
.build();
minioClient.uploadObject(uploadObjectArgs);
System.out.println("上传成功!");
} catch (Exception e) {
System.out.println("上传失败!");
}
}
@Test
void testRemoveObject() {
try {
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder()
.bucket("test-bucket")
.object("pic.jpg")
.build();
minioClient.removeObject(removeObjectArgs);
System.out.println("删除成功!");
} catch (Exception e) {
System.out.println("删除失败!");
}
}
@Test
void testDownloadObject() {
try {
DownloadObjectArgs downloadObjectArgs = DownloadObjectArgs.builder()
.bucket("test-bucket")
.object("2023/1/14/pic.jpg")
.filename("D:\\images\\pic2.jpg")
.build();
minioClient.downloadObject(downloadObjectArgs);
System.out.println("下载成功!");
} catch (Exception e) {
System.out.println("下载失败!");
}
}
}