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、创建桶

2、设置权限

3、获取accessKey 和 secretKey

注意:创建__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

初步搭建一个自己的对象存储服务---Minio的更多相关文章

  1. 对象存储服务-Minio

    Mino 目录 Mino 对象存储服务 Minio 参考 Minio 架构 为什么要用 Minio 存储机制 纠删码 MinIO概念 部署 单机部署: Docker 部署Minio 分布式Minio ...

  2. 对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载

    目录 一.MinIO快速入门 1. MinIO简介 2. CentOS7更换成阿里云镜像 3. 安装 3.1 下载 3.2 运行测试 4. 配置脚本执行文件 4.1 创建配置执行文件 4.2 执行 二 ...

  3. 轻量对象存储服务——minio

    minio Minio是一个非常轻量的对象存储服务. Github: minio 它本身不支持文件的版本管理.如果有这个需求,可以用 s3git 搭配使用. Github: s3git 安装 mini ...

  4. 九、Swift对象存储服务(双节点搭建)

    九.Swift对象存储服务(双节点搭建) 要求:Controoler节点需要2块空盘 Compute节点需要再加2块空盘 本次搭建采用Controller 和 Compute双节点节点做swift组件 ...

  5. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  6. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  7. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  8. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  9. 使用MinIO搭建对象存储服务

    1.MinIO是什么? MinIO 是一款高性能.分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件.即X86等低成本机器也能够很好的运行MinIO. MinIO与传统的存储和其 ...

  10. COS对象存储服务的使用

    ---------------------------------------------------------------------------------------------[版权申明:本 ...

随机推荐

  1. SQLite总结

    废话不多说: 优点,高并发读快速度读取超越所有主流大中型数据库 缺点,缺少同步机制,读写不能同时,且同时只能有一个写入线程 用途,硬盘式缓存 另附一SQLite工具类: import java.io. ...

  2. 说说你对Node.js 的理解?优缺点?应用场景?

    一.是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动.非阻塞和异步输 ...

  3. 07cj031,07CJ03-1图集免费下载

    简介 07CJ03-1轻钢龙骨石膏板隔墙.吊顶图集是中国建筑标准设计研究院组织编写的一部针对轻钢龙骨.石膏板材料用于非承重隔墙.室内吊顶装修的装修.建造参考资料,为用户提供专业的建造参考 下载 有需要 ...

  4. 【笔记】Java相关大杂烩①

    [笔记]Java相关大杂烩 Java 程序的执行流程是? *.java 文件-->*.class 文件-->类装载器-->字节码校验器-->解释器-->操作系统平台 Ja ...

  5. 无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

    ​简介:Kubernetes 一贯的作风是通过定义标准来解决同一类问题,在解决集群对外流量管理的问题也不例外.Kubernetes 对集群入口点进行了进一步的统一抽象,提出了 3 种解决方案:Node ...

  6. IT人的年夜饭,也太香了吧

    ​简介: 平时的IT人,奋战在修复bug前线,起早与贪黑齐飞,调休共假期待定.到了新春佳节,对于IT人来说,没有什么是比一顿年夜饭更让人熨贴肺腑的了.为了让废寝忘食编程序.闻机起早保运维的IT人过一个 ...

  7. Flink 和 Pulsar 的批流融合

    简介: 如何通过 Apache Pulsar 原生的存储计算分离的架构提供批流融合的基础,以及 Apache Pulsar 如何与 Flink 结合,实现批流一体的计算. 简介:StreamNativ ...

  8. Flink 和 Iceberg 如何解决数据入湖面临的挑战

    简介: 4.17 上海站 Meetup 胡争老师分享内容:数据入湖的挑战有哪些,以及如何用 Flink + Iceberg 解决此类问题. 一.数据入湖的核心挑战 数据实时入湖可以分成三个部分,分别是 ...

  9. 7张图揭晓RocketMQ存储设计的精髓

    ​简介: RocketMQ 作为一款基于磁盘存储的中间件,具有无限积压能力,并提供高吞吐.低延迟的服务能力,其最核心的部分必然是它优雅的存储设计. 存储概述 RocketMQ 存储的文件主要包括 Co ...

  10. 21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!

    大家好,我是狂师! 在大数据时代,信息的获取与分析变得尤为重要.对于开发者.数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行分析是一个强有力的工具.今天,我要向大家推荐的是一款功能强大.操作 ...