Docker部署minio存储及整合springboot使用

介绍

         Docker:容器、微服务。。。可以理解为一台小的虚拟机,也就是一台linux服务器上面可以部署很多个小的虚拟机
         Minio: 对象存储,开源免费,社区大生态好。用来存储数据,可以存储照片、文件、视频等各种数据。功能强大并发强,处理速度快。

一、准备Docker环境

1、linux安装docker环境

1、安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2、添加软件源头(阿里源)- 加速
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、更新yum
sudo yum makecache fast

4、安装docker
sudo yum install docker-ce

5、启动服务  重启restart 停止stop 
systemctl start docker

6、查看版本
docker version

2、docker配置阿里云镜像加速
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

"registry-mirrors" : 这个参数取阿里云那里免费获取。https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v3ljuzbc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

二、docker部署minio

      1、流程:

               1、 先拉去minio镜像到本地

                2、创建minio存储服务对应的文件夹,好做文件映射,因为docker不持久化数据,重启会丢失,所以需映射到本地

                3、基于镜像创建一个容器,也就是minio服务。指定映射端口、映射文件夹、minio的登录账号密码、镜像名称等。

        2、部署

1、拉取镜像 
  docker pull minio/minio
2、创建对应保存minio文件的映射
  mkdir -p /data2/minio2/config
  mkdir -p /data2/minio2/data

3、运行容器
  docker run \
  -p 19000:9000 \
  -p 9090:9090 \
  --name minio \
  -d --restart=always \
  -e "MINIO_ACCESS_KEY=账号" \
  -e "MINIO_SECRET_KEY=密码" \
  -v /data2/minio2/data:/data \
  -v /data2/minio2/config:/root/.minio \
   minio/minio server \
  /data --console-address ":9090" -address ":9000" 

        文件存储格式就是真实的文件,真实的图片在linux上面

3、访问

访问:http://1.117.72.15:9090/login 用户名: 账号:密码

MinIO管理界面:

4、创建桶、配置权限

        需要创建一个Bucket(桶),文件都是存放在这些个里面的,不同的bucket可以做不同的权限,放不同的东西

        点击 create a Bucket 创建一个bucket(桶), 。可以通过 upload 上传文件到bucket中。

配置权限:

        不同的版本界面不一致,大体差不多!

      然后找到access Rules添加访问规则如下:

        只读、公共读、读写

三、springboot整合minio使用

上面映射了两个端口:

后台服务器使用19000,访问使用19000

http://1.117.72.15:9090/headimg/1712730666967.txt

1、后台接口配置

pom依赖

    <!--minio文件图片服务器-->
    <dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>7.1.0</version>
    </dependency>

yml配置:

conf:
  minio:
    accesskey: 账号
    secrekey: 密码
    address: http://1.117.72.15:19000
    bucketname: headimg

读取配置文件:

@Component
@ConfigurationProperties(prefix = "conf.minio")
@Data
public class MinioProperties {
    private String accesskey;
    private String secrekey;
    private String address;
    private String bucketname;
}

接口配置

注意:

返回文件名根据需要调整,目前返回为:headimg/1712731854092.txt

可设置上传文件的contentType,让浏览器访问是是展示或者下载

@RestController
@RequestMapping("/minioUpload")
public class MinIoController {

    @Autowired
    private MinioProperties minioProperties;

    //上传文件 访问地址:http://localhost:8080/minio
    @PostMapping
    @PreAuthorize(name = "上传文件到minio服务器",sn = "minioUpload:upload")
    public AjaxResult upload(@RequestPart("file") MultipartFile file) {
        try {
            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                .credentials(minioProperties.getAccesskey(), minioProperties.getSecrekey())
                .endpoint(minioProperties.getAddress()).build();
            //处理文件名
            String oName = file.getOriginalFilename();
            String fileName = System.currentTimeMillis()+oName.substring(oName.lastIndexOf("."));

            String contentType = "";
            if (oName.endsWith("jpg")){
                contentType = "image/jpeg";
            } else if (oName.endsWith("png")){
                contentType = "image/png";
            } else if (oName.endsWith("gif")){
                contentType = "image/gif";
            } else if (oName.endsWith("txt")) {
                contentType = "text/plain";
            }  else {
                contentType = "application/octet-stream";
            }
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .object(fileName)	//文件名
                .bucket(minioProperties.getBucketname())  //存储目录名
                 .contentType(contentType)
                .stream(file.getInputStream(), file.getSize(), -1).build(); //文件流,以及大小,-1代表不分片

            //执行上传
            minioClient.putObject(putObjectArgs);
            return AjaxResult.me().setResultObj("headimg/"+fileName);
        } catch (Exception e) {
            return AjaxResult.me().setCode(StatusCode.FILE_UPLOAD_ERROR.getCode()).setMessage(StatusCode.FILE_UPLOAD_ERROR.getMessage());
        }
    }


    //删除文件
    @DeleteMapping("/delete")
    @PreAuthorize(name = "删除文件从minio服务器",sn = "minioUpload:delete")
    public AjaxResult delete(@RequestBody Map<String,String> map) {
        String originalString = map.get("file"); // headimg/1712731854092.txt
        String fileName = originalString.substring(originalString.lastIndexOf("/") + 1); // 1712731854092.txt
        try {
            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                //创建容器时指定的账号
                .credentials(minioProperties.getAccesskey(), minioProperties.getSecrekey())
                //上传地址
                .endpoint(minioProperties.getAddress()).build();
            minioClient.removeObject(minioProperties.getBucketname(), fileName);
            return new AjaxResult();
        } catch (Exception e) {
            return AjaxResult.me().setCode(StatusCode.FILE_DELETE_ERROR.getCode()).setMessage(StatusCode.FILE_DELETE_ERROR.getMessage());
        }
    }
}

2、上传测试

文件上传测试

服务器后台:

3、访问文件、访问图片

访问图片:

http://1.117.72.15:19000/headimg/1712741271054.jpg

4、删除图片

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值