在Docker中部署Garage并迁移MinIO数据,核心流程是:先并行搭建好Garage,再通过rclone工具将数据同步过去,最后验证并切换应用配置。
🐳 第一步:使用Docker Compose部署Garage
Garage的部署需要先准备一个配置文件,再通过Docker Compose启动。建议新建一个目录(如 garage/)来存放所有文件。
1. 创建Garage配置文件 garage.toml
在此文件中,需要生成几个关键密钥。你可以使用 openssl rand -hex 32 命令来生成它们。
# garage.toml
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "lmdb" # 生产环境推荐使用lmdb,单机测试也可用sqlite
replication_factor = 1 # 单节点部署设置为1
consistency_mode = "consistent"
compression_level = 1 # 启用压缩,节省空间
# 使用 openssl rand -hex 32 生成以下密钥
rpc_secret = "YOUR_RPC_SECRET"
admin_token = "YOUR_ADMIN_TOKEN"
metrics_token = "YOUR_METRICS_TOKEN"
[rpc_bind_addr]
addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901" # 单机部署可设为本地
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost" # 根据你的域名调整
[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage.localhost"
[admin]
api_bind_addr = "[::]:3903"
admin_token = "YOUR_ADMIN_TOKEN"
metrics_token = "YOUR_METRICS_TOKEN"
注:rpc_secret、admin_token 和 metrics_token 都需要用 openssl rand -hex 32 生成的随机字符串替换。
2. 创建 docker-compose.yml 文件
version: '3.8'
services:
garage:
container_name: garage
image: dxflrs/garage:v2.2.0 # 建议使用v2.x稳定版本
restart: unless-stopped
ports:
- "3900:3900" # S3 API端口,供rclone等工具连接
- "3902:3902" # S3 Web端口,用于静态网站托管
- "3903:3903" # Admin API端口,供WebUI连接
# - "3901:3901" # RPC端口,仅多节点集群时需要暴露
volumes:
- ./garage.toml:/etc/garage.toml:ro
- garage-meta:/var/lib/garage/meta
- garage-data:/var/lib/garage/data
volumes:
garage-meta:
garage-data:
启动Garage服务:docker compose up -d。
⚙️ 第二步:初始化Garage集群
Garage启动后,需要初始化集群布局并创建访问密钥。
-
获取节点ID:执行
docker compose exec garage /garage status,记录下输出的NODE_ID。 -
分配布局:为节点分配一个区域(zone)和容量(如
100GB)。docker compose exec garage /garage layout assign <NODE_ID> -z dc1 -c 100GB -
应用布局:
docker compose exec garage /garage layout apply --version 1 -
创建访问密钥:此命令会生成
Access Key ID和Secret Access Key,请务必保存。docker compose exec garage /garage key create my-app-key
🛠️ 第三步:安装与配置Rclone
Rclone是迁移数据的核心工具,它能同时连接MinIO和Garage这两个S3兼容的存储端点。
- 安装Rclone:根据你的操作系统,从 Rclone官网 下载并安装。
- 配置远程端点:运行
rclone config,按照交互式向导创建两个远程(remote):- 配置MinIO远程:选择存储类型为
s3,提供商选择MinIO,并填入你的MinIO端点地址(如http://localhost:9000)、Access Key 和 Secret Key。 - 配置Garage远程:同样选择
s3存储类型,提供商选择Other,填入Garage的S3 API端点(如http://localhost:3900)、区域(garage)以及第二步中为Garage创建的Access Key 和 Secret Key。
- 配置MinIO远程:选择存储类型为
🔄 第四步:使用Rclone迁移数据
配置好远程后,就可以开始复制数据了。假设你的MinIO远程名为 minio,Garage远程名为 garage,需要迁移的桶名为 my-bucket。
基础迁移命令:
rclone copy minio:my-bucket garage:my-bucket --progress
重要提示:
- 增量同步:如果希望后续能同步新增或修改的文件,可以使用
rclone sync命令,它会保持目标端与源端一致。 - 避免使用
--checksum标志:有实践报告指出,在最终同步阶段使用--checksum可能导致Rclone误判,接受了一些实际上已发生变更的文件,因此建议谨慎使用。
✅ 第五步:验证迁移结果
迁移完成后,强烈建议进行数据一致性校验。
- 比较文件列表:使用
rclone check命令可以快速比对两端的文件是否存在差异。rclone check minio:my-bucket garage:my-bucket - 随机抽查:手动下载几个文件,对比其MD5或大小是否一致。
🔗 第六步:后续步骤与注意事项
数据迁移并验证无误后,你需要将应用程序的S3端点、Access Key和Secret Key从MinIO的配置改为Garage的对应值。
⚠️ 功能差异提醒
迁移前,请务必确认Garage是否满足你的业务需求。Garage 不支持一些MinIO的高级功能,包括:
- 对象版本控制(Versioning)
- 对象锁定(Object Lock)
- 桶策略(Bucket Policies)
- 对象标签(Object Tags)
如果你的应用依赖这些功能,迁移到Garage可能不是合适的选择。
💡 补充工具
如果你更习惯图形界面,可以为Garage部署一个第三方Web UI(如 khairul169/garage-webui),它能连接Garage的Admin API(端口3903),提供一个类似MinIO控制台的管理界面,方便你管理存储桶和密钥。