Docker最佳实践(七):安装MinIO文件服务器

news2024/9/23 17:13:47

大家好,欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器,专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟,可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器,便于我们在微服务的场景下统一的利用文件资源。

一、拉取镜像

sudo docker pull minio/minio

二、创建挂载目录

启动前需要先创建Minio外部挂载文件目录:

  • 配置文件:/kim/minio/config
  • 存储上传文件目录:/kim/minio/data
sudo mkdir -p /kim/minio/config
sudo mkdir -p /kim/minio/data

三、创建容器并且运行

docker run \  
-p 9000:9000 \  
-p 9090:9090 \  
--name minio \  
-d --restart=always \  
-e "MINIO_ACCESS_KEY=admin" \  
-e "MINIO_SECRET_KEY=admin123" \  
-v /kim/minio/data:/data \  
-v /kim/minio/config:/root/.minio \  
minio/minio server \  
/data --console-address ":9090" -address ":9000"

防火墙放开端口9090、9000

sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
#重启配置
sudo firewall-cmd --reload

命令释义

  • -p 9000:9000: 将主机的9000端口映射到容器的9000端口,用于访问MinIO对象存储服务。
  • -p 9090:9090: 将主机的9090端口映射到容器的9090端口,用于访问MinIO的控制台。
  • --name minio: 为容器指定名称为"minio",方便对容器进行管理和操作。
  • -d: 在后台运行容器,以守护进程方式执行。
  • --restart=always: 设置容器始终自动重启,以确保服务可靠性。
  • -e "MINIO_ACCESS_KEY=minioadmin": 设置MinIO账号为"admin",用于访问MinIO服务时进行身份验证。
  • -e "MINIO_SECRET_KEY=minioadmin": 设置MinIO密码为"admin123",用于访问MinIO服务时进行身份验证。
  • -v /kim/minio/data:/data: 将主机的/kim/minio/data目录挂载到容器的/data目录,用于存储MinIO的数据文件。
  • -v /kim/minio/config:/root/.minio: 将主机的/kim/minio/config目录挂载到容器的/root/.minio目录,用于存储MinIO的配置文件。
  • minio/minio server /data --console-address ":9090" -address ":9000": 启动MinIO服务器,并指定数据存储路径为/data,控制台地址为":9090",服务地址为":9000"。

四、Minio页面基础操作教程

4.1 登录页面

访问:http://xx.xx.xx.xx:9090/login 账号:密码 admin:admin123
在这里插入图片描述

4.2 创建用户

在这里插入图片描述

4.3 创建组

在这里插入图片描述

4.4 创建Buckets

在这里插入图片描述
Access Policy设置为public,否则无法通过服务端访问图片在这里插入图片描述

4.5 创建Access Keys

记录下密钥后边会用到
在这里插入图片描述

到这里我们就可以使用Minio进行文件的上传和下载服务了,下边我们整合到springboot中。

五、SpringBoot整合Minio

5.1 引入依赖
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.2</version>
</dependency>

5.2 相关核心代码
public interface ISysFileService
{
    /**
     * 文件上传接口
     * 
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception;
}


import com.alibaba.nacos.common.utils.IoUtils;
import com.kingoffice.system.config.MinioConfig;
import com.kingoffice.system.service.sys.ISysFileService;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import utils.FileUploadUtils;

import java.io.InputStream;

/**
 * Minio 文件存储
 *
 * @author ruoyi
 */
@Primary
@Service
public class MinioSysFileServiceImpl implements ISysFileService
{
    @Autowired
    private MinioConfig minioConfig;

    @Autowired
    private MinioClient client;

    /**
     * Minio文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String fileName = FileUploadUtils.extractFilename(file);
        InputStream inputStream = file.getInputStream();
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(inputStream, file.getSize(), -1)
                .contentType(file.getContentType())
                .build();
        client.putObject(args);
        IoUtils.closeQuietly(inputStream);
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }
}


import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Minio 配置信息
 *
 * @author ruoyi
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{
    /**
     * 服务地址
     */
    private String url;

    /**
     * 用户名
     */
    private String accessKey;

    /**
     * 密码
     */
    private String secretKey;

    /**
     * 存储桶名称
     */
    private String bucketName;

    public String getUrl()
    {
        return url;
    }

    public void setUrl(String url)
    {
        this.url = url;
    }

    public String getAccessKey()
    {
        return accessKey;
    }

    public void setAccessKey(String accessKey)
    {
        this.accessKey = accessKey;
    }

    public String getSecretKey()
    {
        return secretKey;
    }

    public void setSecretKey(String secretKey)
    {
        this.secretKey = secretKey;
    }

    public String getBucketName()
    {
        return bucketName;
    }

    public void setBucketName(String bucketName)
    {
        this.bucketName = bucketName;
    }

    @Bean
    public MinioClient getMinioClient()
    {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

在Nacos服务中配置Minio配置,注意此时配置的为服务端端口9000

# Minio配置  
minio:  
  url: http://xx.xx.xx.xx:9000  
  accessKey: xxxx  
  secretKey: xxxx  
  bucketName: xxxxx

至此就已经完成了Minio的后端整合教程,此代码摘录于若依,参考代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库基础:约束

&#x1f48e;我的主页&#xff1a;MySQL &#x1f48e;1. 约束的概述 约束是作用于表中字段的规则&#xff0c;用于限制存储在表中的数据 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性 &#x1f48e;2. 约束的分类 &#x1f48e;2.1 非空约束 非空…

linux之top

要在 Linux 系统上查看 CPU 使用情况&#xff0c;可以使用top命令&#xff1a; 根据您提供的 top 命令的输出&#xff0c;我们可以看到系统的一些基本信息和当前运行的进程。下面是输出的主要部分的解释&#xff1a; 仅供参考&#xff1a; 系统概述: 时间&#xff1a;当前时间…

MATLAB(R和C++)大肠杆菌合成生物机械数学模型

&#x1f3af;要点 &#x1f3af;合成大肠杆菌生物学网络 | &#x1f3af;量化基因型-表型图 | &#x1f3af;化学诱导离散浓度下培养细菌评估整个浓度范围内的表达模式 | &#x1f3af;定性更改合成模型拓扑结构、定量更改相互作用的强度 | &#x1f3af;开发机械数学模型 | …

新增题目同步到ES

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.创建ES的索引和映射1.创建索引2.创建映射 2.sun-club-infra …

C语言 ——— 学习、使用memmove函数 并模拟实现

目录 memmvoe函数的功能 学习memmove函数​编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数&#xff0c;都是内存拷贝&#xff0c;唯一的区别是memcpy函数不能成功拷贝原数据&#xff0c;而memmvoe函数可以 举例来说&#xff1a; [1, 2, 3…

【Material-UI】Checkbox 组件自定义详解

文章目录 一、Checkbox 组件概述1. 组件介绍2. 基本用法 二、Checkbox 组件的基本自定义1. 更改复选框的颜色2. 调整复选框的大小 三、Checkbox 组件的高级自定义1. 自定义图标2. 自定义复选框的边框和形状 四、使用主题进行全局自定义1. 定义全局主题2. 动态主题切换 五、总结…

springboot整合springmvc使用外置的Servlet容器

目录 1. 创建2. 配置3. 配置Tomcat4. 心得 1. 创建 2. 配置 首先创建两个文件夹 配置&#xff1a; 3. 配置Tomcat 右上角的按钮 添加 保证这几个不冲突&#xff0c;保证你的tomcat的文件没问题&#xff01;&#xff01;&#xff01; 点击部署 选择第二个war exploded…

零基础5分钟上手谷歌云GCP核心云开发技能 - 搭建和维护高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新谷歌云GCP云计算知识学习系列&#xff0c;适用于任何无云计算或者谷歌云技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台&#xff0…

GPT解逻辑数学题之8个8变1000的故事

目录 初试正解 我&#xff1a; GPT4&#xff1a; 再问思索 我&#xff1a; GPT4&#xff1a; 提醒错误 我&#xff1a; GPT4&#xff1a; 给出正解提示 我&#xff1a; GPT4&#xff1a; 不愿放弃 我&#xff1a; GPT4&#xff1a; 再次尝试 我&#xff1a; …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能&#xff1a; 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件&#xff08;夹&#xff09;的作用&#xff1a; 五、常用命令 一、Nginx的功能&#xff1a; 1.反向代理&#xff1a;例如我有三台服务器&#x…

Linux源码阅读笔记20-PCI设备驱动详解

PCI基础 PCI总线为高性能局部总线&#xff0c;主要解决外部设备之间以及外部设备与主机之间高速数据传输。在数字图形、图像等处理&#xff0c;以及告诉实时数据采集与处理等队数据传输速率要求高的应用中&#xff0c;采用PCI总线进行数据传输。PCI规范能够实现32位并行数据传…

我在高职教STM32——I2C通信入门(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

STM32G070KBT6的RTC HAL库使用

*配置问题 首先使能时钟源&#xff0c;这里在时钟配置中选择LSI&#xff0c;为什么后面会说&#xff0c;然后使能Calender结构体&#xff0c;保证可以对RTC的年月日时分秒等进行写入和读取&#xff1b;alarmA和alarmB是闹钟&#xff0c;这里不用就Disable&#xff1b; Tam…

突破•指针六

听说这是目录哦 数组和指针笔试题解析&#x1fae7;一维数组1&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355; 字符数组1&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;2&#…

高并发下的分布式缓存 | Read-Through缓存模式

缓存系列文章链接如下&#xff1a; 高并发下的分布式缓存 | 缓存系统稳定性设计 高并发下的分布式缓存 | 设计和实现LRU缓存 高并发下的分布式缓存 | 设计和实现LFU缓存 高并发下的分布式缓存 | Cache-Aside缓存模式 Read-Through 模式的缓存操作 Read-Through模式的一个关键…

Scanner类、String类和StringBuffer类的相关使用

一、Scanner: 主要用于键盘录入的 构造方法&#xff1a; Scanner(InputStream source) 构造一个新的 Scanner &#xff0c;产生从指定输入流扫描的值。 1、next()和nextLine()区别&#xff1a; String line sc.next(); // 不会接收特殊字符&#xff0c;比如空格回…

高效的编程学习方法和技巧

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

基于单片机的智能空气净化系统

【摘 要】 设计了一种基于单片机的智能空气净化系统。通过传感器实时采集空气中 PM2.5 、甲醛等有害健康物质的浓度&#xff0c;将各项数据显示到液晶显示屏&#xff0c;当浓度超过设置的警戒值时&#xff0c;控制蜂鸣器发出警报。根据浓度大小控制空气净化器电机转速&#xf…

04.C++类和对象(中)

1.类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载不重…

Selenium + Python 自动化测试04(操作方法1)

上一篇我们讲述了webdriver 元素定位方法。我们对如何定位元素有了一个基本的认识。接着我们详细讲述对元素常见的一些基本操作方法&#xff0c;以便我们可以做很多功能操作的测试。这一篇侧重最基本的操作方面。 1、send_keys 方法 此方法类似于模拟键盘输入。还是以下面网站…