0


docker安装Minio

docker安装Minio

一、docker安装minio

1、拉取镜像

docker pull minio/minio

在这里插入图片描述

2、启动镜像

(1)http启动

创建相关数据目录

mkdir-p /wz_conf/minio/data
mkdir-p /wz_conf/minio/config
docker run -d\--name my_minio \-p9000:9000 \-p9001:9001 \-v /wz_conf/minio/data:/data \-v /wz_conf/minio/config:/root/.minio \-eMINIO_ROOT_USER=admin \-eMINIO_ROOT_PASSWORD=admin \
  minio/minio server /data --console-address ":9001"

说明:

  • -v /wz_conf/minio/data:/data 挂载数据目录
  • -v /wz_conf/minio/config:/root/.minio 挂载配置目录
  • -e MINIO_ROOT_USER=admin 配置登陆用户名
  • -e MINIO_ROOT_PASSWORD=admin 配置登陆密码
  • –console-address “:9001” 服务端口为9001

访问: http://ip:9001
在这里插入图片描述

(2)https启动

这里使用自签名证书:

openssl genrsa -out /wz_conf/server.key 2048  

openssl req -new-key /wz_conf/server.key -out /wz_conf/server.csr  

openssl x509 -req-days365-in /wz_conf/server.csr -signkey /wz_conf/server.key -out /wz_conf/server.crt  

启动命令如下:

docker run -d\--name my_minio \-p9000:9000 \-p9001:9001 \-v /wz_conf/minio/data:/data \-v /wz_conf/minio/config:/root/.minio \-v /wz_conf/server.crt:/root/.minio/certs/public.crt \-v /wz_conf/server.key:/root/.minio/certs/private.key \-eMINIO_ROOT_USER=admin \-eMINIO_ROOT_PASSWORD=admin \-eMINIO_HTTPS_CERT_FILE=/root/.minio/certs/public.crt \-eMINIO_HTTPS_KEY_FILE=/root/.minio/certs/private.key \
  minio/minio server /data --console-address ":9001"

访问: https://ip:9001

至此,安装完成!

更多详细说明可以查阅官方说明:
minio官方文档

二、SpringBoot集成minio

1、整合前准备

创建用户:
在这里插入图片描述
创建组
在这里插入图片描述
创建accessKey和secretKey,使用代码连接是需要用到,注意保存好
在这里插入图片描述
创建Bucket,代码中自行创建也可以
在这里插入图片描述

2、代码整合

(1)导入maven做标

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

(2)配置application.yml

spring:minio:access-key:*****************************secret-key:*****************************url: https://ip:9000bucket-name:******

(3)添加配置类

注:由于这里使用的自签名证书,minio使用https连接api会出现如下错误,这里在配置胡总忽略证书验证。

PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException: unable tofind valid certification path torequested target

配置类如下,这里兼容了http与https两个形式的连接:

importio.minio.MinioClient;importlombok.Data;importlombok.extern.slf4j.Slf4j;importokhttp3.OkHttpClient;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.net.ssl.SSLContext;importjavax.net.ssl.TrustManager;importjavax.net.ssl.X509TrustManager;importjava.security.cert.X509Certificate;@Data@Configuration@ConfigurationProperties(prefix ="spring.minio")@Slf4jpublicclassMinioConfig{privateString accessKey;privateString secretKey;privateString url;privateString bucketName;@BeanpublicMinioClientminioClient(){if(url.startsWith("https")){TrustManager[] trustAllCerts =newTrustManager[]{newX509TrustManager(){publicX509Certificate[]getAcceptedIssuers(){returnnewX509Certificate[0];}publicvoidcheckClientTrusted(X509Certificate[] certs,String authType){}publicvoidcheckServerTrusted(X509Certificate[] certs,String authType){}}};SSLContext sslContext =null;try{
                sslContext =SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts,newjava.security.SecureRandom());}catch(Exception e){
                log.error("Install the all-trusting trust manager error:{}", e.getMessage());}OkHttpClient customHttpClient =newOkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(),(X509TrustManager) trustAllCerts[0]).hostnameVerifier((hostname, session)->true).build();returnMinioClient.builder().endpoint(url).credentials(accessKey, secretKey).httpClient(customHttpClient).build();}else{returnMinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}}}

(4)自定义工具类

importcn.hutool.core.io.FastByteArrayOutputStream;importcom.webuild.ai.config.MinioConfig;importcom.webuild.common.core.util.U;importio.minio.*;importio.minio.errors.*;importio.minio.http.Method;importio.minio.messages.Bucket;importio.minio.messages.Item;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.StringUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.web.multipart.MultipartFile;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServletResponse;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.TimeUnit;@Component@Slf4jpublicclassMinioUtils{@AutowiredprivateMinioClient minioClient;@AutowiredprivateMinioConfig minioConfig;/**
     * 判断bucket是否存在,不存在则创建
     *
     * @Description
     * @Param bucketName bucket名称
     * @Return java.lang.Boolean
     * @Author Administrator
     * @Date 2024/7/17 14:31
     **/publicBooleanbucketExists(String bucketName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{boolean exists =false;
        exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if(!exists){
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            exists =true;}return exists;}/**
     * 创建存储bucket
     *
     * @Description
     * @Param bucketName
     * @Return java.lang.Boolean
     * @Author Administrator
     * @Date 2024/7/17 14:42
     **/publicBooleanmakeBucket(String bucketName,String directoryPath)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{
        minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());returntrue;}/**
     * 删除存储bucket
     *
     * @Description
     * @Param bucketName
     * @Return java.lang.Boolean
     * @Author Administrator
     * @Date 2024/7/17 14:44
     **/publicBooleanremoveBucket(String bucketName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());returntrue;}/**
     * 获取全部bucket
     *
     * @Description
     * @Return java.util.List<io.minio.messages.Bucket>
     * @Author Administrator
     * @Date 2024/7/17 14:44
     **/publicList<Bucket>getAllBuckets()throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{return minioClient.listBuckets();}/**
     * 上传文件
     *
     * @Description
     * @Param bucketName
     * @Param prefix
     * @Param file
     * @Return java.lang.String
     * @Author Administrator
     * @Date 2024/7/17 14:51
     **/publicStringupload(String bucketName,String prefix,MultipartFile file)throwsIOException,ServerException,InsufficientDataException,ErrorResponseException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{String originalFilename = file.getOriginalFilename();if(StringUtils.isBlank(originalFilename)){thrownewRuntimeException();}boolean fileExists;try{
            fileExists =isFileExists(bucketName, prefix, originalFilename);}catch(Exception e){
            fileExists =false;}if(fileExists){
            log.info("当前文件存在同名文件,开始重命名保存. originalFilename={}", originalFilename);int dotIndex = originalFilename.lastIndexOf('.');// 获取不带后缀名的文件名String fileNameWithoutExtension = originalFilename.substring(0, dotIndex);// 获取文件后缀名String fileExtension = originalFilename.substring(dotIndex +1);
            originalFilename = fileNameWithoutExtension +"_"+System.currentTimeMillis()+"."+ fileExtension;}String objectName =U.isBlank(prefix)? originalFilename :"/"+ prefix +"/"+ originalFilename;PutObjectArgs objectArgs =PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(file.getInputStream(), file.getSize(),-1).contentType(file.getContentType()).build();//文件名称相同会覆盖
        minioClient.putObject(objectArgs);return originalFilename;}/**
     * 上传报警图片
     *
     * @Description
     * @Param bucketName
     * @Param prefix
     * @Param suffix
     * @Param fileBytes
     * @Return java.lang.String
     * @Author Administrator
     * @Date 2024/7/23 16:38
     **/publicStringupload(String bucketName,String prefix,String suffix,byte[] fileBytes)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{ByteArrayInputStream inputStream =newByteArrayInputStream(fileBytes);String originalFilename =UuidUtil.getUuid()+ suffix;String objectName =U.isBlank(prefix)? originalFilename :"/"+ prefix +"/"+ originalFilename;PutObjectArgs objectArgs =PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(inputStream, fileBytes.length,-1).build();//文件名称相同会覆盖
        minioClient.putObject(objectArgs);return originalFilename;}/**
     * 预览(预览链接默认7天后过期)
     *
     * @Description
     * @Param bucketName
     * @Param fileName
     * @Return java.lang.String
     * @Author Administrator
     * @Date 2024/7/17 14:54
     **/publicStringpreview(String bucketName,String prefix,String fileName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{// 查看文件地址String objectName =U.isBlank(prefix)? fileName :"/"+ prefix +"/"+ fileName;GetPresignedObjectUrlArgs build =GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();return minioClient.getPresignedObjectUrl(build);}/**
     * 下载文件
     *
     * @Description
     * @Param bucketName
     * @Param fileName
     * @Param res
     * @Return void
     * @Author Administrator
     * @Date 2024/7/17 14:56
     **/publicvoiddownload(String bucketName,String prefix,String fileName,HttpServletResponse res){String objectName =U.isBlank(prefix)? fileName :"/"+ prefix +"/"+ fileName;GetObjectArgs objectArgs =GetObjectArgs.builder().bucket(bucketName).object(objectName).build();try(GetObjectResponse response = minioClient.getObject(objectArgs)){byte[] buf =newbyte[1024];int len;try(FastByteArrayOutputStream os =newFastByteArrayOutputStream()){while((len = response.read(buf))!=-1){
                    os.write(buf,0, len);}
                os.flush();byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");// 设置强制下载不打开// res.setContentType("application/force-download");
                res.addHeader("Content-Disposition","attachment;fileName="+ fileName);try(ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();}}}catch(Exception e){
            log.error("下载文件异常. e={}", e);}}/**
     * 查看文件对象
     *
     * @Description
     * @Param bucketName
     * @Return java.util.List<io.minio.messages.Item>
     * @Author Administrator
     * @Date 2024/7/17 15:32
     **/publicList<Item>listObjects(String bucketName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());List<Item> items =newArrayList<>();for(Result<Item> result : results){
            items.add(result.get());}return items;}/**
     * 删除文件
     *
     * @Description
     * @Param bucketName
     * @Param fileName
     * @Return boolean
     * @Author Administrator
     * @Date 2024/7/17 15:32
     **/publicbooleanremove(String bucketName,String prefix,String fileName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{String objectName =U.isBlank(prefix)? fileName :"/"+ prefix +"/"+ fileName;
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());returntrue;}/**
     * 生成一个带到期时间、签名的URL,这个地址可以提供给没有登录的第三方共享访问或者上传对象,针对于Bucket为私有的情况
     * 
     * @Description 
     * @Param bucketName
     * @Param fileName
     * @Return java.lang.String
     * @Author Administrator
     * @Date 2024/7/17 16:22     
     **/publicStringgetPresignedObjectUrl(String bucketName,String prefix,String fileName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{String objectName =U.isBlank(prefix)? fileName :"/"+ prefix +"/"+ fileName;return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName)// 设置过期时间,30分钟.expiry(30,TimeUnit.MINUTES).method(Method.GET).build());}/**
     * 判断文件是否存在
     * 
     * @Description 
     * @Param bucketName
     * @Param prefix
     * @Param fileName
     * @Return boolean
     * @Author Administrator
     * @Date 2024/7/22 17:42     
     **/publicbooleanisFileExists(String bucketName,String prefix,String fileName)throwsServerException,InsufficientDataException,ErrorResponseException,IOException,NoSuchAlgorithmException,InvalidKeyException,InvalidResponseException,XmlParserException,InternalException{String objectName =U.isBlank(prefix)? fileName :"/"+ prefix +"/"+ fileName;
        minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());returntrue;}}

到此就可以通过自己的工具类使用minio了…

标签: docker 容器 minio

本文转载自: https://blog.csdn.net/qq_26709459/article/details/140691183
版权归原作者 GreaterBuilder 所有, 如有侵权,请联系我们删除。

“docker安装Minio”的评论:

还没有评论