0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用docker搭建minio服务

倩倩 来源:CSDN 作者:CSDN 2022-09-23 11:08 次阅读


什么是minio

引用官网:

MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。

官网地址:

https://min.io/

文档地址:

https://docs.min.io/

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

一. 使用docker 搭建minio 服务。

GNU / Linux和macOS

dockerrun-p9000:9000
--nameminio1
-v/mnt/data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data

windows

dockerrun-p9000:9000
--nameminio1
-vD:data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data
  • MINIO_ROOT_USER:为用户key
  • MINIO_ROOT_PASSWORD:为用户密钥

以上搭建的都是单机版的。想要了解分布式 的方式请查看官网文档。

a62be472-3ae9-11ed-9e49-dac502259ad0.png

这就是在win的docker上运行的。

当启动后在浏览器访问http://localhost:9000就可以访问minio的图形化界面了,如图所示:

a65eb08c-3ae9-11ed-9e49-dac502259ad0.pnga6875ba4-3ae9-11ed-9e49-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

二. 下面开始搭建springboot 环境

初始化一个springboot项目大家都会,这里不多做介绍。

主要是介绍需要引入的依赖:


<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.2.1version>
dependency>

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>

依赖可以官方文档里找:https://docs.min.io/docs/java-client-quickstart-guide.html

下面介绍配置文件:

spring:
servlet:
multipart:
max-file-size:10MB
max-request-size:10MB
#minio配置
minio:
access-key:AKIAIOSFODNN7EXAMPLE#key就是docker初始化是设置的,密钥相同
secret-key:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
url:http://localhost:9000
bucket-name:wdhcr
thymeleaf:
cache:false

创建minio的配置类:

@Configuration
@ConfigurationProperties(prefix="spring.minio")
@Data
publicclassMinioConfiguration{
privateStringaccessKey;

privateStringsecretKey;

privateStringurl;

privateStringbucketName;

@Bean
publicMinioClientminioClient(){
returnMinioClient.builder()
.endpoint(url)
.credentials(accessKey,secretKey)
.build();
}
}

使用配置属性绑定进行参数绑定,并初始化一个minio client对象放入容器中。

下面就是我封装的minio client 操作minio的简单方法的组件。

@Component
publicclassMinioComp{

@Autowired
privateMinioClientminioClient;

@Autowired
privateMinioConfigurationconfiguration;

/**
*@description:获取上传临时签名
*@dateTime:2021/5/1314:12
*/
publicMapgetPolicy(StringfileName,ZonedDateTimetime){
PostPolicypostPolicy=newPostPolicy(configuration.getBucketName(),time);
postPolicy.addEqualsCondition("key",fileName);
try{
Mapmap=minioClient.getPresignedPostFormData(postPolicy);
HashMapmap1=newHashMap<>();
map.forEach((k,v)->{
map1.put(k.replaceAll("-",""),v);
});
map1.put("host",configuration.getUrl()+"/"+configuration.getBucketName());
returnmap1;
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
returnnull;
}

/**
*@description:获取上传文件的url
*@dateTime:2021/5/1314:15
*/
publicStringgetPolicyUrl(StringobjectName,Methodmethod,inttime,TimeUnittimeUnit){
try{
returnminioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(method)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnnull;
}


/**
*@description:上传文件
*@dateTime:2021/5/1314:17
*/
publicvoidupload(MultipartFilefile,StringfileName){
//使用putObject上传一个文件到存储桶中。
try{
InputStreaminputStream=file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(configuration.getBucketName())
.object(fileName)
.stream(inputStream,file.getSize(),-1)
.contentType(file.getContentType())
.build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
}
/**
*@description:根据filename获取文件访问地址
*@dateTime:2021/5/1711:28
*/
publicStringgetUrl(StringobjectName,inttime,TimeUnittimeUnit){
Stringurl=null;
try{
url=minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnurl;
}
}

简单说明:

  • 使用MultipartFile接收前端文件流,再上传到minio。
  • 构建一个formData的签名数据,给前端,让前端之前上传到minio。
  • 构建一个可以上传的临时URL给前端,前端通过携带文件请求该URL进行上传。
  • 使用filename请求服务端获取临时访问文件的URL。(最长时间为7 天,想要永久性访问,需要其他设置,这里不做说明。)

下面展示页面html,使用的是VUE+element-ui进行渲染。

html>
<html>
<head>
<metacharset="UTF-8">

<linkrel="stylesheet"href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<title>上传图片title>
head>
<body>
<divid="app">

<el-row:gutter="2">
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>传统上传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="uploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="imgUrl">
<img:src="imgUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端formData直传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="httpRequestHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="directUrl">
<img:src="directUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端Url直传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="UrlUploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="uploadUrl">
<img:src="uploadUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
el-row>
div>
body>

<scriptsrc="https://unpkg.com/vue/dist/vue.js">script>

<scriptsrc="https://unpkg.com/element-ui/lib/index.js">script>

<scriptsrc="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
newVue({
el:'#app',
data:function(){
return{
imgUrl:'',
directUrl:'',
uploadUrl:''
}
},
methods:{

uploadHandle(options){
let{file}=options;
this.traditionPost(file);
},
traditionPost(file){
_that=this
constform=newFormData();
form.append("fileName",file.name);
form.append("file",file);
this.axiosPost("post","/upload",form).then(function(res){
if(res.status===200){
_that.imgUrl=res.data.data
}else{
alert("上传失败!")
}
})
},
getpolicy(file){
_that=this
axios.get('policy?fileName='+file.name)
.then(function(response){
let{xamzalgorithm,xamzcredential,policy,xamzsignature,xamzdate,host}=response.data.data;
letformData=newFormData();
formData.append("key",file.name);
formData.append("x-amz-algorithm",xamzalgorithm);//让服务端返回200,不设置则默认返回204。
formData.append("x-amz-credential",xamzcredential);
formData.append("policy",policy);
formData.append("x-amz-signature",xamzsignature);
formData.append("x-amz-date",xamzdate);
formData.append("file",file);
//发送POST请求
_that.axiosPost("post",host,formData).then(function(res){
if(res.status===204){
axios.get('url?fileName='+file.name).then(function(res){
_that.directUrl=res.data.data;
})
}else{
alert("上传失败!")
}
})
})
},
httpRequestHandle(options){
let{file}=options;
this.getpolicy(file);
},

UrlUploadHandle(options){
let{file}=options;
this.getUploadUrl(file);
},
getUploadUrl(file){
_that=this
console.log(file)
axios.get('uploadUrl?fileName='+file.name)
.then(function(response){
leturl=response.data.data;
//发送put请求
letconfig={'Content-Type':file.type}
_that.axiosPost("put",url,file,config).then(function(res){
if(res.status===200){
axios.get('url?fileName='+file.name).then(function(res){
_that.uploadUrl=res.data.data;
})
}else{
alert("上传失败!")
}
})
})
},
//封装
//axios封装post请求
axiosPost(method,url,data,config){
letresult=axios({
method:method,
url:url,
data:data,
headers:config
}).then(resp=>{
returnresp
}).catch(error=>{
return"exception="+error;
});
returnresult;
}

}
})
script>
<style>
.div-center-class{
padding:28%0%;
text-align:center;
background:beige;
}
style>
html>

a6a6bd8c-3ae9-11ed-9e49-dac502259ad0.png页面效果

可以分别体验不同的实现效果。

以上就是使用springboot搭建基于minio的高性能存储服务的全部步骤了。

项目地址是:

https://gitee.com/jack_whh/minio-upload



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 云存储
    +关注

    关注

    7

    文章

    774

    浏览量

    46205
  • 机器学习
    +关注

    关注

    66

    文章

    8454

    浏览量

    133170
  • Docker
    +关注

    关注

    0

    文章

    492

    浏览量

    12008

原文标题:Spring Boot + minio 实现高性能存储服务,So Easy~!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    服务器 Flexus X 实例,Docker 集成搭建搭建 Flink

    够同时处理实时数据流和静态数据集,使得数据处理更加灵活高效 华为云端口放行 • 服务器放行对应端口 8082 Docker 安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云
    的头像 发表于 01-13 18:17 182次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b><b class='flag-5'>搭建</b> Flink

    服务器 Flexus X 实例,Docker 集成搭建 DVWA 靶场

    )、文件上传漏洞、命令注入等,旨在提供一个安全可控的环境,让用户能够学习和实践如何识别、利用和防御这些漏洞 华为云端口放行 • 服务器放行对应端口 8089 Docker 安装并配置镜像加速 1、购买
    的头像 发表于 01-13 18:17 187次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> DVWA 靶场

    服务器 Flexus X 实例,Docker 集成搭建 YesPlayMusic 网易云音乐播放器

    YesPlayMusic 是一款基于 Electron 的开源网易云音乐桌面播放器,以简洁的界面和丰富的功能受到了许多用户的喜爱,特别是对于希望在桌面上享受网易云音乐服务的用户 Docker 安装并
    的头像 发表于 01-13 18:17 222次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> YesPlayMusic 网易云音乐播放器

    服务器 Flexus X 实例,Docker 集成搭建 MinIO

    架构来存储和管理大规模的非结构化数据,如图片、视频、日志文件等,提供高可用性、可扩展性和数据持久性 华为云端口放行 • 服务器放行对应端口 9000,9001 Docker 安装并配置镜像加速 1
    的头像 发表于 01-13 18:16 159次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> <b class='flag-5'>MinIO</b>

    服务器 Flexus X 实例,Docker 集成搭建 Grafana 开源数据可视化平台

    的用户界面,用户可以轻松创建和自定义动态仪表板,以实时展示关键指标和数据趋势 华为云端口放行 • 服务器放行对应端口 9955 Docker 安装并配置镜像加速 1、购买华为云 Flexus X 实例
    的头像 发表于 01-13 15:50 147次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> Grafana 开源数据可视化平台

    服务器 Flexus X 实例,Docker 集成搭建 Redis 集群

    器之间平衡负载,确保系统的高可用性和数据一致性 搭建 Redis 集群 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com)   2、安装
    的头像 发表于 01-13 13:37 138次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> Redis 集群

    服务器 Flexus X 实例,Docker 集成搭建 NGINX

    Docker 集成搭建 NGINX 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com)   2、docker 安装 yum 
    的头像 发表于 01-13 11:09 399次阅读
    云<b class='flag-5'>服务</b>器 Flexus X 实例,<b class='flag-5'>Docker</b> 集成<b class='flag-5'>搭建</b> NGINX

    Flexus 云服务器 X 实例:在 Docker 环境下搭建 java 开发环境

    和开发者精心打造。它以卓越的柔性算力,为我们在 Docker 环境下搭建 java 开发环境提供有力支撑。 一、Flexus 云服务器 X 实例介绍 1.1 Flexus 云服务器 X
    的头像 发表于 12-30 09:07 271次阅读
    Flexus 云<b class='flag-5'>服务</b>器 X 实例:在 <b class='flag-5'>Docker</b> 环境下<b class='flag-5'>搭建</b> java 开发环境

    企业云服务器平台设计与搭建

    企业云服务器平台的设计与搭建是一个复杂但系统的过程,涉及多个环节和因素。主机推荐小编为您整理发布企业云服务器平台设计与搭建这一过程的详细阐述。
    的头像 发表于 12-04 09:51 153次阅读

    docker-compose配置文件内容详解以及常用命令介绍

    需要的所有服务(例如:Web服务器、数据库、缓存等)并轻松管理它们。 Docker Compose 使用的三个步骤: 使用 Dockerfile 定义应用程序的环境
    的头像 发表于 12-02 09:29 1326次阅读
    <b class='flag-5'>docker</b>-compose配置文件内容详解以及常用命令介绍

    ARM平台实现Docker容器技术

    192.168.10.101:5000/led_flash:v1.0 图17 Docker版本从1.3.X之后,与Docker Registry交互默认使用https,然而前面搭建的私有仓库仅提供http
    发表于 07-25 14:36

    ARM平台实现Docker容器技术

    17Docker版本从1.3.X之后,与Docker Registry交互默认使用https,然而前面搭建的私有仓库仅提供http服务,因此当与私有仓库交互时将出现上面的错误提示。可通
    发表于 07-17 11:05

    宝塔面板Docker一键安装:部署GPTAcademic,开发私有GPT学术优化工具

    使用宝塔Docker-compose,5分钟内在海外服务器上搭建gpt_academic。这篇文章讲解如何使用宝塔面板的Docker服务
    的头像 发表于 07-02 11:58 2928次阅读
    宝塔面板<b class='flag-5'>Docker</b>一键安装:部署GPTAcademic,开发私有GPT学术优化工具

    ARM平台实现Docker容器技术

    ,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序一样管理基础结构。通过利用Docker的快速发布、测试和部署代码的方法,可显著减少产品开发时间。   Docker使用客户端——
    的头像 发表于 03-07 13:48 863次阅读
    ARM平台实现<b class='flag-5'>Docker</b>容器技术

     海外云服务搭建pi节点详细步骤

     海外云服务搭建pi节点简单吗?海外云服务搭建pi节点步骤有哪些?小编为您整理发布海外云服务搭建
    的头像 发表于 02-21 10:16 1319次阅读