在 Docker 使用 JuiceFS
目前有三种在 Docker 上使用 JuiceFS 存储的方法:
1. 卷映射
这种方法是将 JuiceFS 挂载点中的目录映射给 Docker 容器。比如, JuiceFS 文件系统挂载在 /mnt/jfs
目录,在创建容器时可以这样将 JuiceFS 存储映射到 Docker 容器:
$ sudo docker run -d --name nginx \
-v /mnt/jfs/html:/usr/share/nginx/html \
-p 8080:80 \
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
:
$ sudo nano /etc/fuse.conf
将配置文件中的 user_allow_other
前面的 #
注释符删掉,修改后类似下面这样:
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000
# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other
重新挂载 JuiceFS
FUSE 的 user_allow_other
启用后,你需要重新挂载 JuiceFS 文件系统,使用 -o
选项设置 allow_other
,例如:
$ juicefs mount -d -o allow_other redis://<your-redis-url>:6379/1 /mnt/jfs
2. Docker Volume Plugin
JuiceFS 也支持使用 volume plugin 方式访问。
$ docker plugin install juicedata/juicefs
Plugin "juicedata/juicefs" is requesting the following privileges:
- network: [host]
- device: [/dev/fuse]
- capabilities: [CAP_SYS_ADMIN]
Do you grant the above permissions? [y/N]
$ 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
$ 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 镜像。
FROM alpine:latest
LABEL maintainer="Juicedata <https://juicefs.com>"
# Install JuiceFS client
RUN apk add --no-cache curl && \
JFS_LATEST_TAG=$(curl -s https://api.github.com/repos/juicedata/juicefs/releases/latest | grep 'tag_name' | cut -d '"' -f 4 | tr -d 'v') && \
wget "https://github.com/juicedata/juicefs/releases/download/v${JFS_LATEST_TAG}/juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
tar -zxf "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
install juicefs /usr/bin && \
rm juicefs "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" && \
rm -rf /var/cache/apk/* && \
apk del curl
ENTRYPOINT ["/usr/bin/juicefs", "mount"]
另外,由于在容器中使用 FUSE 需要相应的权限,在创建容器时,需要指定 --privileged=true
选项,比如:
$ sudo docker run -d --name nginx \
-v /mnt/jfs/html:/usr/share/nginx/html \
-p 8080:80 \
--privileged=true \
nginx-with-jfs