OSS对象存储Docker部署完整教程

本文对比MinIO、RustFS等四款开源对象存储,重点演示RustFS的Docker Compose部署及完整S3兼容配置流程。涵盖创建Bucket、配置IAM权限策略、生成Service Account密钥及设置公开访问策略,并提供Python SDK测试代码,适用于中小型业务私有OSS搭建。

作者:zhuge··预计阅读 18 分钟·3 阅读·0 评论
OSS对象存储Docker部署完整教程

前言

业务开发、内网文件/图片存储经常需要自建对象存储OSS,主流开源方案各有优劣。本文对比四款常用轻量S3兼容OSS,提供MinIO、RustFS标准Docker Compose配置,并以RustFS完整演示:创建桶、业务用户、服务密钥、权限策略、图片公开访问全流程。

一、四款开源轻量OSS横向对比

项目开发语言Web可视化IAM(用户/密钥)S3兼容性内存占用开源协议核心优缺点适用场景
MinIO(社区单机新版)Go❌ 单机无Web用户管理,只能命令行mc操作100%完整S3中等AGPLv3生态最强、功能齐全;单机Web砍掉用户面板,操作繁琐;商用分发有协议约束能接受命令行、成熟生产集群、海量存储
MinIO(旧版 2025.04)Go✅ 完整可视化用户/策略面板100%完整S3中等AGPLv3操作直观,后台直接管理账号;版本老旧缺少安全更新开发测试、不想敲命令临时使用
RustFSRust✅ 完整Web IAM,单机保留全部用户管理功能100%兼容S3 SDK极低(无GC卡顿)Apache2.0后台可视化管理账号,低配机器流畅,商用无协议限制;新兴项目,大规模集群案例少于MinIO中小型业务、图片附件存储、内网私有OSS、讨厌命令行操作
SeaweedFSGo⚠️ 用户权限配置复杂,Web面板简陋完整S3网关Apache2.0海量小文件性能极强;权限体系复杂,上手门槛高日志、千万级图片素材存储

选型总结

  1. 追求可视化后台管理用户、不想敲命令、中小型业务:首选 RustFS
  2. 必须大规模分布式集群、追求多年成熟生态:选 MinIO
  3. 海量小文件、日志存储:选 SeaweedFS

二、Docker Compose 部署配置文件(默认端口、默认账号密码)

2.1 MinIO 旧版(带Web用户管理面板)docker-compose.yml

默认端口:9000(S3接口)、9001(后台) 默认管理员账号:admin / Minio@123456

services:
  minio:
    image: minio/minio:RELEASE.2025-04-22T15-44-28Z
    container_name: minio
    restart: unless-stopped
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      TZ: Asia/Shanghai
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: Minio@123456
    volumes:
      - ./minio-data:/data
      - /etc/localtime:/etc/localtime:ro
    command: server /data --console-address ":9001"
    deploy:
      resources:
        limits:
          memory: 1G

启动命令

docker compose down
sudo chmod 777 ./minio-data
docker compose up -d

2.2 RustFS 稳定版 docker-compose.yml(无多余日志报错、默认端口)

默认端口:9000(S3接口)、9001(后台) 默认管理员账号:admin / Rust@123456

services:
  rustfs:
    image: rustfs/rustfs:latest
    container_name: rustfs
    restart: unless-stopped
    user: root
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      TZ: Asia/Shanghai
      RUSTFS_ACCESS_KEY: admin
      RUSTFS_SECRET_KEY: Rust@123456
      RUSTFS_CONSOLE_ENABLE: "true"
      RUSTFS_CONSOLE_ADDRESS: ":9001"
      RUSTFS_EC_DISABLE: "true"
      RUSTFS_TLS_VERIFY_DISABLE: "true"
    volumes:
      - ./rustfs-data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    deploy:
      resources:
        limits:
          memory: 1G

启动命令

docker compose down
sudo chmod 777 ./rustfs-data
docker compose up -d
# 查看实时日志
docker compose logs -f rustfs

三、RustFS 完整实操教程(默认端口、默认管理员账号)

基础访问信息

  1. Web管理后台地址:http://服务器IP:9001
  2. S3程序调用接口地址:http://服务器IP:9000
  3. 管理员账号:admin | 密码:Rust@123456

步骤1:登录管理后台

浏览器打开 http://服务器IP:9001,输入管理员账号密码登录。

步骤2:创建图片专用存储桶(Bucket)

桶等价于oss根目录,S3桶名强制规范:仅小写字母、数字、短横线 -,禁止中文、大写、下划线

  1. 左侧菜单点击 Buckets
  2. 右上角 Create Bucket
  3. Bucket Name 输入:img-store
  4. 其余参数保持默认,点击 Create

步骤3:创建权限策略(限制用户仅能操作img-store桶)

最小权限原则,业务用户只允许读写图片桶,无法访问其他存储资源

  1. 左侧菜单 IdentityPolicies
  2. 右上角 Create Policy
  3. Policy Name:only-img-store
  4. Policy 策略文本完整复制:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::img-store",
        "arn:aws:s3:::img-store/*"
      ]
    }
  ]
}
  1. 点击保存策略。

步骤4:创建业务普通用户(可登录后台,可作为AK/SK调用接口)

用于后台人工查看文件,同时可直接作为SDK鉴权凭证

  1. 左侧 IdentityUsers
  2. 右上角 Create User
  3. 填写表单:
    • Access Key:img-user
    • Secret Key:Img@123654
    • Status:Enabled
    • Groups:留空
    • Policies:勾选刚刚创建的 only-img-store
  4. 底部点击 Save

该用户凭证:AK=img-user,SK=Img@123654,仅能操作img-store桶

步骤5:创建Service Account服务密钥(线上业务推荐API Key)

服务密钥无法登录后台,仅用于后端程序上传下载;密钥泄露可单独删除,不影响用户账号,生产环境优先使用。

  1. IdentityUsers,点击用户 img-user 进入详情页
  2. 找到 Service Accounts 模块,点击 Create Service Account
  3. 名称填写 backend-img-api,无需额外配置策略(继承用户权限)
  4. 点击创建,立刻复制保存 Access Key / Secret Key

关闭弹窗后Secret Key永久无法查看,务必备份

步骤6:配置桶公开只读(图片浏览器直接访问,无需签名)

默认上传文件需要签名URL才能访问,图片业务通常开启匿名只读:

  1. 左侧 Buckets,点击 img-store 桶进入详情
  2. 找到 Bucket Policy 选项
  3. 填入公开只读策略:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::img-store/*"
    }
  ]
}
  1. 保存策略。

步骤7:文件访问地址格式

上传文件 avatar/001.jpg 后,直接浏览器访问地址:

http://服务器IP:9000/img-store/avatar/001.jpg

四、基础测试示例(Python SDK验证上传)

安装依赖

pip install minio

测试代码

from minio import Minio

# S3接口地址 9000端口,不要填后台9001
client = Minio(
    "你的服务器IP:9000",
    access_key="img-user",
    secret_key="Img@123654",
    secure=False
)

# 上传本地图片到oss
client.fput_object(
    bucket_name="img-store",
    object_name="avatar/test.jpg",
    file_path="./test.jpg"
)
print("图片上传成功")

五、常见踩坑说明

  1. 端口区分:9000=程序S3接口,9001=网页管理后台,调用接口不要混用端口
  2. 桶名报错 InvalidBucketName:桶名只能小写、数字、短横线
  3. 权限不足:创建用户必须绑定自定义单桶策略,不要使用admin全局权限
  4. 图片无法直接打开:未配置Bucket Policy公开只读策略
  5. 目录权限报错:启动前执行 sudo chmod 777 ./rustfs-data 授权数据卷

相关文章

评论

加载中...