ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Docker 中使用 JuiceFS:卷插件与容器内客户端两种部署方案全指南

在 Docker 中使用 JuiceFS:卷插件与容器内客户端两种部署方案全指南 在 Docker 中使用 JuiceFS卷插件与容器内客户端两种部署方案全指南【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefsJuiceFS 是一个构建在 Redis 等元数据引擎与 S3 等对象存储之上的分布式 POSIX 文件系统。本文基于 docs/zh_cn/deployment/juicefs_on_docker.md系统讲解在 Docker 中使用 JuiceFS 的两种主流方式一是通过 Docker 卷插件volume plugin将 JuiceFS 作为 Docker Volume 挂载给应用容器二是直接在容器内运行 JuiceFS 客户端以挂载、S3 Gateway 或 WebDAV 等方式开放文件系统访问。读完本文你将掌握两种方案的安装、创建卷、容器编排配置与问题排查的完整实战方法。两种使用方式概览在 Docker 环境中使用 JuiceFS官方提供两种思路各有适用场景方式管理主体适用场景灵活性卷插件volume pluginDocker 管理挂载点希望通过 Docker 统一管理不同应用容器使用不同 JuiceFS 文件系统较低只提供挂载能力容器内运行客户端用户自行编排容器需要挂载文件系统或通过 S3 Gateway、WebDAV 开放访问高可组合多种服务形态两种方式都建立在同一个核心前提上先准备好对象存储与元数据引擎。对象存储承载数据块元数据引擎如 Redis承载文件系统的目录、文件等元信息可参考 docs/zh_cn/reference/how_to_set_up_object_storage.md 与 docs/zh_cn/reference/how_to_set_up_metadata_engine.md。方式一使用 JuiceFS 卷插件如果对挂载管理有一定要求——比如希望由 Docker 来管理挂载点方便不同的应用容器使用不同的 JuiceFS 文件系统——可以选用 docker-volume-juicefs 卷插件。Docker 插件通常以镜像形式提供。JuiceFS 卷插件镜像内置了 JuiceFS 社区版与 JuiceFS 云服务客户端安装完成后即可运行卷插件在 Docker 中创建 JuiceFS Volume。安装与插件管理安装插件时按提示为 FUSE 提供必要的权限docker plugin install juicedata/juicefs日常管理卷插件的命令# 停用插件 docker plugin disable juicedata/juicefs # 升级插件需先停用 docker plugin upgrade juicedata/juicefs docker plugin enable juicedata/juicefs # 卸载插件 docker plugin rm juicedata/juicefs插件升级后建议重新创建或重新挂载卷确保新版本客户端生效。创建存储卷创建卷时将命令中的VOLUME_NAME、META_URL、STORAGE_TYPE、BUCKET_NAME、ACCESS_KEY、SECRET_KEY替换为实际的文件系统配置docker volume create -d juicedata/juicefs \ -o nameVOLUME_NAME \ -o metaurlMETA_URL \ -o storageSTORAGE_TYPE \ -o bucketBUCKET_NAME \ -o access-keyACCESS_KEY \ -o secret-keySECRET_KEY \ jfsvolume其中各-o选项与 JuiceFS 客户端format命令的对应参数一致name对应文件系统名称metaurl对应元数据引擎 URLstorage对应对象存储类型如 s3、gs、oss、cos见 cmd/format.go 中--storage的取值说明bucket对应对象存储桶地址access-key/secret-key对应访问密钥。对于已经预先创建好的文件系统无需再传存储参数只需指定文件系统名称和元数据引擎地址即可docker volume create -d juicedata/juicefs \ -o nameVOLUME_NAME \ -o metaurlMETA_URL \ jfsvolume如果挂载文件系统时需要传入额外的环境变量例如 Google Cloud 存储 等需要额外配置的场景可以追加类似-o envFOObar,SPAMegg的参数多个键值对以逗号分隔。使用与管理# 创建容器时挂载卷 docker run -it -v jfsvolume:/opt busybox ls /opt # 卸载后可以删除存储卷 # 注意这仅仅是删除 Docker 中的对应资源并不影响 JuiceFS 中存储的数据 docker volume rm jfsvolume由于 JuiceFS 的数据持久化在对象存储与元数据引擎中docker volume rm只移除 Docker 侧的卷资源文件系统的真实数据不受影响删除后随时可以重新创建同名卷恢复访问。在 Docker Compose 中使用卷插件下面是在docker compose中使用 JuiceFS 卷插件的完整示例version: 3 services: busybox: image: busybox command: ls /jfs volumes: - jfsvolume:/jfs volumes: jfsvolume: driver: juicedata/juicefs driver_opts: name: ${VOL_NAME} # 因为 SQLite 在插件容器本地路径创建数据库文件 # sqlite:// 将在服务重启时失败。 # 详见 docker-volume-juicefs 仓库 issue #37 metaurl: ${META_URL} storage: ${STORAGE_TYPE} bucket: ${BUCKET} access-key: ${ACCESS_KEY} secret-key: ${SECRET_KEY} # 如有需要可以用 env 传入额外环境变量 # env: FOObar,SPAMegg注意注释中的关键提醒SQLite 元数据引擎不适合卷插件场景因为 SQLite 数据库文件创建在插件容器本地路径服务重启后会丢失导致sqlite://挂载失败。生产环境应使用 Redis 等服务化元数据引擎。使用与管理# 启动服务 docker-compose up # 关闭服务并从 Docker 中卸载 JuiceFS 文件系统 docker-compose down --volumesdown --volumes会一并移除 compose 文件中声明的卷从而触发插件卸载 JuiceFS 文件系统。卷插件问题排查无法正常工作时推荐先升级卷插件再根据问题情况查看日志。排查主要分两个层面1. 收集 JuiceFS 客户端日志客户端日志位于 Docker volume plugin 容器内需要进入容器采集# 确认 docker plugins runtime 目录根据实际情况可能与下方示范不同 # ls 打印出来的目录就是容器目录名称为容器 ID ls /run/docker/plugins/runtime-root/plugins.moby # 打印 plugin 容器信息 # 如果打印出的容器列表为空说明 plugin 容器创建失败 # 阅读下方查看 plugin 启动日志继续排查 runc --root /run/docker/plugins/runtime-root/plugins.moby list # 进入容器打印日志 runc --root /run/docker/plugins/runtime-root/plugins.moby exec 452d2c0cf3fd45e73a93a2f2b00d03ed28dd2bc0c58669cca9d4039e8866f99f cat /var/log/juicefs.log如果发现容器不存在ls发现目录为空或者打印日志阶段发现juicefs.log不存在那么多半是挂载本身就失败了应继续查看 plugin 自身的日志寻找原因。2. 收集 plugin 日志以 systemd 为例journalctl -f -u docker | grep plugin如果 plugin 调用juicefs发生错误或者 plugin 自身报错都会在日志中体现。方式二在容器中使用 JuiceFS 客户端相比卷插件直接在容器中使用 JuiceFS 客户端更加灵活可以在容器中直接挂载 JuiceFS 文件系统也可以通过 S3 Gateway、WebDAV 开放文件系统访问。客户端本身是一个独立二进制程序同时提供 AMD64 和 ARM64 架构版本。方式一自行构建镜像JuiceFS 客户端是一个独立二进制程序同时提供 AMD64 和 ARM64 架构的版本可以在 Dockerfile 中定义下载安装命令FROM ubuntu:22.04 ... # 使用官方一键安装脚本 RUN curl -sSL https://d.juicefs.com/install | sh -仓库内 SDK 与构建链同样面向多架构例如 hack/builder/Dockerfile 中安装了aarch64-linux-musl-cross交叉编译工具链用于产出 ARM64 的静态二进制这印证了官方客户端对多架构的原生支持。自行构建镜像时可参考该方式保证目标架构正确。方式二使用官方维护的镜像JuiceFS 官方维护镜像juicedata/mount通过 tag 指定所需版本。社区版 tag 为ce例如latest、ce-v1.1.2、ce-nightlylatest仅包含最新社区版nightly指向最新开发版本具体以 Docker Hub tags 页面为准。下面示例均以ce-v1.1.2为 tag请替换为实际可用的版本。开始之前先准备好对象存储与元数据引擎。创建文件系统通过一个临时容器执行juicefs format创建文件系统docker run --rm \ juicedata/mount:ce-v1.1.2 juicefs format \ --storage s3 \ --bucket https://xxx.your-s3-endpoint.com \ --access-keyACCESSKEY \ --secret-keySECRETKEY \ rediss://user:passwordxxx.your-redis-server.com:6379/1 myjfs请将--storage、--bucket、--access-key、--secret-key以及元数据引擎 URL 替换为实际配置。--rm保证容器任务结束后自动清理。从 cmd/format.go 的源码看format命令同时支持--block-size、--compress、--capacity、--inodes、--trash-days等数据格式与管理类参数创建文件系统时可按需追加--storage默认值为file即不指定对象存储时数据落在本地目录容器场景下务必显式指定。直接在容器中挂载文件系统docker run --privileged --name myjfs \ juicedata/mount:ce-v1.1.2 juicefs mount \ rediss://user:passwordxxx.your-redis-server.com:6379/1 /mnt元数据引擎 URL 替换为实际配置/mnt是挂载点可按需修改。由于底层使用 FUSE挂载容器需要--privileged权限才能访问/dev/fuse。通过 Docker Compose 挂载文件系统下面是一个生产可用的 Compose 编排示例version: 3 services: busybox: image: busybox command: ls /jfs volumes: - ./mnt:/jfs depends_on: juicefs: condition: service_healthy juicefs: image: juicedata/mount:ce-v1.1.2 container_name: myjfs volumes: - ./mnt:/mnt:rw,rshared cap_add: - SYS_ADMIN devices: - /dev/fuse security_opt: - apparmor:unconfined command: [juicefs, mount, rediss://user:passwordxxx.your-redis-server.com:6379/1, /mnt] restart: unless-stopped healthcheck: test: [CMD-SHELL, cat /mnt/.control] interval: 60s retries: 5 start_period: 30s timeout: 10s这个示例的编排要点权限最小化相比--privileged这里用cap_add: SYS_ADMIN加上devices: /dev/fuse与security_opt: apparmor:unconfined组合只赋予挂载 FUSE 所需的权限目录共享JuiceFS 文件系统在容器内挂载到/mnt通过 volumes 部分将容器/mnt映射到宿主机./mnt目录rw,rshared保证绑定传播宿主机即可直接访问容器中挂载的 JuiceFS 文件系统再结合depends_on与 volumes可以将该目录二次挂载进其余容器使用健康检查healthcheck通过cat /mnt/.control探测挂载是否就绪。从源码看pkg/vfs/internal.go 定义了.control这一 VFS 内部文件controlInode挂载成功后该文件即可读取因此 busybox 服务通过depends_on ... condition: service_healthy严格等待文件系统就绪后再启动。通过 S3 Gateway 开放文件系统访问JuiceFS 内置了基于 MinIO S3 Gateway 实现的 S3 兼容网关见 cmd/gateway.go 中gateway命令的定义可以将 JuiceFS 文件系统以 S3 API 的方式开放给其他应用。Compose 示例version: 3 services: s3-gateway: image: juicedata/mount:ce-v1.1.2 container_name: juicefs-s3-gateway environment: - MINIO_ROOT_USERyour-username - MINIO_ROOT_PASSWORDyour-password ports: - 9090:9090 command: [juicefs, gateway, rediss://user:passwordxxx.your-redis-server.com:6379/1, 0.0.0.0:9090] restart: unless-stopped替换MINIO_ROOT_USER、MINIO_ROOT_PASSWORD、元数据引擎 URL 与监听地址端口。启动后使用宿主机9090端口即可打开 S3 Gateway 控制台S3 客户端或 SDK 可用相同地址读写 JuiceFS 文件系统。源码细节根据 cmd/gateway.go 的实现juicefs gateway会强制校验MINIO_ROOT_USER环境变量至少 3 个字符与MINIO_ROOT_PASSWORD至少 8 个字符否则直接报错退出——因此这两个环境变量是必填项不能用任意弱口令。此外该命令还支持--multi-buckets将顶层目录作为多 bucket、--bucket-name、--keep-etag、--read-only等选项可进一步阅读 docs/zh_cn/guide/gateway.md 了解 S3 Gateway 的完整能力仓库中也提供了 deploy/juicefs-s3-gateway.yaml 这样的 Kubernetes 部署样例与 Docker Compose 方案互为补充。补充通过 WebDAV 开放文件系统访问除 S3 Gateway 外客户端还内置 WebDAV 服务。从 cmd/webdav.go 的命令定义看它通过WEBDAV_USER/WEBDAV_PASSWORD环境变量做认证并支持--gzip、--enable-proppatch、--cert-file/--key-fileHTTPS等参数。以容器方式运行同样可行docker run -d --name jfs-webdav \ -e WEBDAV_USERroot -e WEBDAV_PASSWORD1234 \ -p 9007:9007 \ juicedata/mount:ce-v1.1.2 juicefs webdav \ rediss://user:passwordxxx.your-redis-server.com:6379/1 0.0.0.0:9007这样便可通过标准 WebDAV 协议访问 JuiceFS 文件系统适合需要与通用 WebDAV 客户端对接的场景。两种方案的选型建议与总结卷插件方案适合“以 Docker 为中心”的使用习惯挂载点的创建、删除、生命周期全部交给 Docker 管理应用容器无需感知 JuiceFS 细节代价是能力被限制在“挂载”这一种形态且需注意 SQLite 元数据引擎不适用、插件容器日志排查路径较深等问题。容器内客户端方案更灵活既能juicefs mount直挂 FUSE也能以juicefs gatewayS3 协议、juicefs webdavWebDAV 协议等服务形态对外提供访问配合 Compose 的depends_on、healthcheck、卷共享机制可以构建出“挂载 消费 对外服务”的完整容器化数据链路。两种方式都要求容器具备 FUSE 能力--privileged或SYS_ADMIN/dev/fuse 关闭 AppArmor 限制并且都要先准备好对象存储与元数据引擎。无论选择哪种方式JuiceFS 的数据始终持久化在对象存储与元数据引擎中容器或卷本身都是无状态载体——这保证了容器销毁、重建、迁移后文件系统数据依然完整可用。【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表