在Docker容器中挂载GlusterFS

當作一個小笑話和個人筆記。

背景 – (Background)

为了在Docker容器中持久化数据,通常会使用卷(Volume)。
卷是将主机的目录挂载到容器内部的一种方式,但这也导致容器与主机之间的关联性较高。具体来说,当将容器移动到其他主机时,数据将无法持久化,并且还需要进行主机端的维护工作以一同移动数据。
此外,当尝试在多个主机之间分散和集群容器时,也会面临卷集中化所必需的问题。
我认为应该使用网络卷,但由于以挂载到主机上的形式,会导致主机端的维护工作,因此不是理想的选择。
因此,我考虑是否可以在Docker容器内安装网络卷。

为什么选择 GlusterFS 而不是 NFS,请问是因为 NFS(标准状态下)使用的端口是不确定的,所以在需要过滤或转发的环境下使用起来很不方便。虽然 GlusterFS 在使用的集群数量上也会增加端口,但我认为这还是在设计和预测的范围内。

请提出要求。

我想在Docker容器内挂载由其他服务器提供的GlusterFS卷。

问题点。

GlusterFS使用了FUSE,但其机制与Docker的权限冲突,无法进行使用。

前提条件

服务器将使用Debian8机器来运行GlusterFS。
Docker主机将是另一台Debian8机器。
Docker容器将运行在Debian8上。

一种解决方案

只需在容器启动时允许 FUSE 使用的系统请求即可。在网络上搜索,可以看到很多示例都加上了 –privileged 开关。虽然这在实验和确认用途上可能可行,但给容器授予全部权限还是让人有些担心的。

我认为,如果只限制到必要的权限和访问路径,它将变成以下的开关:
–设备=/dev/fuse –添加权限=SYS_ADMIN

准备

创建一个包含GlusterFS客户端的Debian映像。

FROM debian:jessie
MAINTAINER rerofumi

RUN echo 'deb http://ftp.jp.debian.org/debian/ jessie main' > /etc/apt/sources.list
RUN echo 'deb http://security.debian.org/ jessie/updates main' >> /etc/apt/sources.list

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
    apt-get -y upgrade; \
    apt-get -y dist-upgrade; \
    apt-get -y install glusterfs-client; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*


CMD ["/bin/bash"]

让我们创建一个测试镜像,将上述的Dockerfile命名为glusterfs-test并构建它。

确认

使用带有许可开关的测试映像进行启动。

docker run -it –device=/dev/fuse –cap-add=SYS_ADMIN –rm glustefs-test bash

等待容器启动后,尝试挂载GlusterFS的卷。

mount -t glusterfs [GlusterFS服务器地址]:/[卷名称] /mnt

当您成功完成挂载且没有出现任何错误时,请视为成功。