Docker上部署Minio及整合

348 阅读2分钟

本文介绍了如何使用MinIO构建分布式文件服务,并与Spring Boot进行整合实现文件上传功能。MinIO是一款基于Go语言开发的高性能开源对象存储服务,兼容亚马逊S3接口,适用于多种应用场景,包括私有云存储和作为云存储网关。其主要特点包括高性能(读写速率可达55Gb/s和35Gb/s)、支持大文件存储(最大5T)、可扩展性、云原生支持、图形化界面、纠删码数据保护等。

安装MinIO

  • 使用Docker安装,包括获取镜像和启动容器:

    • 命令:docker pull minio/minio
    • 启动命令:docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data
    • 参数解释:9000为图形界面端口,9001为API端口;MINIO_ACCESS_KEYMINIO_SECRET_KEY分别为图形界面用户名和密码,且MINIO_ACCESS_KEY必须大于等于3位,MINIO_SECRET_KEY必须大于等于8位。
  • 图形界面操作:访问http://<ip>:9000/login,登录后可在Buckets菜单创建桶并设置隐私规则。

Spring Boot整合MinIO

  • 获取accessKeysecretKey:在MinIO图形界面中获取,不同于登录用户名和密码。

  • 添加依赖:

            <dependency>
                <groupId>io.minio</groupId>
                <artifactId>minio</artifactId>
                <version>8.5.2</version>
            </dependency>
    
  • 配置application.yml

    minio:
      # 访问的url
      endpoint: <http://localhost>
      # API的端口
      port: 9001
      accessKey: ZTJ11ewfzAlFYV2RLTYD
      secretKey: O82Y1D3L2FdusRi1gkoRKljep6KhRbvM0iVepghj
      bucket: filedemo
      secure: false
    
  • 创建上传文件接口:

    public String uploadFile(MultipartFile file) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
            String fileName = file.getOriginalFilename();
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .stream(file.getInputStream(), file.getSize(), -1)
                            .build()
            );
    
            // 保存文件信息到数据库
            FileInfo fileInfo = new FileInfo();
            fileInfo.setFileName(fileName);
            fileInfo.setFileUrl(String.format("%s:%d/%s/%s", endpoint, port, bucketName, fileName));
            fileInfo.setFileSize(file.getSize());
            fileInfo.setContentType(file.getContentType());
            fileInfo.setUploadTime(LocalDateTime.now());
            fileInfoRepository.save(fileInfo);
    
            return fileInfo.getFileUrl();
    }
    
  • 测试:调用接口上传文件,返回的URL可直接访问文件。MinIO中也可查看存储的文件,并支持临时分享,有效期7天。

MinIO作为开源项目功能强大,适合小型项目实现对象存储或搭建免费图床。