使用 Docker 安装 RustFS

RustFS Docker 部署。

RustFS 是高性能、兼容 S3 的开源分布式对象存储系统。在单节点单磁盘(SNSD)部署模式下,后端使用零纠删码,不提供额外数据冗余,适合本地测试和小规模场景。 本文基于 RustFS 官方 Linux 二进制软件包,通过自定义 Dockerfile 将 RustFS 及其运行环境打包到容器中,并配置数据卷和环境变量以一键启动服务。


前提条件

  1. 主机要求
  • 已安装 Docker(≥ 20.10),并能正常拉取镜像和运行容器
  • 本地路径 /mnt/rustfs/data(或自定义路径),用于挂载对象数据
  • 管理主机上已安装 rc,用于验证流程
  1. 网络和防火墙
  • 确保主机端口 9000(S3 API)和 9001(控制台)可供外部访问,或与自定义端口一致
  1. 目录权限
  • RustFS 容器以 ID 为 10001 的非 root 用户 rustfs 运行。如果使用 docker 的 -v 将主机目录挂载到容器,请确保主机目录的所有者为 10001,否则会遇到权限拒绝错误。运行 chown -R 10001:10001 /path/to/host_directory 授予必要权限。

拉取 RustFS 官方镜像

从 Docker Hub 拉取基于 Alpine 的官方镜像:

docker pull rustfs/rustfs

运行 RustFS 容器

使用上述镜像和配置,按以下方式运行 RustFS SNSD Docker:

 docker run -d \
  --name rustfs_local \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /mnt/rustfs/data:/data \
  rustfs/rustfs:latest \
  /data

参数说明:

  • -p 9000:9000:将主机端口 9000 映射到容器
  • -v /mnt/rustfs/data:/data:挂载数据卷
  • --name rustfs_local:自定义容器名称
  • -d:在后台运行

完整配置示例

配置可以通过环境变量(推荐)或命令行参数传入,请选择一种方式;两者同时存在时,命令行参数优先。卷路径(/data)始终放在最后。

# Use a unique access key and a strong, random secret (e.g. openssl rand -base64 24)
docker run -d \
  --name rustfs \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /mnt/rustfs/data:/data \
  -e RUSTFS_ACCESS_KEY="<your-access-key>" \
  -e RUSTFS_SECRET_KEY="<your-secret-key>" \
  -e RUSTFS_ADDRESS=:9000 \
  -e RUSTFS_CONSOLE_ENABLE=true \
  rustfs/rustfs:latest \
  /data

常用配置组合

  1. 基本配置

    docker run -d \
      -p 9000:9000 \
      -p 9001:9001 \
      -v /mnt/data:/data \
      rustfs/rustfs:latest \
      /data
  2. 启用控制台

    docker run -d \
      -p 9000:9000 \
      -p 9001:9001 \
      -v /mnt/data:/data \
      -e RUSTFS_CONSOLE_ENABLE=true \
      rustfs/rustfs:latest \
      --console-enable \
      /data
  3. 自定义身份验证密钥

    # Use a unique access key and a strong, random secret (e.g. openssl rand -base64 24)
    docker run -d \
      -p 9000:9000 \
      -p 9001:9001 \
      -v /mnt/data:/data \
      -e RUSTFS_ACCESS_KEY="<your-access-key>" \
      -e RUSTFS_SECRET_KEY="<your-secret-key>" \
      rustfs/rustfs:latest \
      --access-key "<your-access-key>" \
      --secret-key "<your-secret-key>" \
      /data

重要说明

  1. 端口映射必须对应:

    • 服务端口默认为 9000(-p 9000:9000
  2. 数据卷必须持久化:

    • -v /host/path:/container/path
  3. 环境变量和命令行参数可以混用,但命令行参数优先级更高

  4. 如果使用 TLS,需要额外挂载证书路径:

    -v /path/to/certs:/certs \
    -e RUSTFS_TLS_PATH=/certs \

使用 Docker Compose 安装

RustFS 官方提供 Docker Compose 安装方式。docker-compose.yml 文件包含 grafanaprometheusotel-collectorjaeger 等多个服务,主要用于可观测性。如果要一起部署这些服务,请将 RustFS 代码仓库克隆到本地:

git clone https://github.com/rustfs/rustfs.git

在根目录下运行命令:

docker compose --profile observability up -d

提供必要的权限。需要使用初始化容器,通过 depends_on 关键字为 rustfs 授予正确的访问权限。以下示例将 rustfs_perms 服务添加到 docker-compose.yml 来处理权限。为了确保日志持久化且可访问,将主机日志目录映射到容器的 /logs 路径:

docker-compose.yml
  services:
    # grant the necessary permissions to RUSTFS volumes path
    rustfs_perms:
      image: alpine
      user: root
      volumes:
        - /path/to/host_directory/volumes:/fix_path
      command: chown -R 10001:10001 /fix_path
    
    rustfs:
      image: rustfs/rustfs:latest
      depends_on: 
        rustfs_perms:
          condition: service_completed_successfully
      volumes:
        - /path/to_host_directory/volumes/data:/data
        - /path/to_host_directory/volumes/logs:/logs
      environment:
        - RUSTFS_OBS_LOG_DIRECTORY=/logs
    
      # ... other configurations

启动后的容器如下:

CONTAINER ID   IMAGE                                             COMMAND                  CREATED         STATUS                            PORTS                                                                                                                                     NAMES
c13c23fe3d9d   rustfs/rustfs:latest                              "/entrypoint.sh rust…"   6 seconds ago   Up 5 seconds (health: starting)   0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp                                                                             rustfs-server
e3f4fc4a83a2   grafana/grafana:latest                            "/run.sh"                7 seconds ago   Up 5 seconds                      0.0.0.0:3000->3000/tcp, :::3000->3000/tcp                                                                                                 grafana
71ef1b8212cf   prom/prometheus:latest                            "/bin/prometheus --c…"   7 seconds ago   Up 5 seconds                      0.0.0.0:9090->9090/tcp, :::9090->9090/tcp                                                                                                 prometheus
e7db806b2d6f   jaegertracing/all-in-one:latest                   "/go/bin/all-in-one-…"   7 seconds ago   Up 5 seconds                      4317-4318/tcp, 9411/tcp, 0.0.0.0:14250->14250/tcp, :::14250->14250/tcp, 14268/tcp, 0.0.0.0:16686->16686/tcp, :::16686->16686/tcp          jaeger
1897830a2f1e   otel/opentelemetry-collector-contrib:latest       "/otelcol-contrib --…"   7 seconds ago   Up 5 seconds                      0.0.0.0:4317-4318->4317-4318/tcp, :::4317-4318->4317-4318/tcp, 0.0.0.0:8888-8889->8888-8889/tcp, :::8888-8889->8888-8889/tcp, 55679/tcp   otel-collector

如果只想安装 RustFS,而不安装 Grafana、Prometheus 和其他可观测性服务,请仅启动 rustfs 服务(compose 文件将 collector 依赖项标记为可选):

docker compose -f docker-compose.yml up -d rustfs

这样只会安装并启动 rustfs-server 服务,即 rustfs 容器:

docker ps
CONTAINER ID   IMAGE                                             COMMAND                  CREATED         STATUS                           PORTS                                                           NAMES
e07121ecdd39   rustfs/rustfs:latest                              "/entrypoint.sh rust…"   2 seconds ago   Up 1 second (health: starting)   0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp   rustfs-server

无论只启动 rustfs-server 还是同时启动可观测性服务,S3 API 都位于 http://localhost:9000,RustFS 控制台位于 http://localhost:9001。请在浏览器中打开控制台,使用上面配置的访问密钥和秘密密钥(<your-access-key> / <your-secret-key> 占位符)登录。例如使用 openssl rand -base64 24 生成强密钥,绝不要将占位符值用于生产环境。

立即设置容器凭证

在将 RustFS 接入网络前,请设置唯一的 RUSTFS_ACCESS_KEYRUSTFS_SECRET_KEY 环境变量。任一凭证都不要使用众所周知的 rustfsadmin 值。对于 docker run,使用 -e 传入这两个值。对于 Docker Compose,请在 rustfs 服务环境或用于变量替换的环境文件中定义这两个变量,然后使用 docker compose up -d rustfs 重新创建服务。

验证和访问

  1. 查看容器状态和日志:
docker logs rustfs_local

日志应显示服务成功启动并监听端口 9000。

  1. 测试 S3 API:

使用 rc 验证 S3 API:

# Use a unique access key and a strong, random secret (e.g. openssl rand -base64 24)
rc alias set rustfs http://localhost:9000 <your-access-key> <your-secret-key>
rc bucket create rustfs/my-bucket
rc bucket list rustfs/

如果可以成功创建并列出存储桶,则部署有效。

多节点

Docker 默认的桥接网络不支持多节点部署。使用 --network host,让每个容器可以直接与其他节点通信。

每个节点上运行以下命令:

# Use a unique access key and a strong, random secret (e.g. openssl rand -base64 24)
docker run -d \
  --name rustfs \
  --network host \
  -v /mnt/rustfs/data:/data \
  -e RUSTFS_ACCESS_KEY="<your-access-key>" \
  -e RUSTFS_SECRET_KEY="<your-secret-key>" \
  -e RUSTFS_CONSOLE_ENABLE=true \
  -e RUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs{0...3}" \
  rustfs/rustfs:latest

每个节点的 /etc/hosts 中添加条目:

/etc/hosts
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3
192.168.1.4 node4

其他建议

  1. 生产环境建议:
  1. 存储建议:
  • 使用本地 SSD/NVMe 存储
  • 避免使用网络文件系统(NFS)
  • 确保存储目录独占访问

总结

本文介绍使用 Docker 部署 RustFS 的最佳实践,从单节点单磁盘(SNSD)设置开始,再扩展到多节点部署选项。

本页目录