Docker安装MinIO

打印 上一主题 下一主题

主题 553|帖子 553|积分 1659

一、什么是MinIO?

为什么选择MinIO?

1、MinIO 是在 Apache License v2.0 下发布的对象存储服务器。 它与 Amazon S3 云存储服务兼容。 它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM 映像。 对象的巨细可以从几 KB 到最大 5TB。
2、MinIO 服务器充足轻,可以与应用程序堆栈捆绑在一起,类似于 NodeJS,Redis 和 MySQL
3 一种高性能的分布式对象存储服务器,用于大型数据基础设施。它是机器学习和其他大数据工作负载下Hadoop HDFS 的理想 s3 兼容替代品
MinIO特点
   1、Minio 有精良的存储机制
2、Minio 有很好纠删码的算法与擦除编码算法
3、拥有RS code 编码数据恢复原理
4、公司做强做大时,数据的拥有重要性,对数据管理与大数据分析做准备。
5、搭建本身的一套文件系统服务,对文件数据进行安全掩护。
6、拥有本身的平台,不限于其他方限定。
  什么是纠删码?

   Minio利用纠删码技术来掩护数据,它是一种恢复丢失和破坏数据的数学算法,它将数据分块冗余的分散存储在各各节点的磁盘上,全部的可用磁盘组成一个聚集,上图由8块硬盘组成一个聚集,当上传一个文件时会通过纠删码算法计算对文件进行分块存储,除了将文件本身分成4个数据块,还会生成4个校验块,数据块和校验块会分散的存储在这8块硬盘上。利用纠删码的利益是即便丢失一半数目(N/2)的硬盘,仍旧可以恢复数据。 好比上边聚集中有4个以内的硬盘损害仍可包管数据恢复,不影响上传和下载,如果多于一半的硬盘坏了则无法恢复。
  二、Docker安装MinIO

1. 拉取镜像
  1. docker pull minio/minio
复制代码
2. 查看镜像
  1. docker images
复制代码
3. 创建MinIO的挂载目录
【/home/soft/minio/config】配置文件目录
【/home/soft/minio/data】存储文件的目录

  1. mkdir -p /home/soft/minio/config
  2. mkdir -p /home/soft/minio/data
复制代码
4. 启动MinIO容器
  1. docker run -d -p 9000:9000 -p 9090:9090 --name minio -v /home/soft/minio/data:/data -v /home/soft/minio/config:/root/.minio  -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" minio/minio server /data --console-address ":9090" -address ":9000"
复制代码
  

  • -v /home/soft/minio/data:/data :表示将宿主机的/soft/minio/data目录挂载到容器的/data目录
  • -e "MINIO_ACCESS_KEY=minio":密钥也是登录的用户名,本身设置
  • -e "MINIO_SECRET_KEY=minio123" :秘密密钥也是登录的暗码,本身设置
  • --console-address ":9090" :客户端端口为9090
  • -address ":9000" :服务端口为9000
  5. 登岸测试

三、SpringBoot集成MinIO

1. MinIO前期准备

1. 创建MinIO用户




2. 创建组




3. 创建accessKey和secretKey




4. 创建Bucket



2. springBoot整合MinIO

整合内容参考:https://blog.csdn.net/yueyue763184/article/details/131147025
1. 导入maven坐标

  1. <dependency>
  2.     <groupId>io.minio</groupId>
  3.     <artifactId>minio</artifactId>
  4.     <version>7.0.2</version>
  5. </dependency>
复制代码
2. 配置 application.yml

  1. server:
  2.   port: 8080
  3. spring:
  4.   # 配置文件上传大小限制
  5.   servlet:
  6.     multipart:
  7.       max-file-size: 200MB
  8.       max-request-size: 200MB
  9. minio:
  10.   host: http://yourIp:9000
  11.   url: ${minio.host}/${minio.bucket}/
  12.   access-key: minioadmin
  13.   secret-key: minioadmin
  14.   bucket: public
复制代码
3. MinioConfig配置类

  1. import io.minio.MinioClient;
  2. import io.minio.ObjectStat;
  3. import io.minio.PutObjectOptions;
  4. import io.minio.Result;
  5. import io.minio.messages.Bucket;
  6. import io.minio.messages.Item;
  7. import org.apache.tomcat.util.http.fileupload.IOUtils;
  8. import org.springframework.beans.factory.InitializingBean;
  9. import org.springframework.beans.factory.annotation.Value;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.Assert;
  12. import org.springframework.web.multipart.MultipartFile;
  13. import org.springframework.web.util.UriUtils;
  14. import javax.servlet.http.HttpServletResponse;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.net.URLEncoder;
  18. import java.nio.charset.StandardCharsets;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. @Component
  22. public class MinioConfig implements InitializingBean {
  23.     @Value(value = "${minio.bucket}")
  24.     private String bucket;
  25.     @Value(value = "${minio.host}")
  26.     private String host;
  27.     @Value(value = "${minio.url}")
  28.     private String url;
  29.     @Value(value = "${minio.access-key}")
  30.     private String accessKey;
  31.     @Value(value = "${minio.secret-key}")
  32.     private String secretKey;
  33.     private MinioClient minioClient;
  34.     @Override
  35.     public void afterPropertiesSet() throws Exception {
  36.         Assert.hasText(url, "Minio url 为空");
  37.         Assert.hasText(accessKey, "Minio accessKey为空");
  38.         Assert.hasText(secretKey, "Minio secretKey为空");
  39.         this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);
  40.     }
  41.     /**
  42.      * 上传
  43.      */
  44.     public String putObject(MultipartFile multipartFile) throws Exception {
  45.         // bucket 不存在,创建
  46.         if (!minioClient.bucketExists(this.bucket)) {
  47.             minioClient.makeBucket(this.bucket);
  48.         }
  49.         try (InputStream inputStream = multipartFile.getInputStream()) {
  50.             // 上传文件的名称
  51.             String fileName = multipartFile.getOriginalFilename();
  52.             // PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
  53.             PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
  54.             // 文件的ContentType
  55.             putObjectOptions.setContentType(multipartFile.getContentType());
  56.             minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);
  57.             // 返回访问路径
  58.             return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);
  59.         }
  60.     }
  61.     /**
  62.      * 文件下载
  63.      */
  64.     public void download(String fileName, HttpServletResponse response){
  65.         // 从链接中得到文件名
  66.         InputStream inputStream;
  67.         try {
  68.             MinioClient minioClient = new MinioClient(host, accessKey, secretKey);
  69.             ObjectStat stat = minioClient.statObject(bucket, fileName);
  70.             inputStream = minioClient.getObject(bucket, fileName);
  71.             response.setContentType(stat.contentType());
  72.             response.setCharacterEncoding("UTF-8");
  73.             response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  74.             IOUtils.copy(inputStream, response.getOutputStream());
  75.             inputStream.close();
  76.         } catch (Exception e){
  77.             e.printStackTrace();
  78.             System.out.println("有异常:" + e);
  79.         }
  80.     }
  81.     /**
  82.      * 列出所有存储桶名称
  83.      *
  84.      * @return
  85.      * @throws Exception
  86.      */
  87.     public List<String> listBucketNames()
  88.             throws Exception {
  89.         List<Bucket> bucketList = listBuckets();
  90.         List<String> bucketListName = new ArrayList<>();
  91.         for (Bucket bucket : bucketList) {
  92.             bucketListName.add(bucket.name());
  93.         }
  94.         return bucketListName;
  95.     }
  96.     /**
  97.      * 查看所有桶
  98.      *
  99.      * @return
  100.      * @throws Exception
  101.      */
  102.     public List<Bucket> listBuckets()
  103.             throws Exception {
  104.         return minioClient.listBuckets();
  105.     }
  106.     /**
  107.      * 检查存储桶是否存在
  108.      *
  109.      * @param bucketName
  110.      * @return
  111.      * @throws Exception
  112.      */
  113.     public boolean bucketExists(String bucketName) throws Exception {
  114.         boolean flag = minioClient.bucketExists(bucketName);
  115.         if (flag) {
  116.             return true;
  117.         }
  118.         return false;
  119.     }
  120.     /**
  121.      * 创建存储桶
  122.      *
  123.      * @param bucketName
  124.      * @return
  125.      * @throws Exception
  126.      */
  127.     public boolean makeBucket(String bucketName)
  128.             throws Exception {
  129.         boolean flag = bucketExists(bucketName);
  130.         if (!flag) {
  131.             minioClient.makeBucket(bucketName);
  132.             return true;
  133.         } else {
  134.             return false;
  135.         }
  136.     }
  137.     /**
  138.      * 删除桶
  139.      *
  140.      * @param bucketName
  141.      * @return
  142.      * @throws Exception
  143.      */
  144.     public boolean removeBucket(String bucketName)
  145.             throws Exception {
  146.         boolean flag = bucketExists(bucketName);
  147.         if (flag) {
  148.             Iterable<Result<Item>> myObjects = listObjects(bucketName);
  149.             for (Result<Item> result : myObjects) {
  150.                 Item item = result.get();
  151.                 // 有对象文件,则删除失败
  152.                 if (item.size() > 0) {
  153.                     return false;
  154.                 }
  155.             }
  156.             // 删除存储桶,注意,只有存储桶为空时才能删除成功。
  157.             minioClient.removeBucket(bucketName);
  158.             flag = bucketExists(bucketName);
  159.             if (!flag) {
  160.                 return true;
  161.             }
  162.         }
  163.         return false;
  164.     }
  165.     /**
  166.      * 列出存储桶中的所有对象
  167.      *
  168.      * @param bucketName 存储桶名称
  169.      * @return
  170.      * @throws Exception
  171.      */
  172.     public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
  173.         boolean flag = bucketExists(bucketName);
  174.         if (flag) {
  175.             return minioClient.listObjects(bucketName);
  176.         }
  177.         return null;
  178.     }
  179.     /**
  180.      * 列出存储桶中的所有对象名称
  181.      *
  182.      * @param bucketName 存储桶名称
  183.      * @return
  184.      * @throws Exception
  185.      */
  186.     public List<String> listObjectNames(String bucketName) throws Exception {
  187.         List<String> listObjectNames = new ArrayList<>();
  188.         boolean flag = bucketExists(bucketName);
  189.         if (flag) {
  190.             Iterable<Result<Item>> myObjects = listObjects(bucketName);
  191.             for (Result<Item> result : myObjects) {
  192.                 Item item = result.get();
  193.                 listObjectNames.add(item.objectName());
  194.             }
  195.         }
  196.         return listObjectNames;
  197.     }
  198.     /**
  199.      * 删除一个对象
  200.      *
  201.      * @param bucketName 存储桶名称
  202.      * @param objectName 存储桶里的对象名称
  203.      * @throws Exception
  204.      */
  205.     public boolean removeObject(String bucketName, String objectName) throws Exception {
  206.         boolean flag = bucketExists(bucketName);
  207.         if (flag) {
  208.             List<String> objectList = listObjectNames(bucketName);
  209.             for (String s : objectList) {
  210.                 if(s.equals(objectName)){
  211.                     minioClient.removeObject(bucketName, objectName);
  212.                     return true;
  213.                 }
  214.             }
  215.         }
  216.         return false;
  217.     }
  218.     /**
  219.      * 文件访问路径
  220.      *
  221.      * @param bucketName 存储桶名称
  222.      * @param objectName 存储桶里的对象名称
  223.      * @return
  224.      * @throws Exception
  225.      */
  226.     public String getObjectUrl(String bucketName, String objectName) throws Exception {
  227.         boolean flag = bucketExists(bucketName);
  228.         String url = "";
  229.         if (flag) {
  230.             url = minioClient.getObjectUrl(bucketName, objectName);
  231.         }
  232.         return url;
  233.     }
  234. }
复制代码
4. MinioController控制类

  1. import com.minio.demo.config.MinioConfig;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.*;
  4. import org.springframework.web.multipart.MultipartFile;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.util.List;
  7. @RestController
  8. @CrossOrigin
  9. @RequestMapping("/minio")
  10. public class MinioController {
  11.     @Autowired
  12.     MinioConfig minioConfig;
  13.     // 上传
  14.     @PostMapping("/upload")
  15.     public Object upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {
  16.         return this.minioConfig.putObject(multipartFile);
  17.     }
  18.     // 下载文件
  19.     @GetMapping("/download")
  20.     public void download(@RequestParam("fileName")String fileName, HttpServletResponse response) {
  21.         this.minioConfig.download(fileName,response);
  22.     }
  23.     // 列出所有存储桶名称
  24.     @PostMapping("/list")
  25.     public List<String> list() throws Exception {
  26.         return this.minioConfig.listBucketNames();
  27.     }
  28.     // 创建存储桶
  29.     @PostMapping("/createBucket")
  30.     public boolean createBucket(String bucketName) throws Exception {
  31.         return this.minioConfig.makeBucket(bucketName);
  32.     }
  33.     // 删除存储桶
  34.     @PostMapping("/deleteBucket")
  35.     public boolean deleteBucket(String bucketName) throws Exception {
  36.         return this.minioConfig.removeBucket(bucketName);
  37.     }
  38.     // 列出存储桶中的所有对象名称
  39.     @PostMapping("/listObjectNames")
  40.     public List<String> listObjectNames(String bucketName) throws Exception {
  41.         return this.minioConfig.listObjectNames(bucketName);
  42.     }
  43.     // 删除一个对象
  44.     @PostMapping("/removeObject")
  45.     public boolean removeObject(String bucketName, String objectName) throws Exception {
  46.         return this.minioConfig.removeObject(bucketName, objectName);
  47.     }
  48.     // 文件访问路径
  49.     @PostMapping("/getObjectUrl")
  50.     public String getObjectUrl(String bucketName, String objectName) throws Exception {
  51.         return this.minioConfig.getObjectUrl(bucketName, objectName);
  52.     }
  53. }
复制代码
5. 测试


6. 验证



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表