NFS
服务端
services:
nfs:
image: erichough/nfs-server
container_name: nfs
hostname: nfs
volumes:
- ${HOSTS}:/etc/hosts # 1
- /etc/localtime:/etc/localtime:ro # 2
- /lib/modules:/lib/modules:ro # 3
- $PWD/exports.txt:/etc/exports # 4
- ${VOLUME_DIR}:/volumes # 5
- munge:/volumes/munge # 6
- confd:/volumes/confd # 7
- logs:/volumes/logs # 8
- data:/volumes/data # 9
working_dir: /volumes
cap_add:
- SYS_ADMIN
- SYS_MODULE
privileged: true
network_mode: host # 10
- 这里 NFS 服务器貌似不需要用到其他 hosts,所以这个文件挂不挂都行
- 保持容器时间与宿主机一致
- 安装三个内核模块:nfs, nfsd, rpcsec_gss_krb5(参考)
- NFS 服务器共享出去的路径
- 容器内路径 /volumes 将作为共享资源的根路径
- 将 munge 配置(卷)共享给计算节点
- 将 slurm 配置(卷)共享给计算节点
- 将日志路径(卷)共享给计算节点
- 将数据目录(卷)共享给计算节点
- 主机名 nfs 应该被解析到宿主机的 IP 地址(192.168.2.3)
NFS4 默认使用 2049 端口对外提供服务。
exports
完整的共享配置文件如下:
/volumes *(rw,no_root_squash,subtree_check,fsid=0)
/volumes/munge *(rw,no_root_squash,subtree_check)
/volumes/confd *(rw,no_root_squash,subtree_check)
/volumes/logs *(rw,no_root_squash,subtree_check)
/volumes/data *(rw,no_root_squash,subtree_check)
最佳实践是,我们将需要共享的数据放在一个目录下(这里是 /volumes),将其作为根路径(设置 fsid=0)共享出去。然后在分别添加其他需要共享的数据。
客户端
客户端容器只需要安装 nfs-utils 软件包即可。
FROM centos:7
RUN yum update -y \
&& yum install -y nfs-utils
# docker build . -t nfs-client:local
我们在另一台服务器(192.168.2.5)上启动客户端测试容器:
$ docker run -it --rm \
--privileged \
--net=host \
--add-host=nfs:192.168.2.3 \
nfs-client:local
先启动 RPC 服务,才能与 NFS 服务器通信:
$ rpcbind
然后创建挂载点:
$ mkdir -p /volumes/{munge,confd,logs,data}
在 NFS 客户端中,我们通过 mount 命令挂载 NFS 服务器的共享路径:
array=("munge" "confd" "logs" "data")
for k in "${array[@]}"; do mount nfs:/$k /volumes/$k; done
注意,在 NFS4 中,声明服务器路径时 fsid=0 对应的路径就是根路径(/),所以
- /volumes 对应 nfs:/
- /volumes/data 对应 nfs:/data
- ……
宿主机直接挂载:
# apt install nfs-common
array=("munge" "confd" "logs" "data")
SERVER=192.168.2.3
VOLUME=/var/lib/docker/volumes
for k in "${array[@]}"; do
x="${VOLUME}/slurm_$k/_data"
if [ ! -d "$x" ]; then mkdir -p "$x"; fi
mount ${SERVER}:/$k $x;
done
卸载:
array=("munge" "confd" "logs" "data")
VOLUME=/var/lib/docker/volumes
for k in "${array[@]}"; do
umount ${VOLUME}/slurm_$k/_data;
done
Strange Volumes
将 docker 挂到容器里面:
-v /bin/docker:/bin/docker
-v /bin/docker-compose:/bin/docker-compose
-v /var/run/docker.sock:/var/run/docker.sock
同步容器与宿主机的时间:
-v /etc/localtime:/etc/localtime:ro
同步 hosts 文件:
-v /etc/hosts:/etc/hosts
# 或者自定义的文件
-v $PWD/hosts:/etc/hosts
评论区