介绍
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