在 Linux 和 Docker 中部署 MinIO 对象存储

目录

  • [一、适用于 Linux 的 MinIO 对象存储](#一、适用于 Linux 的 MinIO 对象存储)

    • 1.Minio服务安装
    • 2.Minio环境配置
      • [2.1 创建minio启动文件](#2.1 创建minio启动文件)
      • [2.2 创建minio服务文件](#2.2 创建minio服务文件)
      • [3.3 启动minio服务](#3.3 启动minio服务)
    • 3.创建存储桶
      • [3.1 进入web端创建存储桶](#3.1 进入web端创建存储桶)
      • [3.2 Minio Client(mc)创建存储桶](#3.2 Minio Client(mc)创建存储桶)
    • [4. s3fs-fuse 文件挂载](#4. s3fs-fuse 文件挂载)
      • [4.1 s3fs-fuse配置](#4.1 s3fs-fuse配置)
      • [4.2 执行s3fs挂载](#4.2 执行s3fs挂载)
      • [4.3 开机自动挂载](#4.3 开机自动挂载)
  • [二、适用于 Docker 的 MinIO 对象存储](#二、适用于 Docker 的 MinIO 对象存储)

    • 1.Minio环境配置
      • [1.1 拉取Minio基础镜像](#1.1 拉取Minio基础镜像)
      • [1.2 创建文件目录](#1.2 创建文件目录)
      • [1.3 启动Minio服务](#1.3 启动Minio服务)
      • [1.4 访问Minio](#1.4 访问Minio)
    • 2.创建Minio存储桶并挂载
      • [2.1 创建Dockerfile文本文件](#2.1 创建Dockerfile文本文件)
      • [2.2 基于Dockerfile构建镜像](#2.2 基于Dockerfile构建镜像)
      • [2.3 启动MC容器创建存储桶](#2.3 启动MC容器创建存储桶)
    • 3.启动S3FS容器进行挂载
  • Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

  • Minio是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

一、适用于 Linux 的 MinIO 对象存储

1.Minio服务安装

  • 使用 RPM、DEB 或二进制文件将 MinIO 安装到 64 位 Linux 操作系统上(amd64(Intel或AMD64位处理器))
shell 复制代码
# 二进制文件下载安装
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
# sudo mv minio /usr/local/bin/
# DEB(Debian/Ubuntu)下载安装
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240510014138.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
#  MinIO RPM 下载和安装
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20240510014138.0.0-1.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm

2.Minio环境配置

2.1 创建minio启动文件

shell 复制代码
# 递归创建目录的选项,如果目录的上级目录不存在也会一并创建
mkdir -p /usr/local/minio 
# 将minio和mc可执行文件放入创建的minio文件夹下
cp minio mc /usr/local/minio/
# 添加可执行权限
chmod +x minio mc 
# 创建存储文件
mkdir -p /data/miniodata/data{1..4}
mkdir -p /usr/local/minio/log/
touch /usr/local/minio/log/minio_server.log
  • 在当前文件夹下创建 run.sh 文件,chmod +x run.sh
shell 复制代码
#!/bin/bash
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin
#export MINIO_STORAGE_CLASS_STANDARD=EC:3
#export MINIO_STORAGE_CLASS_RRS=EC:2
/usr/local/minio/minio server --console-address ":9090" --address ":9000" 
http://IP/data/miniodata/data{1..4}  >  /usr/local/minio/log/minio_server.log
  • export MINIO_ROOT_USER=admin,export MINIO_ROOT_PASSWORD=admin 设置账号密码,登录minio web端使用
  • export MINIO_STORAGE_CLASS_STANDARD=EC:3,export MINIO_STORAGE_CLASS_RRS=EC:2 纠删码策略,4块磁盘的可以不设置
  • --console-address ":9090" 设置minio的web端访问端口为9090,web端地址: http://IP:9090 , IP和端口根据具体情况自由设置
  • --address ":9000" 设置minio的api端口,即http访问图片端口,图片访问地址:http://IP:9000/图片名
  • http://IP/data/miniodata/data{1...4} 数据存储目录 /data/miniodata/data{1...4}
  • /usr/local/minio/log/minio_server.log 日志存储路径

2.2 创建minio服务文件

shell 复制代码
# 创建systemctl start minio的启动方式
vim /usr/lib/systemd/system/minio.service  
  • minio.service 文件内容如下,Restart=always 表示跟随系统开机启动 minio,让systemd总是重新启动此服务
shell 复制代码
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/usr/local/minio/
ExecStart=/usr/local/minio/run.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

3.3 启动minio服务

复制代码
# 重新加载systemd服务文件
systemctl daemon-reload 
# 启动minio服务
systemctl start minio 
# 设置 minio 为开机启动
systemctl enable minio 
# 查看一下minio是否为running状态,为running状态表示服务启动成功
systemctl status minio

3.创建存储桶

3.1 进入web端创建存储桶

  • http://IP:9090 进入web端,通过设置的账号密码登录,然后创建桶 Buckets -- Create Buckets (如:ai-pic) 创建完后,进入桶设置 Summary - Access Policy 为 public。

3.2 Minio Client(mc)创建存储桶

shell 复制代码
# 安装 MinIO 客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
# 添加一个 MinIO 服务器的配置,pipeline-minio 是配置的名称,可以自定义。http://127.0.0.1:9000 是 MinIO 服务器的地址,admin 是 MinIO 服务器的访问密钥(access key),admin 是 MinIO 服务器的秘密密钥(secret key)
mc config host add pipeline-minio http://127.0.0.1:9000 admin admin
# 删除Minio服务器配置
 mc config host remove pipeline-minio
# 查看本地的云存储服务器
mc config host list
# mb 是创建 bucket 子命令,minio-server/ai-pic 是在 minio-server 下创建一个叫做 ai-pic 的 bucket
mc mb pipeline-minio/ai-pic
# 查看bucket
mc ls pipeline-minio
# 删除bucket
mc rb pipeline-minio/ai-pic  #删除没有文件的bucket
mc rb pipeline-minio/ai-pic --force # 删除有文件的bucket
# 使用public关键字将MinIO存储桶设置为公共的
mc anonymous set public pipeline-minio/ai-pic
#  查看存储桶的状态信息,包括存储桶的创建时间、大小、对象数量等
mc stat pipeline-minio/ai-pic

4. s3fs-fuse 文件挂载

4.1 s3fs-fuse配置

shell 复制代码
# 通过该命令判断是否有s3fs文件系统,如果没有则进行以下步骤
df -h | grep s3fs 
# s3fs-fuse在线安装
sudo yum install epel-release
sudo yum install s3fs-fuse
# s3fs-fuse rpm安装
rpm -Uvh s3fs-fuse-1.92-1.el7.x86_64.rpm --nodeps --force
# 创建认证文件
echo "admin:admin" > /root/.passwd-s3fs
# 更改认证文件权限
chmod 600 /root/.passwd-s3fs 
# 创建挂载目录,这个挂载目录不要选minio客户端的目录(即不要选 /data/miniodata/data{1..4}),选一个有存储空间的目录就行,比如 /data/ai-pic 
mkdir -p /data/ai-pic

4.2 执行s3fs挂载

shell 复制代码
# 执行s3fs挂载命令
s3fs -o passwd_file=/root/.passwd-s3fs -o use_path_request_style -o allow_other -o url=http://IP:9000  -o bucket=ai-pic /data/ai-pic
# 执行s3fs挂载命令,当挂载路径下已经有这个同名路径时,需要添加 -o nonempty 参数即可,即:
s3fs -o passwd_file=/root/.passwd-s3fs -o use_path_request_style -o allow_other -o url=http://IP:9000  -o bucket=ai-pic /data/ai-pic -o nonempty 
# 取消挂载命令
umount /data/ai-pic
# 卸载 FUSE(文件系统通用层)挂载点,-u 选项表示卸载挂载点,-z 选项表示卸载挂载点并强制卸载,/data/s3fs 是要卸载的挂载点的路径
fusermount -uz /data/s3fs
  • 将数据存入s3fs挂载路径下,即 /data/ai-pic/ 路径下,数据会同步到minio客户端的bucket内,同时可以通过url访问数据,如:http://IP:9000/ai-pic/abc.jpg
  • 如果启docker服务,docker数据挂载路径应为 /data/ai-pic/ ,例如:-v /data/ai-pic:/ai-pic。

4.3 开机自动挂载

shell 复制代码
# 将挂载命令行加入/etc/rc.local实现开机自启动挂载
systemctl restart minio
s3fs -o passwd_file=/root/.passwd-s3fs -o use_path_request_style -o allow_other -o url=http://IP:9000  -o bucket=ai-pic /data/ai-pic -o nonempty 
# 注意检查/etc/rc.local必须要有可执行权限,chmod +x /etc/rc.d/rc.local

二、适用于 Docker 的 MinIO 对象存储

1.Minio环境配置

1.1 拉取Minio基础镜像

shell 复制代码
# 从 Docker Hub 上拉取 Minio 的最新镜像,MinIO是一个对象存储解决方案
docker pull minio/minio
# 从Docker Hub下载Minio客户端镜像,即MinIO Client(mc)镜像,mc工具是一个命令行客户端,用于与Minio服务器进行交互
docker pull minio/mc
# 从Docker Hub下载名为efrecon/s3fs:1.94,使用S3FS文件系统访问S3存储
docker pull efrecon/s3fs:1.94

1.2 创建文件目录

shell 复制代码
# 创建一个名为文件目录,并为其设置权限
# 用来存储上传文件的目录
mkdir -p -m 777 /data/minio/data
# 创建Minio外部挂载的配置文件,来存放配置
mkdir -p -m 777 /data/minio/config

1.3 启动Minio服务

shell 复制代码
# 启动Minio容器,使用环境变量创建
docker run -d --restart always --name pipeline-minio -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWORD=admin -e MINIO_CONSOLE_PORT=60000 -e MINIO_API_PORT=9999 -v /data/minio:/data minio/minio server /data --console-address ":${MINIO_CONSOLE_PORT}" --address ":${MINIO_API_PORT}"
# Docker中部署Mino并挂载配置文件,使用端口映射
docker run -d --restart always -p 9090:9090 -p 9000:9000 --name pipeline-minio -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin" -v /data/minio/data:/data -v /data/minio/config:/root/.minio minio/minio:latest server /data --console-address ":9090" --address ":9000"
# # Docker中部署Mino并挂载配置文件,使用宿主机网络
docker run -d --restart always --net=host --name pipeline-minio -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin" -v /data/minio/data:/data minio/minio:latest server /data --console-address ":9001" --address ":9000"
  • -e MINIO_ROOT_USER=admin:设置Minio服务器的root用户名。
  • -e MINIO_ROOT_PASSWORD=admin:设置Minio服务器的root密码。
  • -e MINIO_CONSOLE_PORT=60000:设置Minio控制台端口。
  • -e MINIO_API_PORT=9999:设置Minio API端口。
  • -v /data/minio:/data:将本地目录/data/minio挂载到Minio服务器的/data目录。
  • server /data:运行Minio服务器,指定数据目录为/data,表示启动 Mino 服务器并将数据存储在容器内的 /data 目录。
  • --console-address ":${MINIO_CONSOLE_PORT}":设置Minio控制台地址为:${MINIO_CONSOLE_PORT}
  • --address ":${MINIO_API_PORT}":设置Minio API地址为:${MINIO_API_PORT}
  • --console-address ":9090":设置Minio控制台地址为:9090
  • --address ":9000":设置Minio API地址为:9000

1.4 访问Minio

  • 通过在首选的浏览器中输入MinIO服务器 Console控制台 中的任何主机名或IP地址来访问MinIO控制台,例如http://localhost:9001
shell 复制代码
curl http://localhost:9090
# 访问:http://10.0.28.83:9090/login 用户名:密码 admin:admin创建Minio存储桶

2.创建Minio存储桶并挂载

  • 通过访问Minio客户端(http://10.0.28.83:9090/login )创建存储桶(bucket)
  • 从Docker Hub下载Minio客户端镜像,即MinIO Client(mc)镜像,通过mc命令创建存储桶

2.1 创建Dockerfile文本文件

shell 复制代码
# MC.Dockerfile
FROM minio/mc
COPY ./docker/create_bucket.sh /create_bucket.sh
RUN chmod +x /create_bucket.sh
ENTRYPOINT ["/create_bucket.sh"]  # 当容器启动时,它会执行这个脚本
  • create_bucket.sh 创建存储桶执行脚本内容,mc指令
shell 复制代码
if mc stat pipeline-minio &> /dev/null; then
  echo "Minio pipeline-minio  already exists."
else
  mc config host add pipeline-minio ${MINIO_URL} ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}
  echo "Minio pipeline-minio ${MINIO_URL} added."
fi
if mc stat pipeline-minio/${MINIO_BUCKET} &> /dev/null; then
    echo "Bucket ${MINIO_BUCKET} already exists."
else
    mc mb pipeline-minio/${MINIO_BUCKET}
fi
mc anonymous set public pipeline-minio/${MINIO_BUCKET}

2.2 基于Dockerfile构建镜像

shell 复制代码
# 构建的镜像大小为77.3MB
docker build -t local.harbor.com/pipeline-python-mc:v1.0 -f ./docker/MC.Dockerfile .

2.3 启动MC容器创建存储桶

shell 复制代码
docker run -d --restart no --name pipeline-mc -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWORD=admin -e MINIO_BUCKET=ai-pic -e MINIO_URL=http://127.0.0.1:9000 local.harbor.com/pipeline-python-mc:v1.0

3.启动S3FS容器进行挂载

shell 复制代码
# 在容器中使用S3FS文件系统访问S3存储
docker run -d --restart always --name pipeline-s3fs --privileged=true -v /data/s3fs:/opt/s3fs/bucket:rshared -e AWS_S3_ACCESS_KEY_ID=admin -e AWS_S3_SECRET_ACCESS_KEY=admin -e AWS_S3_BUCKET=ai-pic -e AWS_S3_URL=http://127.0.0.1:9000 -e S3FS_ARGS=use_path_request_style,allow_other -e S3FS_DEBUG=1 efrecon/s3fs:1.94
# docker部署minio的s3fs服务
docker run -d --restart=always --net=host --privileged --name s3fs \
    --device /dev/fuse \
    --cap-add SYS_ADMIN \
    --security-opt "apparmor=unconfined" \
    --env "AWS_S3_BUCKET={bucketName}" \
    --env "AWS_S3_ACCESS_KEY_ID=admin" \
    --env "AWS_S3_SECRET_ACCESS_KEY=admin" \
    --env "AWS_S3_URL=http://localhost:9000" \
    --env UID=$(id -u) \
    --env GID=$(id -g) \
    --env S3FS_DEBUG=1 \
    --env "S3FS_ARGS=use_path_request_style,allow_other,no_check_certificate,umask=000,nonempty" \
    -v {mountPath}:/opt/s3fs/bucket:rshared \
    efrecon/s3fs:1.91
  • --privileged true:给容器授予宿主机的特权
  • -v /data/s3fs:/opt/s3fs/bucket:rshared:将宿主机的/data/s3fs目录挂载到容器的/opt/s3fs/bucket目录,并设置为读写共享
  • -e AWS_S3_ACCESS_KEY_ID=admin:设置AWS S3的访问密钥ID为admin
  • -e AWS_S3_SECRET_ACCESS_KEY=admin:设置AWS S3的密钥访问权限为admin
  • -e AWS_S3_BUCKET=ai-pic:设置AWS S3的桶名称为ai-pic
  • -e AWS_S3_URL=http://127.0.0.1:9999:设置AWS S3的URL为http://127.0.0.1:9999
  • -e S3FS_ARGS=use_path_request_style,allow_other:设置S3FS的参数为use_path_request_style,allow_other