侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

NFS 容器化部署

barwe
2023-06-07 / 0 评论 / 0 点赞 / 994 阅读 / 2,253 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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
  1. 这里 NFS 服务器貌似不需要用到其他 hosts,所以这个文件挂不挂都行
  2. 保持容器时间与宿主机一致
  3. 安装三个内核模块:nfs, nfsd, rpcsec_gss_krb5(参考
  4. NFS 服务器共享出去的路径
  5. 容器内路径 /volumes 将作为共享资源的根路径
  6. 将 munge 配置(卷)共享给计算节点
  7. 将 slurm 配置(卷)共享给计算节点
  8. 将日志路径(卷)共享给计算节点
  9. 将数据目录(卷)共享给计算节点
  10. 主机名 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
0

评论区