MinIO跑路了!在Docker中部署Garage并迁移数据

admin
1
2026-09-22

在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_secretadmin_tokenmetrics_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启动后,需要初始化集群布局并创建访问密钥。

  1. 获取节点ID:执行 docker compose exec garage /garage status,记录下输出的 NODE_ID

  2. 分配布局:为节点分配一个区域(zone)和容量(如 100GB)。

    docker compose exec garage /garage layout assign <NODE_ID> -z dc1 -c 100GB
    
  3. 应用布局

    docker compose exec garage /garage layout apply --version 1
    
  4. 创建访问密钥:此命令会生成 Access Key IDSecret Access Key,请务必保存。

    docker compose exec garage /garage key create my-app-key
    

🛠️ 第三步:安装与配置Rclone

Rclone是迁移数据的核心工具,它能同时连接MinIO和Garage这两个S3兼容的存储端点。

  1. 安装Rclone:根据你的操作系统,从 Rclone官网 下载并安装。
  2. 配置远程端点:运行 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。

🔄 第四步:使用Rclone迁移数据

配置好远程后,就可以开始复制数据了。假设你的MinIO远程名为 minio,Garage远程名为 garage,需要迁移的桶名为 my-bucket

基础迁移命令

rclone copy minio:my-bucket garage:my-bucket --progress

重要提示

  • 增量同步:如果希望后续能同步新增或修改的文件,可以使用 rclone sync 命令,它会保持目标端与源端一致。
  • 避免使用 --checksum 标志:有实践报告指出,在最终同步阶段使用 --checksum 可能导致Rclone误判,接受了一些实际上已发生变更的文件,因此建议谨慎使用。

✅ 第五步:验证迁移结果

迁移完成后,强烈建议进行数据一致性校验。

  1. 比较文件列表:使用 rclone check 命令可以快速比对两端的文件是否存在差异。
    rclone check minio:my-bucket garage:my-bucket
    
  2. 随机抽查:手动下载几个文件,对比其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控制台的管理界面,方便你管理存储桶和密钥。

动物装饰