一、简介
- 英文官网:https://min.io/
- 中文官网:https://www.minio.org.cn
- MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
- MinIO 是一款开源的对象存储服务器,它是使用 Go 语言开发的,可以在多个操作系统上运行,包括 Linux、Windows 和 macOS。
- MinIO是一个对象存储:对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据
- 元数据主要包括对象的描述信息(如用户、存储桶以及存储桶索引等)
- 对象存储系统通常通过基于HTTP或HTTPS协议的API进行数据读写。
1.许可
- MniIO具有双重许可
- 开源GNU APGPL v3:完全免费
- 商业企业许可证:收费
- 兼容亚马逊S3云存储服务接口
二、部署
1.Docker部署
1.1 部署容器
docker pull minio/minio
mkdir -p /data/minio/data
mkdir -p /data/minio/config
docker run -p 9000:9000 -p 9090:9090 \
--net=host \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-v /data/minio/data:/data \
-v /data/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9090" -address ":9000"
- 参数解释
- -p 9000:9000 -p 9090:9090:将本地机器上的端口 9000 和 9090绑定到容器上相同的端口。 这允许通过本地机器访问容器。
- -v /data/minio/data:/data:将本地机器上的存储卷 /data/minio/data 绑定到容器上的 /data 路径。 将此值替换为本地机器上一个存储卷或文件夹的完整路径。
- -v /data/minio/config:/root/.minio:将上一步创建的环变变量配置文件挂载到容器上
- -e “MINIO_CONFIG_ENV_FILE=/etc/config.env”:设置一个MinIO环境变量,指向容器挂载的环变变量配置文件的路径。
- minio server --console-address “:9001”:使用之前步骤中拉取的 minio:minio 镜像启动MinIO服务器。 minio server --console-address “:9001” 选项指示服务器为MinIO控制台Web界面设置一个静态端口
- -e “MINIO_ACCESS_KEY=minioadmin”:账号
- -e “MINIO_SECRET_KEY=minioadmin”:密码(账号长度必须大于等于5,密码长度必须大于等于8位)
1.2 MinIO页面访问
- http://部署服务器ip:9090
- 使用账号密码:minioadmin/minioadmin登录
1.3 创建Bucket
三、Python-API
1.安装包
pip install minio
2.Bucket、Object概念
- Bucket是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
- Object是存储到Minlo的基本对象,对用户而言,相当于文件;
3.Bucket-API
from minio.error import S3Error
from minio import Minio
client = Minio(endpoint="192.168.86.128:9000",
access_key="minioadmin",
secret_key="minioadmin",
secure=False
)
bucket_exists = client.bucket_exists("myfolder")
print(bucket_exists)
try:
client.make_bucket("myfolder1")
except S3Error:
print("该名称目录已被创建")
print([(bucket.name, bucket.creation_date) for bucket in client.list_buckets()])
try:
client.remove_bucket("xxxxx")
except S3Error:
print("该Bucket不存在")
4.MinIOClient-API
import os
from minio import Minio, S3Error
from minio.commonconfig import CopySource
from minio.deleteobjects import DeleteObject
client = Minio(endpoint="192.168.86.128:9000",
access_key="minioadmin",
secret_key="minioadmin",
secure=False
)
bucket_name = "myfolder"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
"""
单个对象的最大大小限制在5TB。put_object在对象大于5MiB时,自动使用multiple parts方式上传。
这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。
上传的对象使用MD5SUM签名进行完整性验证。
"""
with open('./test.txt', 'rb') as file:
file_stat = os.stat('./test.txt')
print(client.put_object(bucket_name, 'test.txt', file, file_stat.st_size))
print(client.fput_object(bucket_name, '12.docx', './12.docx'))
print(client.fput_object(bucket_name, 'folder_name/12.docx', './12.docx'))
try:
object = client.stat_object(bucket_name, "12.docx")
print(f"文件名称:{object.object_name}")
print(f"文件大小:{object.size}")
except S3Error:
print("文件不存在")
data = client.get_object(bucket_name, '12.docx')
with open('./download/12.docx', 'wb') as file:
for d in data.stream(32 * 1024):
file.write(d)
client.fget_object(bucket_name, '12.docx', './download/123.docx')
copy_result = client.copy_object("myfolder1", "12333.docx",
CopySource(bucket_name, "12.docx")
)
client.remove_object(bucket_name, "12.docx")
client.remove_objects(bucket_name, [DeleteObject("12.docx"),
DeleteObject("123.docx"),
DeleteObject("124.docx")])
5.Presigned-API
from datetime import timedelta
from minio import Minio
client = Minio(endpoint="192.168.86.128:9000",
access_key="minioadmin",
secret_key="minioadmin",
secure=False
)
bucket_name = "myfolder"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name, )
print(client.fput_object(bucket_name, 'asdasd/12.docx', './12.docx'))
url = client.presigned_get_object(bucket_name, 'test.txt', expires=timedelta(days=2))
print(url)
url = client.presigned_put_object(bucket_name, 'test.txt', expires=timedelta(days=2))
print(url)
四、其他配置
1.将某个Bucket所有文件开放访问
- 如果是private,那么需要使用 预签名URL才可以进行访问