MinIO学习与应用本文主要记录MinIO的学习与应用,外加IDEA远程部署docker应用,后续还会对其进行补充,谢谢
简介
`MinIO`是一个开源高性能的对象存储服务器,它具有分布式、高可用、水平扩展的特点;非常适合用于大规模对象存储和数据分析,优点包括**低延迟、易部署和管理、高吞吐等**安装部署
本文使用Docker基于centos服务器来进行服务的搭建- 首先创建两个文件目录:一个用来存放Minio的配置文件,一个用来存放我们上传的数据
//用于存放 MinIO 的配置文件
mkdir -p /home/minio/config
//用于存储上传的文件数据
mkdir -p /home/minio/data
- 接下来我们可以通过如下命令拉取最新镜像并创建Minio容器运行
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_KEY`和`MINIO_SECRET_KEY`是UI界面的账号和密码
- `-d`将容器以后台(守护进程)的方式运行,并于终端分离
- `--restart=always`容器在停止后总是自动重启
- `minio/minio server`使用MinIO镜像并启动
- `data`要使用的数据目录
- `--console-address ":9001"`指定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指令将无法成功运行,并会报错提示找不到镜像。
- 最后在浏览器访问 http://服务器ip:9001,即可访问MinIO控制台
输入账号 admin 密码 password进行登录,进入首页
配置
1. **创建一个Bucket存储桶用于文件上传操作**- 点击User创建用户
- 默认配置下,访问存储桶是需要请求授权的。但是在实际场景下,我们往往希望允许直接访问,此时就需要添加一条 readonly 访问规则。
至此,我们已经完成了MinIO的简单配置;如果还想要更加安全,可以设置安全组分配权限之类的
项目测试
通过springboot进行代码测试- 引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MinIO 客户端 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
- 新建MinIO配置类,创建MinIOClient Bean
package com.example.demo;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "file.minio")
@Data
public class MinioConfiguration {
private String accessKey;
private String secretKey;
private String endpoint;
private String bucket;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
- 在application.yml中编写配置
# 对象存储服务配置
file:
# MinIO自搭建对象存储服务
minio:
endpoint: http://服务器ip:9000 #存储服务域名
accessKey: SBIB5OBHBSWKLNPWLSV8
secretKey: Sq+augOAtETs2qD5O8GyfEF6Kiz449GJ+iIAa1a6
bucket: test #存储桶名称
knife4j:
enable: true
openapi:
title: Knife4j官方文档
# aaa"
email: 3105755134@qq.com
concat: MeiguMIN
url: https://docs.xiaominfo.com
version: v4.0
license: Apache 2.0
license-url: https://stackoverflow.com/
terms-of-service-url: https://stackoverflow.com/
group:
test1:
api-rule: package
api-rule-resources:
- com.example.demo.controller
server:
port: 8088
- 编写Controller类
package com.example.demo.controller;
import com.example.demo.MinioConfiguration;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.UUID;
@RestController
@RequestMapping("/file")
public class FileController {
@Resource
private MinioClient minioClient;
@Resource
private 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);
}
}
- 启动SpringBoot项目,测试接口,可以看到后端正确返回了地址,MinIO中也有对应的文件
dlc:IDEA+Docker远程部署项目
目的
抛弃传统的jar包部署项目或者宝塔部署学习docker的使用,提高部署效率
进行SSH连接配置
因为需要连接服务器进行远程部署,因此必须先进行ssh配置(`file->setting->搜索ssh`),这边嫌麻烦所以用的password连接docker守护进程
接下来需要连接Docker守护进程(`file->Settings->docker`)来操作dockerDocker daemon
补充说明:
Docker daemon(或称为 Docker 守护进程)是运行在宿主机上的一个持续运行的服务,负责管理 Docker 容器的创建、运行、停止等操作。它是 Docker 引擎的核心组件之一。
Docker daemon 有以下几个主要的作用:
- 容器管理:Docker daemon 负责管理容器的生命周期,包括创建、运行、停止、删除等操作。它接收来自 Docker 客户端的命令,并根据命令进行相应的操作,例如根据指定的镜像创建容器,启动容器的进程等。
- 镜像管理:Docker daemon 负责管理 Docker 镜像,它可以从 Docker Hub 或其他镜像仓库中下载镜像,并根据需要构建、打包、发布和分发镜像。它还负责缓存镜像,以便在创建容器时可以快速获取需要的镜像。
- 网络管理:Docker daemon 负责管理容器的网络。它将为每个容器分配一个唯一的 IP 地址,并为容器提供网络连接,使得容器可以与其他容器或宿主机进行通信。
- 存储管理:Docker daemon 负责管理容器的存储,包括容器的文件系统、数据卷和容器的持久化存储等。它可以根据指定的存储驱动程序将容器的数据保存在宿主机上的文件系统中,并为容器提供数据卷,以便对容器的存储进行管理。
Docker daemon 是 Docker 引擎运行在宿主机上的核心组件,它负责处理容器管理、镜像管理、网络管理和存储管理等任务,提供了一个方便、高效、可靠的容器化平台。
编写Dockerfile文件
然后我们需要编写用于定义和构建Docker镜像的文本文件# 基础镜像
FROM openjdk:8
# 复制主机到镜像内,复制的目录需放置在 Dockerfile 文件同级目录下
ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
#容器启动执行命令
ENTRYPOINT ["java","-jar","/app.jar"]
#对外暴露的端口
EXPOSE 8088
至此准备工作已全部完成,接下来即可正式远程部署
配置远程部署
1. 前往创建配置- 添加配置
- 根据下述步骤填写之前所进行的一系列配置即可
- 至此,所有配置都已完成,最后尝试一下本文开始所述”点击绿色小三角(一步)即可自动完成项目部署“
正在上传文件喵~~~~~
项目已经运行起来了喵~~~~~
可以看到宝塔面板中该容器已经运行起来了
在knife4j测试也没有问题(上线环境记得把接口文档隔离,我这边是为了测试方便)
至此正式结束,第一次配置或许有点麻烦,但是后续是真的简单
转载自:https://juejin.cn/post/7412507670177579049