MinIO存储在docker中安装及其使用方式

 更新时间:2023年04月03日 15:06:25   作者:一路向北⁢  
这篇文章主要介绍了MinIO存储在docker中安装及其使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MinIO存储在docker安装及使用

MinIO

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL

docker 安装Minio

安装docker镜像

# docker安装镜像
docker pull minio/minio

容器运行方式① 和 容器运行方式② 选择一种就好。

运行容器方式①

# 后台运行容器
docker run -p 9000:9000 --name storage -di -v /storage/data:/data -v /storage/config:/root/.minio --restart=always minio/minio server /data

1,进入容器
docker exec -it storage sh

2,查看配置文件中的key值
cat /data/.minio.sys/config/config.json |grep Key
“accessKey”: “507LX5P57F99DNEVF1GH”,
“secretKey”: “Kc2tllnd9FQrgTzu0RSohir4B4svh2cLiueGZR5x”,
“routingKey”: “”,

运行容器方式②

# 后台运行容器方式
docker run -p 9000:9000 --name storage -di --restart=always \
  -e "MINIO_ACCESS_KEY=superzheng" \
  -e "MINIO_SECRET_KEY=storage/File" \
  -v /storage/data:/data \
  -v /storage/config:/root/.minio \
  minio/minio server /data
  
# -p 端口映射  将外部端口 映射到 容器内部端口  
# --name 自定义容器名称
# -di 后台运行的方式运行
# --restart=always  一旦docker重启或者开启时,也自动启动镜像
# -e 设置系统变量  在这里是设置Minio的ACCESS_KEY和SECRET_KEY
# -v 挂载文件  将系统文件  映射到  容器内部对应的文件夹
  

这是安装成功的日志:

更多信息:请访问官网 https://docs.min.io/cn/

java代码操作

package cn.mesmile.oss.minio;

import cn.hutool.core.util.StrUtil;
import cn.mesmile.oss.domain.FileInfoResp;
import cn.mesmile.oss.exception.BucketNotExistException;
import cn.mesmile.oss.exception.ContentTypeException;
import cn.mesmile.oss.exception.FileSizeMaxException;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.messages.DeleteError;
import io.minio.policy.PolicyType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * @author zb
 * @date 2019/12/15 14:20
 * @Description:
 * Copyright (C),2019,AOSSCI Inc.傲势科技有限公司
 *   Endpoint	对象存储服务的URL
 *   Access key就像用户ID,可以唯一标识你的账户。
 *   Secret key是你账户的密码。
 */
@Component
public class FileService {

    /**
     * 对象存储服务的URL, 注意 这里的endpoint填写 url会报错,这里endpoint的值应该为 【 http://ip:端口号 】 的形式  
     */
    @Value("${minio.endpoint}")
    private  String endpoint;

    /**
     * 就像用户ID,可以唯一标识你的账户
     */
    @Value("${minio.access-key}")
    private  String accessKey;

    /**
     * 是你账户的密码
     */
    @Value("${minio.secret-key}")
    private  String secretKey;

    // 上传的最大限制 10 M
    private static final long MAX_SIZE =1024*1024*100;

    /**
     *  上传图片
     * @param bucketName  桶名称
     * @param file        文件
     * @return
     * @throws Exception
     */
    public FileInfoResp uploadImage(String bucketName, MultipartFile file) throws Exception{
        String contentType = file.getContentType();
        // image/png
        if (!StrUtil.containsAny(contentType,"image")) {
            throw new ContentTypeException("文件类型错误,请上传图片文件。");
        }
        return uploadFile(bucketName,file,"image");
    }

    /**
     * 上传文件
     * @param bucketName 桶名
     * @param file  文件
     * @return
     * @throws Exception
     */
    public FileInfoResp uploadFile(String bucketName, MultipartFile file) throws Exception {
        String contentType = file.getContentType();
        return uploadFile(bucketName,file,contentType);
    }

    /**
     *  删除单个文件
     * @param bucketName
     * @param objectName
     * @return
     * @throws Exception
     */
    public Iterable<Result<DeleteError>> deleteFileSingle(String bucketName, String objectName) throws Exception {
        return deleteFile(bucketName,objectName,null);
    }


    /**
     *  批量删除文件
     * @param bucketName  桶名
     * @param objectNames 批量路径名称
     * @return
     * @throws Exception
     */
    public Iterable<Result<DeleteError>> deleteFileBath(String bucketName, Iterable<String> objectNames) throws Exception {
        return deleteFile(bucketName,null,objectNames);
    }


    /**
     *  删除桶
     * @param bucketName  桶名称
     * @throws Exception
     */
    public void deleteBucket(String bucketName) throws Exception {
        MinioClient minioClient = new MinioClient(endpoint,accessKey,secretKey);
        if (!minioClient.bucketExists(bucketName)) {
            throw new BucketNotExistException("桶不存在");
        }
        minioClient.removeBucket(bucketName);
    }


    /**
     *  删除文件
     * @param bucketName  桶的名称
     * @param objectName  路径名例:  /image/123.jpg
     * @param objectNames 批量路径名:
     * @return
     * @throws Exception
     */
    private Iterable<Result<DeleteError>> deleteFile(String bucketName, String objectName,Iterable<String> objectNames) throws Exception {
        MinioClient minioClient = new MinioClient(endpoint,accessKey,secretKey);
        if (!minioClient.bucketExists(bucketName)) {
            throw new BucketNotExistException("桶不存在");
        }
        if (objectNames != null) {
            return minioClient.removeObject(bucketName, objectNames);
        } else {
            minioClient.removeObject(bucketName, objectName);
            return null;
        }
    }


    /**
     *  上传文件
     * @param bucketName  桶的名称
     * @param file   文件名
     * @param prefix  前缀
     * @return
     * @throws Exception
     */
    private FileInfoResp uploadFile(String bucketName, MultipartFile file, String prefix) throws Exception {
        if (file.getSize() > MAX_SIZE ) {
           throw new FileSizeMaxException("文件过大,超过限制大小:"+MAX_SIZE/(1024*1024.0)+" M");
        }
        MinioClient minioClient = new MinioClient(endpoint,accessKey,secretKey);
        minioClient.setBucketPolicy(bucketName,prefix, PolicyType.READ_WRITE);
        // 检查桶是否存在,若不存在则创建一个
        if (!minioClient.bucketExists(bucketName)) {
            minioClient.makeBucket(bucketName);
        }
        InputStream inputStream = file.getInputStream();
        String contentType = file.getContentType();
        String filename = file.getOriginalFilename();
        String objectName = prefix + "/" +filename;

        // 上传文件
        minioClient.putObject(bucketName,objectName,inputStream,contentType);
        return FileInfoResp.builder()
                .bucketName(bucketName)
                .fileName(filename)
                .objectName(objectName)
                .contentType(contentType)
                .prefix(prefix)
                .url(endpoint + "/" + bucketName + "/" + objectName)
                .build();
    }

}

Docker-compose安装部署MinIO存储服务

环境准备

拉取minio的docker镜像:docker pull minio/minio

创建挂载目录:

[root@test data]# mkdir /mnt/data
[root@test data]# pwd
/mnt/data
[root@test data]# cd /home/app/minio/
[root@test minio]# ls
docker-compose.yaml  minio.tar.gz

编写docker-compose.yaml文件:

[root@test minio]# cat docker-compose.yaml
version: '3'
services:
  miniocheck:
    image: minio/minio:amd64
    command: server /data --console-address ":9001"
    volumes:
      - /mnt/data:/data # 持久化地址
    ports:
      - "9000:9000" # 绑定端口
      - "9001:9001"
    container_name: minio
    restart: always
    environment:
      MINIO_ROOT_USER: admin # 账号
      MINIO_ROOT_PASSWORD: gbase;123 #密码

command指令中添加--console-address参数,否则浏览器访问控制台自动跳转端口导致无法访问,查看日志可看到如下信息:

[root@test minio]# docker-compose logs -f
Attaching to minio
minio         | API: http://172.24.0.2:9000  http://127.0.0.1:9000
minio         |
minio         | Console: http://172.24.0.2:34327 http://127.0.0.1:34327
minio         | 
minio         | Documentation: https://docs.min.io
minio         |
minio         | WARNING: Console endpoint is listening on a dynamic port (34327), please use --console-address ":PORT" to choose a static port.
minio         | Exiting on signal: TERMINATED

启动容器并访问

启动容器,查看容器状态:

[root@test minio]# docker-compose up -d
Creating network "minio_default" with the default driver
Creating minio ... done
[root@test minio]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS                             PORTS                                                                                                                                 NAMES
a5464ecaac1b   minio/minio:amd64      "/usr/bin/docker-ent…"   5 seconds ago   Up 3 seconds                       0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp                                                                         minio
01f5e4eb4004   dperson/samba:latest   "/sbin/tini -- /usr/…"   3 days ago      Up 24 seconds (health: starting)   0.0.0.0:139->139/tcp, :::139->139/tcp, 0.0.0.0:137-138->137-138/udp, :::137-138->137-138/udp, 0.0.0.0:445->445/tcp, :::445->445/tcp   samba_samba_1
[root@test minio]# docker-compose logs -f
Attaching to minio
minio         | API: http://172.19.0.2:9000  http://127.0.0.1:9000
minio         |
minio         | Console: http://172.19.0.2:9001 http://127.0.0.1:9001
minio         |
minio         | Documentation: https://docs.min.io

浏览器访问控制台:

输入docker-compose.yaml文件中自定义的账号密码:

至此,minio部署成功。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于docker清理Overlay2占用磁盘空间的问题(亲测有效)

    关于docker清理Overlay2占用磁盘空间的问题(亲测有效)

    使用Docker过程中,长时间运行服务容器,导致不能进行上传文件等操作,今天通过本文给大家详细介绍下docker清理Overlay2占用磁盘空间的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • Centos7安装docker compse踩过的坑及解决方法

    Centos7安装docker compse踩过的坑及解决方法

    本文,我们介绍如何在centos7环境下安装docker-compose, 记录下安装过程步骤以及遇到的问题还有解决办法,感兴趣的朋友参考下吧
    2018-01-01
  • 从零搭建docker私有仓库的步骤

    从零搭建docker私有仓库的步骤

    这篇文章主要介绍了从零搭建docker私有仓库的步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • SEATA事务服务DOCKER部署的过程详解

    SEATA事务服务DOCKER部署的过程详解

    这篇文章主要介绍了SEATA事务服务DOCKER部署的过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Docker快速部署主流脚本语言JavaScript的全过程

    Docker快速部署主流脚本语言JavaScript的全过程

    JavaScript是目前所有主流浏览器上唯一支持的脚本语言,这也是早期JavaScript的唯一用途,下面这篇文章主要给大家介绍了关于Docker快速部署主流脚本语言JavaScript的相关资料,需要的朋友可以参考下
    2023-02-02
  • Linux下使用Docker部署MinIO存储服务实现远程上传的方法

    Linux下使用Docker部署MinIO存储服务实现远程上传的方法

    MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等,本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,感兴趣的朋友一起看看吧
    2023-11-11
  • Docker阿里云RocketMQ 4.5.1部署流程详解

    Docker阿里云RocketMQ 4.5.1部署流程详解

    RocketMQ是阿里开源的一款分布式消息中间件,具有日志监控、消息推送、金融报文、电信信令、削峰填谷等功能.接下来通过本文给大家介绍Docker阿里云RocketMQ 4.5.1部署流程,感兴趣的朋友一起看看吧
    2021-05-05
  • 详解Docker 配置国内免费registry mirror

    详解Docker 配置国内免费registry mirror

    本篇文章主要介绍了 Docker 配置国内免费registry mirror,具有一定的参考价值,有兴趣的小伙伴们可以参考一下
    2017-07-07
  • Docker容器服务编排利器详解

    Docker容器服务编排利器详解

    这篇文章主要介绍了Docker容器服务编排利器,主要包括使用使用Docker Compose必要性及定义及一些Docker Compose应用参考资料,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • docker-registry使用笔记

    docker-registry使用笔记

    在国内docker-hub是肯定用不了的,不解释:所以最好还是建一个私有的docker-registry,存储一些常用的images方便随时pull
    2016-09-09

最新评论