MinIO+Docker从零搭建一个文件存储服务

本文,将带你使用 MinIO + Docker 来从零搭建一个文件存储服务,并在 SpringBoot 项目中上传图片到 MinIO 中。

一.为什么要自己搭建?

对于个人来说,当然是攻击风险。第三方对象存储服务通常会收取费用,尤其随着数据量的增加,费用也会相应增加,而通过自己搭建文件存储服务器,可以有效控制成本。其实费用还好,个人小项目访问量不大花不了多少钱,最重要的是被攻击刷流量就GG了。例如:

个人小博客被攻击:

在这里插入图片描述

某知名up主被刷爆:

在这里插入图片描述

虽然个人小项目一般不会被攻击,但就问你看到-1.5w慌不慌?接下来让我们来学习一下如何使用MinIO搭建一个自己的文件存储服务器吧~

二.为什么使用MinIO?

MinIO 是一个高性能的轻量级对象存储服务器。它具有分布式,高可用性和水平扩展的特点,它非常适合用于大规模数据存储和分析。其优点包括低延迟、高吞吐量、易于部署和管理

怕很拉跨不敢用?

截止目前,MinIO 在 Github 上有 43.7k Star。

国内阿里巴巴、腾讯、百度、华为、中国移动、中国联通等企业都有在使用 MinIO,甚至不少商业公司二次开发 MinIO 来提供商业化的云存储产品。

在这里插入图片描述

三.搭建MinIO

(1) 引言

MinIO 的官方文档上介绍了多种下载方式:

在这里插入图片描述

本文我们只介绍如何使用 Docker 基于CentOS 服务器来进行服务的搭建,如果未安装Docker可以通过本文(点击跳转)来了解和安装Docker,或者在官方文档挑选自己擅长的方式进行搭建~

在这里插入图片描述

(2) 安装

  1. 首先我们要创建两个文件目录:一个用来存放 MinIO 的配置文件,一个用来存储我们上传文件数据。
mkdir -p /home/minio/config
mkdir -p /home/minio/data
  • /home/minio/config 用于存放 MinIO 的配置文件
  • /home/minio/data 用于存储上传的文件数据
  1. 接下来我们可以通过如下命令拉取最新版镜像并创建 MinIO 容器运行。如果需要下载指定版本可以点击前往DockerHub仓库选择下载。
docker run -p 9000:9000 -p 9001:9001 \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=password" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
/data \
--console-address ":9001" 

运行效果:

在这里插入图片描述

命令行解释:

  • MINIO_ACCESS_KEYMINIO_SECRET_KEY 为UI界面登录账号密码
  • -d 将容器以后台(守护进程)模式运行,并与终端分离。
  • --restart=always 选项指定容器在停止后总是自动重启。
  • /home/minio/data 挂载的存储上传文件的目录
  • /home/minio/config 挂载的配置文件
  • minio/minio server 使用MinIO 镜像并启动
  • /data 要使用的数据目录
  • --console-address 指定UI 界面的端口
  • 9000:9000 映射服务器端口
  • 9001:9001 映射UI界面端口

补充说明:

Docker的run指令会首先在本地查找指定的镜像,如果本地没有找到对应的镜像,则会自动去远程镜像仓库拉取该镜像并在本地运行。

当不带有标签(tag)的镜像名称时,Docker默认会使用latest标签来拉取最新版本的镜像。例如,如果运行docker run ubuntu,Docker会首先在本地查找名为ubuntu:latest的镜像是否存在,如果不存在,则会从默认的远程镜像仓库(如Docker Hub)拉取最新版本的ubuntu镜像,并在本地运行。

如果指定了具体的标签或版本号,例如docker run ubuntu:18.04,Docker会尝试在本地查找名为ubuntu:18.04的镜像,如果本地没有找到,则会从远程镜像仓库拉取对应的镜像。

需要注意的是,如果在远程镜像仓库中找不到指定的镜像,或者无法连接到远程镜像仓库,Docker的run指令将无法成功运行,并会报错提示找不到镜像。

  1. 最后在浏览器中访问 http://服务器IP:9001,即可访问到MinIO的控制台。

在这里插入图片描述

可以输入账号 admin,密码 password 进行登录,进入首页。

在这里插入图片描述

可以发现它的界面和我们使用的一些第三方对象存储服务非常相似,接下来我们也要进行一系列的配置~

(3) 配置

  1. 创建一个 Bucket 存储桶,用于稍后文件的上传操作。

在这里插入图片描述

  1. 前往创建用于远程操作的AccessKey 和 SecretKey.

在这里插入图片描述

  1. 创建并保存好生成Access Key 和 Secret Key.

在这里插入图片描述

  1. 默认配置下,访问存储桶是需要请求授权的。但是在实际场景下,我们往往希望允许直接访问,此时就需要添加一条 readonly 访问规则。

在这里插入图片描述

进入配置存储桶界面

在这里插入图片描述

进行配置,添加只读规则

在这里插入图片描述

至此,我们已经基本完成了MinIO的简单配置,当然如果想要更安全,同样是可以像使用第三方对象存储服务一样创建用户组,分配权限等诸如此类的操作。

(4) 测试

  1. 我们上传一张图片并访问来测试一下是否搭建成功。

在这里插入图片描述

  1. 可以看到成功上传了图片

在这里插入图片描述

  1. 接下来我们在浏览器访问 http://服务器IP:9000/{bucket存储桶名字}/{name图片后缀名} 来进行访问。例如我刚上传的文件 {bucket} 是 guanzhi,{name} 是 csdn.png,所以最终的访问路径是 http://服务器IP:9000/guanzhi/csdn.png

在这里插入图片描述

测试成功,能够正常使用,接下来我们来学习一下如何在Java项目中使用吧~

四.在项目中使用

(1) 引言

官方文档上有介绍多种语言的SDK使用指南,本篇我们只学习如何在Java的Maven项目中进行使用,其他语言的同学可以跟着官方文档尝试一下~

在这里插入图片描述

(2) 初步尝试

  1. 首先在我们创建的Maven项目中引入如下依赖
 <!-- MinIO 客户端 -->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.9</version>
</dependency>
  1. 接下来我们尝试一下官方给出的demo(已经添加详细注释,可以查看下述示例代码)
@SpringBootTest
class DemoApplicationTests {@Testvoid demo() {try {// 1.创建MinIO客户端,与其建立连接,用于我们上传文件操作// Create a minioClient with the MinIO server playground, its access key and secret key.MinioClient minioClient = MinioClient.builder().endpoint("http://服务器ip:9000") // 地址为服务器ip+端口号.credentials("1AYD2DY8qPz5vp0WmQtJ","BQeSptD5wO9vPIwtthNg5BbFswPx7WhsPh1Slp0M") // 我们配置并保存的 AccessKey 和 SecretKey.build();// 2.创建存储桶,这一步我们可以直接在界面手动创建一次即可,因此可以省略// Make 'asiatrip' bucket if not exist.boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("guanzhi").build());if (!found) {// Make a new bucket called 'asiatrip'.minioClient.makeBucket(MakeBucketArgs.builder().bucket("guanzhi").build());} else {System.out.println("Bucket 'guanzhi' already exists.");}// 3. 上传文件// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket 'asiatrip'.minioClient.uploadObject(UploadObjectArgs.builder().bucket("guanzhi") // 上传到哪个存储桶?.object("pom.xml") // 上传的文件命名为什么?.filename("C:\\code\\demo\\pom.xml") // 上传文件的路径?.build());System.out.println("'C:\\code\\demo\\pom.xml' is successfully uploaded as "+ "object 'pom.xml\"' to bucket 'guanzhi'.");} catch (MinioException e) {System.out.println("Error occurred: " + e);System.out.println("HTTP trace: " + e.httpTrace());} catch (IOException | NoSuchAlgorithmException | InvalidKeyException e) {throw new RuntimeException(e);}}
}
  1. 可以发现运行成功。

在这里插入图片描述

查看控制台,可以看成功上传了文件。

在这里插入图片描述

(3) 在SpringBoot中使用

我们来简单写一个文件上传功能。

  1. 项目中除了上述依赖,我们还需要引入如下依赖
        <!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependency><!-- lombok插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
  1. 新建 MinIO 配置类,创建 MinioClient Bean
@Configuration
@ConfigurationProperties(prefix = "file.minio")
@Data
public class MinioConfiguration {private String accessKey;private String secretKey;private String endpoint;private String bucket;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}
  1. 在application.yml中编写配置
# 对象存储服务配置
file:# MinIO自搭建对象存储服务minio:endpoint: http://服务器ip:9000 #存储服务域名accessKey: 1AYD2DY8qPz5vp0WmQtJ secretKey: BQeSptD5wO9vPIwtthNg5BbFswPx7WhsPh1Slp0Mbucket: guanzhi   #存储桶名称
  1. 编写controller
@RestController
@RequestMapping("/file")
public class FileController {@Resourceprivate MinioClient minioClient;@Resourceprivate MinioConfiguration minioConfiguration;/*** 上传文件*/@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) throws Exception {// 上传String path = UUID.randomUUID() + file.getOriginalFilename(); // 文件名,使用 UUID 随机minioClient.putObject(PutObjectArgs.builder().bucket(minioConfiguration.getBucket()) // 存储桶.object(path) // 文件名.stream(file.getInputStream(), file.getSize(), -1) // 文件内容.contentType(file.getContentType()) // 文件类型.build());// 拼接路径return String.format("%s/%s/%s", minioConfiguration.getEndpoint(), minioConfiguration.getBucket(), path);}
}
  1. 启动SpringBoot项目,测试接口,可以看到后端正确响应了文件Url.

在这里插入图片描述

  1. 可以看到控制台存储桶中也有文件

在这里插入图片描述

  1. 在浏览器中我们也成功的通过返回的url访问到了图片

在这里插入图片描述

至此,我们已经完成了服务器的搭建,赶紧用起来吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科普 | Runes 预挖矿概念

作者&#xff1a;Jacky X/推&#xff1a;zxl2102492 关于 Runes 协议的前世今生&#xff0c;可以点击阅读这篇文章 &#x1f447; 《简述 Runes 协议、发展历程及最新的「公开铭刻」发行机制的拓展讨论》 什么是传统预挖矿概念 这轮比特币生态爆发之前&#xff0c;预挖矿&…

鸿蒙OS(ArkTS) 案例:【使用http网络请求框架加载验证码】

需求&#xff1a;加载验证码&#xff1b;1.下载验证码图像文件&#xff1b;2.获取header里面验证码ID 踩坑--踩坑--踩坑 根据文档使用 request.downloadFile 请求&#xff0c;官方示例: // pages/xxx.ets // 将网络资源文件下载到应用文件目录并读取一段内容 import common …

【LVGL-消息框部件(lv_msgbox)】

LVGL-消息框部件&#xff08;lv_msgbox&#xff09; ■ LVGL-消息框部件&#xff08;lv_msgbox&#xff09;■ 示例一&#xff1a;隐藏&#xff0c;弹窗消息框■ 示例二&#xff1a;■ 综合示例&#xff1a; ■ LVGL-消息框部件&#xff08;lv_msgbox&#xff09; ■ 示例一&am…

金蝶BI方案治好我的数据分析困难症

结构分析、趋势分析、分布分析、对比分析……这还是大方向的&#xff0c;细分下来还会根据数据类型和具体场景不同而不同&#xff0c;不仅如此&#xff0c;每个月的数据分析需求还可能不同&#xff0c;导致分析量多且复杂&#xff0c;加班加点也忙不过来。但金蝶BI方案就不一样…

maven搭建继承聚合多模块项目,父项目更新依赖版本,子项目不会立即更新问题解决

1.网上文章&#xff08;一&#xff09;: idea中maven pom导入依赖失效&#xff0c;点刷新也没反应,解决方法 方式1: 右侧Maven,点击reload all maven project 如图&#xff0c;这是所有模块都进行刷新 发现不管用呀&#xff0c;子模块还是没有更新,试了很多遍不行&#xff0c…

U盘打不开怎么办?数据恢复与预防全攻略

U盘突发故障&#xff0c;无法打开之困 在日常生活中&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;当有一天你插入U盘时&#xff0c;电脑却提示无法识别或打开&#xff0c;这无疑会给你带来不小的困扰。面对这种情况&#xff0c;很多人可能会感到束手无…

AES加密解密算法

一&#xff0c;AES算法概述 AES属于分组加密&#xff0c;算法明文长度固定为128位&#xff08;单位是比特bit&#xff0c;1bit就是1位&#xff0c;128位等于16字节&#xff09; 而密钥长度可以是128、192、256位 当密钥为128位时&#xff0c;需要循环10轮完成加密&#xff0…

3.1 SQL概述

SQL&#xff08;Structured Query Language&#xff09; 结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 功能&#xff1a;查询&#xff0c;数据库模式创建&#xff0c;数据库数据的插入与修改&#xff0c;数据库完整性、安全…

js网页侧边悬浮滚动广告

原生js实现网页侧边随页面滚动广告效果 css /*测试用的高度*/html {height: 3000px;}#rightroll {position: absolute;}.close {position: absolute;right: 0;top: -10px;}.close img {width: 20px;height: 20px;}li {list-style: none;width: 80px;height: 80px;background-c…

argocd部署

一、前言 ArgoCD 是一个开源的、持续交付工具&#xff0c;用于自动化部署应用程序到 Kubernetes 集群。它基于 GitOps 理念&#xff0c;通过使用 Git 作为单一的源头来管理应用程序的配置和部署状态&#xff0c;argocd会定时监控git仓库中的yaml配置文件&#xff0c;当git仓库中…

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…

【JVM】JVM简介

文章目录 &#x1f334;简介&#x1f332;JVM发展史&#x1f338;Sun Classic VM&#x1f338;Exact VM&#x1f338;HotSpot VM&#x1f338;JRockit&#x1f338;J9 JVMTaobao JVM&#xff08;国产研发&#xff09; &#x1f333;JVM 运行流程⭕总结 &#x1f334;简介 JVM …