MinIO存儲(chǔ)在docker中安裝及其使用方式
MinIO存儲(chǔ)在docker安裝及使用
MinIO
MinIO 是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù)。它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以是任意大小,從幾kb到最大5T不等。
MinIO是一個(gè)非常輕量的服務(wù),可以很簡單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL
docker 安裝Minio
安裝docker鏡像
# docker安裝鏡像 docker pull minio/minio
容器運(yùn)行方式① 和 容器運(yùn)行方式② 選擇一種就好。
運(yùn)行容器方式①
# 后臺(tái)運(yùn)行容器 docker run -p 9000:9000 --name storage -di -v /storage/data:/data -v /storage/config:/root/.minio --restart=always minio/minio server /data 1,進(jìn)入容器 docker exec -it storage sh 2,查看配置文件中的key值 cat /data/.minio.sys/config/config.json |grep Key “accessKey”: “507LX5P57F99DNEVF1GH”, “secretKey”: “Kc2tllnd9FQrgTzu0RSohir4B4svh2cLiueGZR5x”, “routingKey”: “”,
運(yùn)行容器方式②
# 后臺(tái)運(yùn)行容器方式 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 端口映射 將外部端口 映射到 容器內(nèi)部端口 # --name 自定義容器名稱 # -di 后臺(tái)運(yùn)行的方式運(yùn)行 # --restart=always 一旦docker重啟或者開啟時(shí),也自動(dòng)啟動(dòng)鏡像 # -e 設(shè)置系統(tǒng)變量 在這里是設(shè)置Minio的ACCESS_KEY和SECRET_KEY # -v 掛載文件 將系統(tǒng)文件 映射到 容器內(nèi)部對(duì)應(yīng)的文件夾
這是安裝成功的日志:

更多信息:請(qǐng)?jiān)L問官網(wǎng) 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.傲勢(shì)科技有限公司
* Endpoint 對(duì)象存儲(chǔ)服務(wù)的URL
* Access key就像用戶ID,可以唯一標(biāo)識(shí)你的賬戶。
* Secret key是你賬戶的密碼。
*/
@Component
public class FileService {
/**
* 對(duì)象存儲(chǔ)服務(wù)的URL, 注意 這里的endpoint填寫 url會(huì)報(bào)錯(cuò),這里endpoint的值應(yīng)該為 【 http://ip:端口號(hào) 】 的形式
*/
@Value("${minio.endpoint}")
private String endpoint;
/**
* 就像用戶ID,可以唯一標(biāo)識(shí)你的賬戶
*/
@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("文件類型錯(cuò)誤,請(qǐng)上傳圖片文件。");
}
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);
}
/**
* 刪除單個(gè)文件
* @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);
// 檢查桶是否存在,若不存在則創(chuàng)建一個(gè)
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存儲(chǔ)服務(wù)
環(huán)境準(zhǔn)備
拉取minio的docker鏡像:docker pull minio/minio
創(chuàng)建掛載目錄:
[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 # 賬號(hào)
MINIO_ROOT_PASSWORD: gbase;123 #密碼
command指令中添加--console-address參數(shù),否則瀏覽器訪問控制臺(tái)自動(dòng)跳轉(zhuǎn)端口導(dǎo)致無法訪問,查看日志可看到如下信息:
[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
啟動(dòng)容器并訪問
啟動(dòng)容器,查看容器狀態(tài):
[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
瀏覽器訪問控制臺(tái):

輸入docker-compose.yaml文件中自定義的賬號(hào)密碼:

至此,minio部署成功。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker一行命令完成FTP服務(wù)搭建的實(shí)現(xiàn)
這篇文章主要介紹了Docker一行命令完成FTP服務(wù)搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Docker文件映射實(shí)現(xiàn)主機(jī)與容器間目錄的雙向映射
本地文件系統(tǒng)和容器中的文件系統(tǒng)之間的交互是一項(xiàng)必不可少的功能,本文主要介紹了Docker文件映射實(shí)現(xiàn)主機(jī)與容器間目錄的雙向映射,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
使用?Docker安裝?Zabbix并配置自定義監(jiān)控項(xiàng)的過程詳解
Zabbix?可以用來監(jiān)控各種網(wǎng)絡(luò)參數(shù),來保證服務(wù)器和系統(tǒng)的安全運(yùn)行,是一個(gè)基于?Web?界面提供的分布式系統(tǒng)監(jiān)控以及網(wǎng)絡(luò)監(jiān)控功能的企業(yè)級(jí)開源解決方案,對(duì)Docker?安裝?Zabbix配置自定義監(jiān)控項(xiàng)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-04-04
基于Docker的MongoDB實(shí)現(xiàn)授權(quán)訪問的方法
這篇文章主要介紹了基于Docker的MongoDB實(shí)現(xiàn)授權(quán)訪問的方法,需要的朋友可以參考下2017-03-03
Docker搭建prometheus(普羅米修斯)的方法步驟
phometheus:當(dāng)前一套非常流行的開源監(jiān)控和報(bào)警系統(tǒng),本文主要介紹了Docker搭建prometheus(普羅米修斯)的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
docker run啟動(dòng)的容器掛掉了數(shù)據(jù)怎么辦
這篇文章主要介紹了docker run啟動(dòng)的容器掛掉了,數(shù)據(jù)怎么辦,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
docker安裝elastic?search和kibana的實(shí)現(xiàn)
本文主要介紹了docker安裝elastic?search和kibana的實(shí)現(xiàn),,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

