在 Docker 使用 JuiceFS

目前有三种在 Docker 上使用 JuiceFS 存储的方法:

1. 卷映射

这种方法是将 JuiceFS 挂载点中的目录映射给 Docker 容器。比如, JuiceFS 文件系统挂载在 /mnt/jfs 目录,在创建容器时可以这样将 JuiceFS 存储映射到 Docker 容器:

  1. $ sudo docker run -d --name nginx \
  2. -v /mnt/jfs/html:/usr/share/nginx/html \
  3. -p 8080:80 \
  4. nginx

但需要注意,默认情况下,只有挂载 JuiceFS 存储的用户有存储的读写权限,当你需要将 JuiceFS 存储映射给 Docker 容器使用时,如果你没有使用 root 身份挂载 JuiceFS 存储,则需要先开启 FUSE 的 user_allow_other 选项,然后再添加 -o allow_other 选项重新挂载 JuiceFS 文件系统。

注意:使用 root 用户身份或使用 sudo 挂载的 JuiceFS 存储,会自动添加 allow_other 选项,无需手动设置。

FUSE 设置

默认情况下,allow_other 选项只允许 root 用户使用,为了让普通用户也有权限使用该挂载选项,需要修改 FUSE 的配置文件。

修改配置文件

编辑 FUSE 的配置文件,通常是 /etc/fuse.conf

  1. $ sudo nano /etc/fuse.conf

将配置文件中的 user_allow_other 前面的 # 注释符删掉,修改后类似下面这样:

  1. # /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
  2. # Set the maximum number of FUSE mounts allowed to non-root users.
  3. # The default is 1000.
  4. #mount_max = 1000
  5. # Allow non-root users to specify the allow_other or allow_root mount options.
  6. user_allow_other

重新挂载 JuiceFS

FUSE 的 user_allow_other 启用后,你需要重新挂载 JuiceFS 文件系统,使用 -o 选项设置 allow_other,例如:

  1. $ juicefs mount -d -o allow_other redis://<your-redis-url>:6379/1 /mnt/jfs

2. Docker Volume Plugin

JuiceFS 也支持使用 volume plugin 方式访问。

  1. $ docker plugin install juicedata/juicefs
  2. Plugin "juicedata/juicefs" is requesting the following privileges:
  3. - network: [host]
  4. - device: [/dev/fuse]
  5. - capabilities: [CAP_SYS_ADMIN]
  6. Do you grant the above permissions? [y/N]
  7. $ docker volume create -d juicedata/juicefs:latest -o name={{VOLUME_NAME}} -o metaurl={{META_URL}} -o access-key={{ACCESS_KEY}} -o secret-key={{SECRET_KEY}} jfsvolume
  8. $ docker run -it -v jfsvolume:/opt busybox ls /opt

将上面 {{VOLUME_NAME}}{{META_URL}}{{ACCESS_KEY}}{{SECRET_KEY}} 替换成你自己的文件系统配置。想要了解更多 JuiceFS 卷插件内容,可以访问 juicedata/docker-volume-juicefs 代码仓库。

3. 在 Docker 容器中挂载 JuiceFS

这种方法是将 JuiceFS 文件系统直接在 Docker 容器中进行挂载和使用,相比第一种方式,在容器中直接挂载 JuiceFS 可以缩小文件被误操作的几率。谁使用谁挂载,也让容器管理更清晰直观。

由于在容器中进行文件系统挂载需要将 JuiceFS 客户端拷贝到容器,在常规的容器管理过程中,需要把下载或拷贝 JuiceFS 客户端以及挂载文件系统的过程写入 Dockerfile,然后重新构建镜像。例如,你可以参考以下 Dockerfile,将 JuiceFS 客户端打包到 Alpine 镜像。

  1. FROM alpine:latest
  2. LABEL maintainer="Juicedata <https://juicefs.com>"
  3. # Install JuiceFS client
  4. RUN apk add --no-cache curl && \
  5. JFS_LATEST_TAG=$(curl -s https://api.github.com/repos/juicedata/juicefs/releases/latest | grep 'tag_name' | cut -d '"' -f 4 | tr -d 'v') && \
  6. wget "https://github.com/juicedata/juicefs/releases/download/v${JFS_LATEST_TAG}/juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
  7. tar -zxf "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
  8. install juicefs /usr/bin && \
  9. rm juicefs "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
  10. rm -rf /var/cache/apk/* && \
  11. apk del curl
  12. ENTRYPOINT ["/usr/bin/juicefs", "mount"]

另外,由于在容器中使用 FUSE 需要相应的权限,在创建容器时,需要指定 --privileged=true 选项,比如:

  1. $ sudo docker run -d --name nginx \
  2. -v /mnt/jfs/html:/usr/share/nginx/html \
  3. -p 8080:80 \
  4. --privileged=true \
  5. nginx-with-jfs