用 Docker Compose 部署 RustFS:高性能 S3 兼容对象存储实战
在云原生和 AI 训练场景里,对象存储几乎是基础设施的"水电煤"——从镜像分发、模型权重到训练数据集,都离不开一个兼容 S3 协议、又能扛住高吞吐的存储服务。MinIO 一直是这个领域的明星,但如果你想要一个用 Rust 重写、内存占用更低、启动更快、原生支持多盘纠删码的替代品,RustFS 是一个值得重点关注的新选择。
本文基于一份可直接落地的 docker-compose.yml,完整演示 RustFS 单节点 4 盘部署:从快速启动、访问验证,到存储持久化、配置项解读、S3 客户端对接,再到生产环境加固,一次讲清楚。
一、RustFS 是什么?
RustFS 是一款用 Rust 实现的高性能 S3 兼容对象存储服务,核心特点:
- S3 协议兼容:AWS CLI、MinIO Client(
mc)、S3 SDK 均可直接对接,迁移成本几乎为零 - Rust 实现:无 GC 停顿,内存占用低,单节点资源开销远小于同类 Java/Go 实现
- 多盘纠删码:原生支持多数据盘布局,单节点即可享受数据冗余保护
- 内置 Web Console:开箱即用的可视化管理界面,无需额外部署
定位上,它适合作为私有云对象存储、CI/CD 制品库、AI 训练数据池,或是MinIO 的轻量替代。
二、架构与端口规划
┌─────────────────────────┐
│ Application / Client │
│ (S3 SDK / Console) │
└────┬────────────┬────────┘
│ 9000 │ 9001
▼ ▼
┌─────────────────────────┐
│ RustFS Server │
│ (Single Node, 4 drives)│
└──┬──┬──┬──┬──┬──────────┘
│ │ │ │ │
v0 v1 v2 v3 logs
(4 data drives, 1 log volume)
| 服务 | 端口 | 用途 |
|---|---|---|
| S3 API | 9000 | 对象存储 API |
| Web Console | 9001 | 可视化管理界面 |
单节点采用 4 数据盘 + 1 日志卷布局,命名卷分别挂载到容器内 /data/rustfs{0...3},由 RustFS 自动组建纠删码存储池。
三、Docker Compose 编排
完整的 docker-compose.yml 如下。它包含两个服务:RustFS 主服务,以及一个一次性的 volume-permission-helper,用来把命名卷的属主修正为 RustFS 容器内的 UID 10001,避免首启权限报错。
1# RustFS Deployment - Docker Compose
2# Ports:
3# 9000 - S3 API
4# 9001 - Web Console
5# Docs: https://docs.rustfs.com/
6#
7# Prerequisites:
8# mkdir -p data logs
9# chown -R 10001:10001 data logs
10# docker compose up -d
11
12services:
13 # ── RustFS Server ────────────────────────────────────────────────────
14 rustfs:
15 image: rustfs/rustfs:latest
16 container_name: rustfs-server
17 security_opt:
18 - "no-new-privileges:true"
19 ports:
20 - "9000:9000" # S3 API
21 - "9001:9001" # Console UI
22 environment:
23 # Storage volumes (4-drive layout typical for RustFS)
24 - RUSTFS_VOLUMES=/data/rustfs{0...3}
25
26 # Listen addresses
27 - RUSTFS_ADDRESS=0.0.0.0:9000
28 - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
29 - RUSTFS_CONSOLE_ENABLE=true
30 - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
31
32 # Credentials — CHANGE THESE IN PRODUCTION
33 - RUSTFS_ACCESS_KEY=rustfsadmin
34 - RUSTFS_SECRET_KEY=rustfsadmin
35
36 # Logging
37 - RUSTFS_OBS_LOGGER_LEVEL=info
38
39 # Bypass strict disk topology check for single-node
40 - RUSTFS_UNSAFE_BYPASS_DISK_CHECK=true
41
42 volumes:
43 - rustfs_data_0:/data/rustfs0
44 - rustfs_data_1:/data/rustfs1
45 - rustfs_data_2:/data/rustfs2
46 - rustfs_data_3:/data/rustfs3
47 - rustfs_logs:/app/logs
48 networks:
49 - rustfs-network
50 restart: unless-stopped
51 healthcheck:
52 test:
53 [
54 "CMD", "sh", "-ec",
55 'curl -fsS http://127.0.0.1:9000/health && curl -fsS http://127.0.0.1:9001/rustfs/console/health'
56 ]
57 interval: 30s
58 timeout: 10s
59 retries: 3
60 start_period: 40s
61
62 # ── Volume Permission Helper ──────────────────────────────────────────
63 # Ensures named volumes have correct ownership for the rustfs user (UID 10001)
64 volume-permission-helper:
65 image: alpine:latest
66 volumes:
67 - rustfs_data_0:/data0
68 - rustfs_data_1:/data1
69 - rustfs_data_2:/data2
70 - rustfs_data_3:/data3
71 - rustfs_logs:/logs
72 command:
73 - sh
74 - -c
75 - |
76 chown -R 10001:10001 /data0 /data1 /data2 /data3 /logs
77 echo 'Volume permissions fixed'
78 exit 0
79 restart: "no"
80
81networks:
82 rustfs-network:
83 driver: bridge
84
85volumes:
86 rustfs_data_0:
87 rustfs_data_1:
88 rustfs_data_2:
89 rustfs_data_3:
90 rustfs_logs:
几个关键设计点
RUSTFS_VOLUMES=/data/rustfs{0...3}:用展开语法一次性声明 4 个数据盘,RustFS 据此自动组建纠删码存储池RUSTFS_UNSAFE_BYPASS_DISK_CHECK=true:单节点部署时绕过严格的磁盘拓扑检查(生产集群应关闭并使用真实多盘)security_opt: no-new-privileges:阻止容器内进程通过 setuid 提权,最小权限原则- 双健康检查端点:同时校验 S3 API(9000)和 Console(9001),任一异常即判定不健康
volume-permission-helper:一次性init容器,先于主服务把命名卷属主改为10001:10001,根治"首次启动 permission denied"
四、快速启动与验证
1cd deploy
2
3# 1. 启动服务
4docker compose up -d
5
6# 2. 查看日志
7docker compose logs -f rustfs
8
9# 3. 检查健康状态
10curl http://localhost:9000/health
11curl http://localhost:9001/rustfs/console/health
两个健康检查端点均返回 2xx 即代表服务就绪。浏览器访问 http://localhost:9001 即可进入 Web Console。
默认访问凭证
| 服务 | 地址 |
|---|---|
| S3 API | http://localhost:9000 |
| Web Console | http://localhost:9001 |
| Access Key | rustfsadmin |
| Secret Key | rustfsadmin |
⚠️ 生产环境:首次登录 Console 后立即修改默认密码。下文「生产加固」一节会给出强制要求。
五、存储持久化
数据存放在 Docker 命名卷(rustfs_data_{0..3}、rustfs_logs)中,docker compose down 不会丢失数据;只有 docker compose down -v 才会连卷一起删除。
如需绑定宿主机目录(便于备份或挂独立磁盘,需手动处理权限):
1mkdir -p /data/rustfs/{0,1,2,3} /data/rustfs/logs
2chown -R 10001:10001 /data/rustfs
然后在 docker-compose.yml 中将 volumes 替换为 bind mounts:
1volumes:
2 - /data/rustfs/0:/data/rustfs0
3 - /data/rustfs/1:/data/rustfs1
4 - /data/rustfs/2:/data/rustfs2
5 - /data/rustfs/3:/data/rustfs3
6 - /data/rustfs/logs:/app/logs
命名卷 vs bind mount 的取舍:命名卷由 Docker 管理、迁移方便、跨平台一致;bind mount 直连宿主机磁盘、性能略优、便于宿主机层面备份。生产环境推荐 bind mount 到独立物理盘。
六、常用运维操作
1# 启动
2docker compose up -d
3
4# 停止
5docker compose down
6
7# 重启
8docker compose restart rustfs
9
10# 查看日志
11docker compose logs -f --tail=100 rustfs
12
13# 更新到最新版本
14docker compose pull
15docker compose up -d
16
17# 清除数据(危险!)
18docker compose down -v
七、环境变量速查
| 变量 | 默认值 | 说明 |
|---|---|---|
RUSTFS_ACCESS_KEY |
rustfsadmin |
S3 访问密钥 |
RUSTFS_SECRET_KEY |
rustfsadmin |
S3 访问密钥(生产必改) |
RUSTFS_OBS_LOGGER_LEVEL |
info |
日志级别 |
RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS |
* |
Console CORS 来源 |
完整列表见 RustFS Docs - Configuration。
八、S3 客户端对接
RustFS 完全兼容 S3 协议,AWS CLI 和 MinIO Client 都能直接用。
AWS CLI
1# 配置凭证
2aws configure set default.region us-east-1
3aws configure set aws_access_key_id rustfsadmin
4aws configure set aws_secret_access_key rustfsadmin
5
6# 操作(--endpoint-url 指向 RustFS)
7aws --endpoint-url http://localhost:9000 s3 mb s3://my-bucket
8aws --endpoint-url http://localhost:9000 s3 cp test.txt s3://my-bucket/
9aws --endpoint-url http://localhost:9000 s3 ls s3://my-bucket/
MinIO Client (mc)
1mc alias set rustfs http://localhost:9000 rustfsadmin rustfsadmin
2mc mb rustfs/my-bucket
3mc cp test.txt rustfs/my-bucket/
因为协议兼容,你现有的 S3 SDK 代码、Terraform
aws_s3_bucket资源、Helm chart 里的对象存储配置——只需把 endpoint 指向 RustFS,无需改一行业务代码。这是 RustFS 最大的迁移红利。
九、生产环境加固清单
上面的配置面向快速体验,上生产前至少完成以下改动:
- 改默认凭证:
RUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEY改为强随机值,禁止使用rustfsadmin - 关闭磁盘检查豁免:删除
RUSTFS_UNSAFE_BYPASS_DISK_CHECK,改用真实多盘拓扑 - 收紧 CORS:
RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS改为具体域名,禁止* - 启用 TLS:在反代层(Nginx/Caddy)终结 HTTPS,或挂载证书让 RustFS 直接监听
https - 独立磁盘:4 个数据卷分别挂到不同物理盘,才能真正发挥纠删码的容错价值
- 监控告警:把
9000/health接入 Prometheus 黑盒探测,异常及时告警 - 定期备份:对元数据和关键 bucket 配置异地备份策略
十、小结
RustFS 用 Rust 重写了 S3 兼容对象存储这一"老命题",带来了更低的资源占用和更稳的延迟表现。借助 Docker Compose,一份 docker-compose.yml 就能跑起一个 4 盘纠删码的单节点实例;又因为它完全兼容 S3 协议,迁移成本几乎为零。
对于个人 homelab、小团队制品库、AI 训练数据池这类场景,RustFS 是一个非常值得上手的 MinIO 替代方案。等到规模上来,再按「生产加固清单」逐步演进到多节点集群即可。
