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;
@Component
public class FileService {
@Value("${minio.endpoint}")
private String endpoint;
@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;
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");
}
public FileInfoResp uploadFile(String bucketName, MultipartFile file) throws Exception {
String contentType = file.getContentType();
return uploadFile(bucketName,file,contentType);
}
public Iterable<Result<DeleteError>> deleteFileSingle(String bucketName, String objectName) throws Exception {
return deleteFile(bucketName,objectName,null);
}
public Iterable<Result<DeleteError>> deleteFileBath(String bucketName, Iterable<String> objectNames) throws Exception {
return deleteFile(bucketName,null,objectNames);
}
public void deleteBucket(String bucketName) throws Exception {
MinioClient minioClient = new MinioClient(endpoint,accessKey,secretKey);
if (!minioClient.bucketExists(bucketName)) {
throw new BucketNotExistException("桶不存在");
}
minioClient.removeBucket(bucketName);
}
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;
}
}
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部署成功。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341