docker搭建minio及java sdk使用过程详解

目录
  • 1minio简洁
  • 2 docker搭建minio
    • 2.1 单节点
    • 2.2 多节点部署
  • 3 java sdk使用minio

1minio简洁

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

MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。

MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

minio社区版本开源免费,在没有预算使用oss的时候可以考虑使用。

2 docker搭建minio

minio是支持云原生的,所以直接讲使用docker来搭建,当然也可以使用k8s,直接下载官方的chart使用即可。

2.1 单节点

单节点可以直接使用docker run启动即可

docker run \
  -p 9000:9000 \
  -p 9001:9001 \
  minio/minio server /data --console-address ":9001"

也可以使用docker-compose来运行。

编写docker-compose.yaml

version: '3'
services:
  minio:
    image: minio/minio
    hostname: "minio"
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ACCESS_KEY: admin #控制台登录账号
      MINIO_SECRET_KEY: 12345678 #控制台登录密码
    volumes:
      - ./data:/data      #存储路径
      - ./config:/root/.minio/   #配置文件
    command: server --console-address ':9001' /data
    privileged: true
    restart: always

创建挂载的文件目录,运行docker-compos启动。

docker-compser up -d

输入ip:9001 输入admin/12345678进入控制台

控制台:

创建bucket,就可以上传文件了。

输入名称保存。

可以配置,相关策略,这里就不说明了。

可以上传下载操对象文件。

2.2 多节点部署

多节点部署使用docker-compse来模拟。创建4个节点,每个节点挂载两份数据。

编写docker-compose.yaml

version: '3'

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:
    image: minio/minio
    hostname: minio1
    volumes:
      - ./data1-1:/data1
      - ./data1-2:/data2
    expose:
      - "9000"
      - "9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    command: server --console-address ":9001" http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio
    hostname: minio2
    volumes:
      - ./data2-1:/data1
      - ./data2-2:/data2
    expose:
      - "9000"
      - "9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    command: server --console-address ":9001" http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio
    hostname: minio3
    volumes:
      - ./data3-1:/data1
      - ./data3-2:/data2
    expose:
      - "9000"
      - "9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    command: server --console-address ":9001" http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio
    hostname: minio4
    volumes:
      - ./data4-1:/data1
      - ./data4-2:/data2
    expose:
      - "9000"
      - "9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    command: server --console-address ":9001" http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
      - "9001:9001"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

创建挂载的对应的data目录和nginx目录。

使用nginx负载均衡4个节点,创建nginx.conf。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  4096;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    # include /etc/nginx/conf.d/*.conf;

    upstream minio {
        server minio1:9000;
        server minio2:9000;
        server minio3:9000;
        server minio4:9000;
    }

    upstream console {
        ip_hash;
        server minio1:9001;
        server minio2:9001;
        server minio3:9001;
        server minio4:9001;
    }

    server {
        listen       9000;
        listen  [::]:9000;
        server_name  localhost;

        # To allow special characters in headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_buffering off;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 300;
            # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding off;

            proxy_pass http://minio;
        }
    }

    server {
        listen       9001;
        listen  [::]:9001;
        server_name  localhost;

        # To allow special characters in headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_buffering off;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-NginX-Proxy true;

            # This is necessary to pass the correct IP to be hashed
            real_ip_header X-Real-IP;

            proxy_connect_timeout 300;

            # To support websocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            chunked_transfer_encoding off;

            proxy_pass http://console;
        }
    }
}

运行。

docker-compser up -d

然后进入控制台,操作和单节点一样。

3 java sdk使用minio

sdk使用minio要先获取AccessKey和SecretKey。

在控制台生成。

项目pom文件引入。

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.0</version>
</dependency>

编写上传、下载、删除的接口。

package com.test.minio;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;

/**
 * 存储文件
 *
 * @author jiangyulu
 */
public interface FileService {
    /**
     * 上传文件
     *
     * @param inputStream inputStream
     * @param fdsFileName    fdsFileName
     * @param img         img
     * @return UUID
     */
    String upload(InputStream inputStream, String fdsFileName, boolean img);

    /**
     * 下载文件
     *
     * @param fdsFileName 文件在fds中的名称
     * @param fileName    重新指定的文件名
     * @param response    response
     */
    void download(String fdsFileName, String fileName, HttpServletResponse response);

    /**
     * 删除
     *
     * @param fdsFileName fdsFileName
     */
    void delete(String fdsFileName);
}

写实现类。

package com.test.minio.impl;

import com.test.minio.FileService;
import io.minio.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.UUID;

/**
 * @author jaingyulu
 */
@Slf4j
@Service("minio")
public class MinioFileServiceImpl implements FileService {

    @Value("{$minio.endpoint}")
    private String endpoint;

    @Value("{$minio.accessKeyId}")
    private String accessKeyId;

    @Value("{$minio.accessKeySecret}")
    private String accessKeySecret;

    @Value("{$minio.bucketName}")
    private String bucketName;

    @Override
    public String upload(InputStream inputStream, String fdsFileName, boolean img) {

        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(endpoint)
                            .credentials(accessKeyId, accessKeySecret)
                            .build();

            boolean found =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (found) {
                log.info("Bucket already exists.");
            } else {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }

            if (!img) {
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(bucketName)
                                .object(fdsFileName)
                                .stream(inputStream, inputStream.available(), -1)
                                .build());
            } else {
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(bucketName)
                                .object(fdsFileName)
                                .stream(inputStream, inputStream.available(), -1)
                                .contentType("image/jpg")
                                .build());
            }

            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return UUID.randomUUID().toString();
    }

    @Override
    public void download(String fdsFileName, String fileName, HttpServletResponse response) {
        InputStream in = null;
        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(endpoint)
                            .credentials(accessKeyId, accessKeySecret)
                            .build();
            StatObjectResponse objectStat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
            response.setContentType(objectStat.contentType());
            //response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
            IOUtils.copy(in, response.getOutputStream());
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
    }

    @Override
    public void delete(String fdsFileName) {
        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(endpoint)
                            .credentials(accessKeyId, accessKeySecret)
                            .build();
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上完成了minio文件操作的基本功能,其他功能可以查看官方的文档。8.3.0版本sdk比起7.x的变化还是比较大的。

到此这篇关于docker搭建minio及java sdk使用的文章就介绍到这了,更多相关docker搭建minio内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 轻量级对象存储服务minio安装及浏览器使用教程

    目录 简介 安装 1.创建需要挂载的文件夹 2.拉取镜像 3.创建容器 4.开放端口 使用 1.浏览器访问 2.新增bucket 3.设置bucket 4.上传浏览图片 简介 Minio 是一个基于Apache License v2.0开源协议的对象存储服务,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等:Minio是一个非常轻量的服务,可以很简单的和其他应用的结合. 官网:MinIO | High

  • docker版es、milvus、minio启动命令详解

    1.es启动命令: docker run -itd -e TAKE_FILE_OWNERSHIP=1111 -v /data/elasticsearch/data:/usr/share/elasticsearch/data -p 9200:9200 --name es elasticsearch:6.4.2 需要添加环境变量 TAKE_FILE_OWNERSHIP,值随意. 含义请参考我的另一篇文章://www.jb51.net/article/200198.htm 挂载目录用来存储es的数据.

  • docker搭建minio及java sdk使用过程详解

    目录 1minio简洁 2 docker搭建minio 2.1 单节点 2.2 多节点部署 3 java sdk使用minio 1minio简洁 MinIO 是一款高性能.分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件.即X86等低成本机器也能够很好的运行MinIO. MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计.因为MinIO一开始就只为对象存储而设计.所以他采用了更易用的方式进行设计,它能实现对象存储所需要的

  • Java类加载的过程详解

    目录 Java:类加载过程 1.加载--3件事 2.连接 2.1.验证 2.2.准备 2.3.解析 3.初始化 总结 Java:类加载过程 1.加载--3件事 1.通过全类名获取定义此类的二进制字节流(eg:从jar.war中获取): 2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构: 3.在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口. 2.连接 加载阶段和连接阶段的部分内容是交叉进行的,加载尚未结束,连接阶段可能就开始运行了. 2.1.验证 2.2.准备

  • Java NIO Buffer过程详解

    前言 在与NIO通道交互时使用Java NIO Buffer. 如您所知,数据从通道读入缓冲区,并从缓冲区写入通道. 缓冲区本质上是一个可以写入数据的内存块,然后可以再次读取. 此内存块包含在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用内存块. 基本缓冲区用法 使用缓冲区读取和写入数据通常遵循这4个小步骤: 1.写入数据到缓冲区 2.调用 buffer.flip() 3.从缓冲区读取数据 4.调用 buffer.clear() 或者 buffer.compact() 当你将

  • Docker跨主机容器通信overlay实现过程详解

    同样是两台服务器: 准备工作: 设置容器的主机名 consul:kv类型的存储数据库(key:value) docker01.02上: vim /etc/docker/daemon.json { "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"], 这行改了要修改自己的docker配置文件 "cluster-store": "consul://10

  • IDEA搭建SpringBoot多模块聚合工程过程详解(多模块聚合工程)

    目录 一.搭建环境 (1)IDEA创建maven工程 (2)修改pom依赖 (4)创建app-pojo子工程 (5)创建app-mapper子工程 (6)创建app-service子工程 (7)创建app-web子工程 (8)统一依赖管理 (9)添加web依赖 (10)关联子工程依赖 (11)测试子工程依赖是否成功 二.集成MyBatis (1)父工程中添加MyBatis依赖管理 (2)app-mapper子工程引入MyBatis (4)配置mybatis和mysql数据源 (5)service

  • 在Kubernetes集群中搭建Istio微服务网格的过程详解

    目录 1.使用sealos部署快速部署K8S集群 1.1.基本环境配置 1.2.部署K8S集群 2.在K8S集群中部署Istio网格服务 2.1.下载Istio安装包 2.2.查看Istio可用的配置列表 2.3.展示Istio配置档的配置信息 2.4.查看Istio在k8s集群部署使用的YAML文件内容 1.使用sealos部署快速部署K8S集群 1.1.基本环境配置 1.设置主机名 hostnamectl set-hostname k8s-master hostnamectl set-hos

  • docker machine安装极狐gitlab的过程详解

    目录 1. 环境信息 1.1 主机信息 1.2 配置信息 1.3 环境初始化 1.4 升级内核 1.5 安装 docker 1.6 安装 docker machine 2. 安装极狐gitlab 2.1 获取可用的极狐gitlab镜像tags 2.2 设置环境变量 2.3 创建 docker host 2.4 连接到 docker host 2.5 创建极狐gitlab容器 2.6 访问极狐gitlab 1. 环境信息 1.1 主机信息 主机 用途 10.10.10.60 极狐gitlab 1.

  • 基于docker 搭建Prometheus+Grafana的过程详解

    一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作.Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus.现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控. Prometheus基本原理是通过HTT

  • Java搭建RabbitMq消息中间件过程详解

    这篇文章主要介绍了Java搭建RabbitMq消息中间件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 当系统中出现"生产"和"消费"的速度或稳定性等因素不一致的时候,就需要消息队列. 名词 exchange: 交换机 routingkey: 路由key queue:队列 控制台端口:15672 exchange和queue是需要绑定在一起的,然后消息发送到exchange再由exchange通过ro

  • Java 用Prometheus搭建实时监控系统过程详解

    上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念也会精炼出提及下.系列主要分为以下几块 Prometheus各个概念介绍和搭建,如何抓取数据(本次分享内容)

随机推荐