Docker swarm 集群NFS共享目录
 

NFS 主机安装服务端

服务端安装命令如下:

sudo apt install nfs-kernel-server -y
NFS服务端安装
NFS服务端安装
服务端配置NFS存储路径
sudo mkdir /nfs
sudo chmod 777 -R /nfs
sudo vi /etc/exports
添加以下内容
/nfs 192.168.79.0/24(rw,sync,no_root_squash,no_subtree_check)
nfs路径配置
nfs路径配置
配置完毕后重载配置:
sudo exportfs -rav
NFS服务的配置完毕!

NFS客户端

所有Docker主机安装NFS客户端,安装命令如下:
sudo apt install nfs-common -y
NFS客户端安装
NFS客户端安装

提示:
安装了服务端的主机不用再次安装客户端,已经随同安装了。


查看服务端的目录列表
showmount -e 192.168.79.129
服务的目录列表

测试挂载目录

sudo mkdir /mynfs
sudo mount -t nfs 192.168.79.129:/nfs /mynfs
在/mynfs目录中创建文件,然后在NFS服务端的共享目录中查看文件是否存在,存在则代表共享成功。
验证成哥
验证成功

卸载NFS目录

sudo umount /mynfs



方案一:主机先挂载nfs目录,docker配置挂载后的共享目录(靠谱)


方案二:Docker Stack直接配置NFS共享目录(有时候不生效)

既然是集群,我们就不会希望跑到每个节点上面去配置NFS挂载和映射。做集群共享卷的关键,就是在compose文件中创建volume。语法如下:

volumes:
  my-vol:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.79.129,rw"
      device: ":/volume1/swarm"

与应用结合

下面来一个复杂一点的 stack 配置,有 Prometheus 与 Grafana 两个容器,其中 Grafana 挂载 NFS 卷作为持久化存储,两个容器通过 overlay 网络互访。
 

version: '3.7'

services:
  grafana:
    image: grafana/grafana:latest
    hostname: grafana
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
    networks:
      - monitor_distributed
    ports:
      - 3000:3000
    volumes:
      - grafana-data:/var/lib/grafana

  prometheus:  
    image: prom/prometheus:latest
    hostname: prometheus
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
    networks:
      - monitor_distributed

networks:
  monitor_distributed:
    driver: overlay

volumes:
  grafana-data:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.79.129,rw"
      device: ":/volume1/grafana"

评论区域