docker中nfs server的多目录挂载点搭建

1.背景

在使用docker云平台(这个可以包含公有的云平台,也可以是自己内部搭建的云平台)过程中,同一个应用系统一般都涉及多个镜像,比如一般都会涉及到Web逻辑的镜像、Nginx等代理镜像及数据库镜像,而且它们都会使用到存储,将内部的可变数据持久化到存储上,这样保证容器重启或删除后,数据依然存在。
而如果同一个系统启动的镜像太多了,如果每个镜像申请一个存储目录,那么需要申请的存储目录就可能会很多,管理起来可能会不太方便。
本文针对如下情况,描述尝试的方案:

  • 多个镜像均需挂载的目录,进行存储数据;
  • 想只申请一份挂载的存储空间,想建立其子目录以适应不同的镜像挂载;
  • 在k8s云平台中,又限制只能直接挂载PVC存储,不能对PVC下的子目录进行挂载
  • 当前无可用的公共NAS或NFS的挂载点

因此,需要启动一个docker容器,用来运行NFS服务器,将同一个PVC的存储分别映射出不同的子目录供不同镜像挂载,以实现:对于镜像来说,可直接挂载自己的目录,不会对其它目录造成影响,其容器内部目录结构也不需要做任何改变。

2.单挂载点

2.1.下载镜像并启动服务容器

本文使用的镜像为itsthenetwork/nfs-server-alpine:latest,可直接pull到本地,启动容器方法:

docker run -d --name nfs_server --privileged -p 2050:2049 \
-v /本地需共享的主机目录:/nfsroot \
-h nfsserver \
-e SHARED_DIRECTORY=/nfsroot \
itsthenetwork/nfs-server-alpine:latest

其中-p的端口2050为容器映射出来主机的端口;
-h表示为本容器设定一个主机名,这样在其他容器中可使用主机名的方式访问(有可能容器在重启后其IP会变化);
-e为设置本容器的环境变更,表示本容器对外提供的根为【/】的挂载点。

2.2.客户端容器连接

假设已经存在另外一些客户端的镜像,本文以alpine linux为例:

docker run -it --name nfs_client --privileged  \
--link nfs_server:nfsserver \
alpine:latest /bin/sh

上述命令只是启动临时的容器,作为验证使用,若需长期启动容器并挂载,需要将-it换成-d,更多具体的容器操作,可查阅相关资料。
其中--link表示本容器会访问到容器名为nfs_server且其主机名为nfsserver的容器,添加此参数后会在本容器的/etc/hosts文件中添加一行

172.xxx.xxx.xx      nfsserver nfsserver nfs_server

还需注意,此容器需添加--privileged参数表示容器的用户有SYS_ADMIN权限,此时才可顺利的执行mount命令。

然后就是在容器中进行mount了:

mount -t nfs4 nfsserver:/ /home/vol01/

将nfs的根目录挂载到本地的/home/vol01目录中。

注意:
此时只能挂载mfsserver:/这个根,不能再往后写其子目录,即使子目录已经建立好,因为当前服务器中/etc/exports中只指明了这个根是对外提供挂载的,而没有指明其子目录。
/etc/exports文件声明对外挂载的目录,文件内容示例如下:

/nfsroot *(rw,fsid=0,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)

若单节点的搭建还存在问题,可再参考官方github说明

2.3.小结

上述安装过程展现了各目录之间的前后关系(假设S表示服务容器,C表示客户容器):

  • S中启动时已经挂载PVC存储到【/nfsroot】目录
  • S启动时会使用/etc/exports文件,表示本地目录是【/nfsroot】,对外挂载时是默认的【/】
  • C端mount将S的【/】映射到本地【/home/vol01】
  • 最终实现【存储目录】->【/nfsroot】->【/】->【/home/vol01】的转换

3.多挂载点

3.1.原理

参考文章NFS (Network File System) 服务器共享多个目录,结合github在线提问,即我们可有2种方法来实现多目录共享:

  • 重新编译镜像方式:
    下载nfs-server-alpine的github源码,按在线提问方法修改confd/tmpl/exports.tmpl文件,注意其中的fsid=0参数只能有1个,表示对外提供的根服务目录,然后重新编译镜像并启动容器。
  • 直接修改容器内容:
    可在启动nfs-server-alpine容器后,进入容器中手动修改/etc/exports文件,然后再将容器反向保存为镜像,这样以后启动新容器时就还是能提供多目录的挂载点了。示例:
/nfsroot *(rw,fsid=0,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
/nfsroot/vol1 *(rw,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
/nfsroot/vol2 *(rw,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
/nfsroot/vol3 *(rw,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)

但无论使用哪种方案,最终目标都是生成合适的/etc/exports文件。

3.2.客户端的挂载

客户端挂载时,可使用如下方式:

mount -t nfs4 nasserver:/vol1 /home/vol_1/

即目录关系为:
【存储】->【/nfsroot】->此目录下新手工建了vol1到vol3子目录->【exports文件中/nfsroot/vol1到vol3】->【客户端/vol1到vol3】->【客户端/home/vol_1/或其他本地目录】

3.3.总结

至此,所有的工作就已经完成了。
经验就是只要弄明白单文件挂载,多文件挂载也就很轻松了。

你可能感兴趣的:(docker中nfs server的多目录挂载点搭建)