在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
当您成功完成挂载且没有出现任何错误时,请视为成功。