初步搭建一个自己的对象存储服务—Minio

docker安装

1、拉取镜像
docker pull minio/minio
2、启动镜像

docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123456" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data 

重要:

  • -p9000 是图形界面的端口,9001 是 API 的端口,在使用 SDK 连接需要用到
  • MINIO_ACCESS_KEY:指定图形界面的用户名
  • MINIO_SECRET_KEY:指定图形界面的密码

命令参数及选项说明:

  1. docker run: 这是 Docker 的基本命令,用于运行一个新的容器。
  2. -p 9000:9000 -p 9001:9001: 使用 -p 或 --publish 选项将主机(宿主机)端口映射到容器内部端口。这里分别做了两个端口映射:
    • 9000:9000:将主机的 9000 端口与容器内的 9000 端口绑定,使得外部可以通过主机的 9000 端口访问到容器内运行的服务。
    • 9001:9001:同样地,将主机的 9001 端口与容器内的 9001 端口绑定。
  3. --name minio: 使用 --name 选项指定新创建容器的名称为 minio,便于后续管理和引用。
  4. -d: 使用 -d 或 --detach 标志使容器在后台以守护进程模式运行,即启动后立即返回控制台而不阻塞。
  5. --restart=always: 设置容器的重启策略为 always,这意味着如果容器意外停止(如由于系统重启或故障),Docker 将自动重新启动该容器。
  6. -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin": 使用 -e 或 --env 选项设置环境变量。这里设置了 MinIO 需要的访问密钥和秘密密钥:
    • MINIO_ACCESS_KEY=admin:定义 MinIO 的访问密钥(Access Key),用于身份验证。
    • MINIO_SECRET_KEY=admin:定义 MinIO 的秘密密钥(Secret Key),与访问密钥一起构成认证凭据。
  7. -v /home/data:/data -v /home/config:/root/.minio: 使用 -v 或 --volume 选项挂载主机目录到容器内:
    • -v /home/data:/data:将主机上的 /home/data 目录挂载到容器内的 /data 目录,用于存放 MinIO 存储的数据。
    • -v /home/config:/root/.minio:将主机上的 /home/config 目录挂载到容器内的 /root/.minio 目录,通常用于保存 MinIO 的配置文件和其他持久化数据。
  8. minio/minio: 指定要使用的 Docker 镜像,这里是官方的 minio/minio 镜像。
  9. server: 运行 MinIO 容器时执行的命令,通常为 server,用于启动 MinIO 服务。
  10. --console-address ":9000" --address ":9001": 传递给 server 命令的 MinIO 特定参数:
  • --console-address ":9000":指定 MinIO 管理控制台的监听地址为 :9000,即容器内的所有网络接口都会监听此端口。由于已经做了端口映射,外部可以通过主机的 9000 端口访问控制台。
  • --address ":9001":指定 MinIO 服务 API 的监听地址为 :9001,同样对所有网络接口开放。外部可通过主机的 9001 端口与 MinIO API 进行交互。
  1. /data: 最后的 /data 参数指定了 MinIO 服务的数据目录,即使用挂载的 /data 目录作为存储桶数据的实际位置。

访问

浏览器输入http://ip:9000/login

图形界面

1、创建桶
初步搭建一个自己的对象存储服务---Minio

2、设置权限
初步搭建一个自己的对象存储服务---Minio

3、获取accessKey 和 secretKey
初步搭建一个自己的对象存储服务---Minio

注意:创建__accessKey 和 secretKey的时候,要注意保存好。

Java连接Minio(SDK)

1、添加依赖

<dependency>   <groupId>io.minio</groupId>   <artifactId>minio</artifactId>   <version>8.2.1</version> </dependency> 

2、demo

import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.UploadObjectArgs; import io.minio.errors.MinioException;  import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException;  public class FileUploader {     // minio的api 端口(不是图形界面)     public static String endPoint = "http://xxx.xxx.xxx.xxx:9001/";          public static String accessKey = "YLCS8UYJFX02E70OV7MK";     public static String secretKey = "不能外露";      public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {         try {             // 创建minioClient, 使用上面的endpoint,ak,sk             MinioClient minioClient =             MinioClient.builder()             .endpoint(endPoint)             .credentials(accessKey, secretKey)             .build();              // 如果指定的bucket不存在,则创建,否则使用已有bucket             // 指定bucket名称             String bucketName = "test";             boolean found =             minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());             if (!found) {                 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());             } else {                 System.out.println("Bucket '" + bucketName + "' already exists.");             }              // 文件来自哪里             String filePath = "C:\Users\DELL\Pictures\Saved Pictures\2.jpg";             // 存储后的文件名             String fileName = "minio_test_text.png";              // 执行文件上传             minioClient.uploadObject(                 UploadObjectArgs.builder()                 .bucket(bucketName)                 .object(fileName)                 .filename(filePath)                 .build());             System.out.println("'" + filePath + "' 成功上传对象 '" + fileName + "' 到 bucket '" + bucketName + "'.");         } catch (MinioException e) {             System.out.println("Error occurred: " + e);             System.out.println("HTTP trace: " + e.httpTrace());         }     } }  

封装工具类

1、配置文件

  chuangyue:     minio:       # 访问的url       endpoint: http://xxx.xxx.xxx.xxx       # API的端口       port: 9001       # 秘钥       accessKey: YLCS8UYJFX02E70OV7MK       secretKey: 不能看       secure: false       bucket-name: test # 桶名 我这是给出了一个默认桶名       image-size: 10485760 # 我在这里设定了 图片文件的最大大小       file-size: 1073741824 # 此处是设定了文件的最大大小 

2、属性配置类

@Component @ConfigurationProperties(prefix = "chuangyue.minio") @Data public class MinioProperties {     // 访问的 api 的url     private String endpoint;     // api端口号     private String port;     // 密钥     private String accessKey;     private String secretKey;     private Boolean secure;     // 桶名     private String bucketName;     // 图片文件的最大大小     private long imageSize;     // 文件的最大大小     private long fileSize; }  

3、工具类

package com.zyp.utils;  import io.minio.*; import io.minio.errors.MinioException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile;  import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.UUID;  @Component @Slf4j public class MinioUtil {          /**      * @ description 上传      * @param file 文件      * @param endPoint 访问的地址      * @param port 端口号      * @param accessKey 密钥      * @param secretKey 密钥      * @param bucketName 桶名称      * @ return java.lang.String      * @ author DELL      */     public static String upload(MultipartFile file, String endPoint, String port, String accessKey, String secretKey, String bucketName) throws IOException, NoSuchAlgorithmException, InvalidKeyException {         try {             // 创建minioClient             MinioClient minioClient =                     MinioClient.builder()                             .endpoint(endPoint + ":" + port)                             .credentials(accessKey, secretKey)                             .build();              // 如果指定的bucket不存在,则创建,否则使用已有bucket             boolean found =                     minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());             if (!found) {                 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());             } else {                 log.info("Bucket {} already exists", bucketName);             }              // 获取文件原始名称             String oringinalName = file.getOriginalFilename();             // 获取后缀             String suffix = oringinalName.substring(oringinalName.lastIndexOf('.'));             // 拼接存储后的文件名             String fileName = UUID.randomUUID().toString() + suffix;              PutObjectArgs putObjectArgs = PutObjectArgs.builder()                     .bucket(bucketName)                     .object(fileName)                     .stream(file.getInputStream(), file.getSize(), -1)                     .contentType(file.getContentType())                     .build();              minioClient.putObject(putObjectArgs);             log.info("文件上传成功");              // 拼接url并返回             return endPoint + ":" + port + "/" + bucketName + "/" + fileName;          } catch (MinioException e) {             System.out.println("Error occurred: " + e);             System.out.println("HTTP trace: " + e.httpTrace());             return "error";         }     } }  

4、使用,定义一个文件上传的接口

@RestController @Slf4j public class FileUploadController {     @Autowired     private MinioProperties minioProperties;      /**      * @ description 文件上传      * @param file      * @ return com.zyp.pojo.Result<java.lang.String>      * @ author DELL      */     @PostMapping("/upload")     public Result<String> upload(MultipartFile file) throws Exception {          String url = MinioUtil.upload(file, minioProperties.getEndpoint(), minioProperties.getPort(), minioProperties.getAccessKey(), minioProperties.getSecretKey(), minioProperties.getBucketName());         log.info("url= {}",url);          if(url.isEmpty() || url.equals("error")){             throw new UploadErrorException("文件上传失败");         }else{             return Result.success(url);         }     } }  

常见问题

1、tomcat限制了文件上传或者下载的大小
解决:修改配置文件

spring:   servlet:     multipart:       max-file-size: 50MB       max-request-size: 50MB 

发表评论

评论已关闭。

相关文章