Minio服务搭建与应用

1,docker 创建服务

docker run -d  \
    --name minio \
    -p 9000:9000 \
    -p 9001:9001 \
    -v /data/minio:/bitnami/minio/data \
    -v /data/minio/config:/root/.minio \
    -v /etc/timezone:/etc/timezone:ro \
    -v /etc/localtime:/etc/localtime:ro \
    --env MINIO_ROOT_USER="admin" \
    --env MINIO_ROOT_PASSWORD="admin123" \
    bitnami/minio:latest

这里需要设置挂在目录权限,否者会:Permission denied

chmod -R 777 /data/minio

2,登录到Minio

地址为:http://localhost:9001,账号密码为在docker 运行时设置的 admin admin123

3,创建Bucket

点击”Create a Bucket.“创建一个 bucket

访问bucket需要发起websocket请求,如果使用nginx代理,nginx需要加上websocket代理:

# 开启websocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

4,设置匿名访问

设置所有文件均可匿名访问

 

5,创建 Access Key

access key 用于程序中 api访问 文件资源

 

6,java引入

(1) 引入 maven 仓依赖包

<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.6</version>
</dependency>

 (2) 初始化客户端对象

MinioClient minioClient = MinioClient.builder()
        .endpoint("http://192.168.10.126:9000")
        .credentials("VLK7P6IDlgdN1ThcEzm3", "DhxI8IgP0ZLYYlZk9p5gJ6O2mU2iW5WbyqTQdXNl")
        .build();

 (3) MultipartFile文件对象上传

// 构造一个上传文件的路径
// MultipartFile file 文件流对象
String fileName = path + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) 
        + "/" + UUID.randomUUID() 
        + Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
//构造上传文件对象
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket("test").object(fileName)
        .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
//文件名称相同会覆盖
//response 可以监听返回之
ObjectWriteResponse response = minioClient.putObject(objectArgs);

 (4) uploadObject本地文件上传

minioClient.uploadObject(
        UploadObjectArgs.builder()
    .bucket("my-bucketname")
    .object("start.sh")
    .filename("D:\\deploy\\service\\general-task\\start.sh")
    .build());

 (5) 删除文件

// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
// url = http://192.168.10.126:9000/test/upload/20231016/7f7a3b05-25bf-432d-abfe-284cf75c8d1c.png
// String bucket = "test";
String filename = URI.create(url).getPath();
filename = filename.replace("/" + bucket, ""); // 移除掉路径中的 bucket
minioClient.removeObject(
        RemoveObjectArgs.builder().bucket(bucket).object(filename).build());
System.out.println("删除文件:" + url);

(6) 客户端jq测试

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
    <title></title>
</head>
<body>
<form id="uploadForm" enctype="multipart/form-data">
    文件:<input id="file" type="file" name="file"/>
</form>
<button id="upload">上传文件</button>
<input type="text" id="del-filename">
<button id="delete">删除文件</button>
</body>
<script type="text/javascript">
    $(function () {
        $("#upload").click(function () {
            var formData = new FormData($('#uploadForm')[0]);
            $.ajax({
                type: 'post',
                url: "/minio/upload", //上传文件的请求路径必须是绝对路劲
                data: formData,
                cache: false,
                processData: false,
                contentType: false,
            }).success(function (data) {
                debugger
                alert(data);
            }).error(function () {
                alert("上传失败");
            });
        });
        $("#delete").click(function () {
            var filename = $('#del-filename').val();
            $.ajax({
                type: 'delete',
                url: "/minio/remove?url=" + filename, //上传文件的请求路径必须是绝对路劲
            }).success(function (data) {
                alert(data);
            }).error(function () {
                alert("上传失败");
            });
        });
    });
</script>

</html>

 

7,使用Rclone迁移数据到MinIO

Rclone 是一个命令行程序,用于管理云存储上的文件。它是云供应商的网络存储接口的一个功能丰富的替代品。超过 40 种云存储产品支持 rclone,包括 S3 对象存储、企业和消费者文件存储服务以及标准传输协议。Rclone 下载

1)配置

vim /root/.config/rclone/rclone.conf

[minio] # 自定义的名称
type = s3  # 存储类型,参考官方文档所有支持的类型
provider = Minio  # 提供商,参考官方文档或者全部
env_auth = false   # 不通过环境变量配置认证
access_key_id = AKxxxxxxxx   # MinIO生成的acess key!注意: 不是登录控制台的用户名和密码!!!!
secret_access_key = Secretxxxxxxx # MinIO生成的access key对应的 secret key!注意: 不是登录控制台的用户名和密码!!!!
endpoint =  http://127.0.0.1:9000 # MinIO API地址!能访问内网的情况下建议使用内网!效率高!注意:不是控制台地址!!!

windows 放在 Rclone.exe所在目录即可

2)测试  列出MinIO中所有的“桶”,(bucket信息)

rclone lsd minio:

3)迁移

rclone sync /root/data minio:file

4)常用命令

  1. rclone config : 配置会话;
  2. rclone copy : 将文件从原文件夹复制至目标文件夹,跳过已复制的文件;
  3. rclone sync : 将文件从原文件夹同步至目标文件夹,只修改目的地;
  4. rclone move : 将文件从原文件夹移动至目标文件夹;
  5. rclone delete : 删除路径中的内容;
  6. rclone purge : 清空指定路径下的所有文件数据;
  7. rclone mkdir : 创建一个新目录;
  8. rclone rmdir : 删除一个空目录;
  9. rclone rmdirs : 删除路径下的所有空目录;
  10. rclone check : 检查源和目标的数据是否匹配;
  11. rclone ls : 列出指定路径下所有的文件包含文件的大小及路径;
  12. rclone lsd : 列出路径中的所有目录containers和buckets;
  13. rclone lsl : 列出具有大小、修改时间和路径中的所有对象;
  14. rclone md5sum : 为路径中的所有对象生成一个md5sum文件;
  15. rclone sha1sum : 为路径中的所有对象生成一个sha1sum文件;
  16. rclone size : 返回远程路径中对象的总大小和数量;
  17. rclone version : 显示版本号;
  18. rclone cleanup : 如果可能的话,清理remote;
  19. rclone dedupe : 交互式查找重复文件并删除重命名它们;
  20. rclone authorize : 远程认证;
  21. rclone cat : 连接文件并将它们发送到stdout;
  22. rclone copyto : 将文件从源复制到目标,跳过已复制的文件;
  23. rclone genautocomplete : rclone输出完成脚本;
  24. rclone gendocs : rclone将markdown文档输出到所提供的目录;
  25. rclone listremotes : 列出所有远程的配置文件;
  26. rclone mount : 将远程目标挂载至本地;
  27. rclone moveto : 将文件或目录从源移动至目标;
  28. rclone obscure : 在rclone.conf文件中使用模糊密码;
  29. rclone cryptcheck : 检验远程认证;
  30. rclone about : 获取配额信息;

8,MinIO客户端mc使用

1)docker 安装 mc

docker run -it -v /data/minio:/data  --entrypoint=/bin/sh minio/mc

2)登录到 mc 容器

 docker exec -it 1eb0ec9171f5 bash

3)添加/删除 名为 minio 的 HOST 配置

# 添加
mc config host add minio http://192.168.31.22:9000 admin admin123 --api s3v4
Added `minio` successfully.
# 删除
mc config host remove minio
Removed `minio` successfully.

mc config host add oss <阿里云OSS地址> <Access Key> <Secret Key>

4)查看 mc config

mc config host list

5)列出服务器存储桶列表

mc ls minio # minio 为上面的连接名

6)存储桶同步

# 本地到云存储的镜像同步:将本地文件夹 /path/to/local/folder 中的内容同步到 MinIO 存储桶 mybucket 中。
mc mirror /path/to/local/folder myminio/mybucket/

# 云存储到本地的镜像同步:将 MinIO 存储桶 mybucket 中的内容同步到本地文件夹 /path/to/local/folder 中。
mc mirror myminio/mybucket/ /path/to/local/folder

# 云存储到云存储的镜像同步:将一个 MinIO 存储桶中的内容同步到另一个 MinIO 存储桶中。
mc mirror myminio/source-bucket/ myminio/target-bucket/

 7)常用的mc命令以及它们的用法

  • 列出存储桶列表:mc ls [选项] [HOST/ALIAS]
    示例:mc ls myminio
  • 列出桶中的对象列表:mc ls [选项] [HOST/ALIAS]/BUCKET
    示例:mc ls myminio/mybucket
  • 创建存储桶:mc mb [选项] [HOST/ALIAS]/BUCKET
    示例:mc mb myminio/mynewbucket
  • 删除存储桶:mc rb [选项] [HOST/ALIAS]/BUCKET
    示例:mc rb myminio/myoldbucket
  • 上传文件或文件夹:mc cp [选项] SOURCE [HOST/ALIAS]/DEST
    示例:mc cp myfile.txt myminio/mybucket
  • 下载文件或文件夹:mc cp [选项] [HOST/ALIAS]/SOURCE DEST
    示例:mc cp myminio/mybucket/myfile.txt myfile.txt
  • 删除文件或文件夹:mc rm [选项] [HOST/ALIAS]/OBJECT [HOST/ALIAS]/OBJECT...
    示例:mc rm myminio/mybucket/myfile.txt
  • 递归删除文件夹下所有文件
    mc rm -r --force prostorage/publish/openapi/v1.2.1
  • 同步本地文件夹到存储桶:mc mirror [选项] SOURCE [HOST/ALIAS]/DEST
    示例:mc mirror localfolder/ myminio/mybucket/
  • 显示文件内容:mc cat [选项] [HOST/ALIAS]/OBJECT
    示例:mc cat myminio/mybucket/myfile.txt
  • 搜索存储桶:mc find [选项] [HOST/ALIAS]/BUCKET [PREFIX]
    示例:mc find myminio/mybucket/ myfile.txt
posted @ 2023-10-16 19:24  ejiyuan  阅读(573)  评论(0编辑  收藏  举报