Docker Swarm是轻量级的Docker集群解决方案。实现swarm集群应用数据持久化的一种方法是使用NFS共享存储。
搭建NFS步骤
所有节点安装NFS
1
| sudo yum -y install nfs-utils
|
部署NFS服务端
开启NFS服务
1 2
| sudo systemctl start nfs sudo systemctl enable nfs
|
添加防火墙规则
1 2 3 4 5
| sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --permanent --add-service=mountd sudo firewall-cmd --permanent --add-port=2049/tcp sudo firewall-cmd --permanent --add-port=2049/udp sudo firewall-cmd --reload
|
创建目录
配置NFS共享目录
输入以下内容:
1
| /nfs 192.168.52.0/24(rw,no_root_squash)
|
重新加载NFS配置
部署NFS客户端
查看共享目录列表
1
| showmount -e 192.168.52.141
|
测试挂载目录
1 2
| sudo mkdir /mynfs sudo mount -t nfs 192.168.52.141:/nfs /mynfs
|
在/mynfs目录中创建文件,然后在NFS服务端的共享目录中查看文件是否存在,存在则代表共享成功。
卸载NFS目录
Docker Stack配置NFS共享目录
既然是集群,我们就不会希望跑到每个节点上面去配置NFS挂载和映射。做集群共享卷的关键,就是在compose文件中创建volume。语法如下:
1 2 3 4 5 6
| volumes: my-vol: driver_opts: type: "nfs" o: "addr=192.168.52.141,rw" device: ":/volume1/swarm"
|
与应用结合
下面来一个复杂一点的 stack 配置,有 Prometheus 与 Grafana 两个容器,其中 Grafana 挂载 NFS 卷作为持久化存储,两个容器通过 overlay 网络互访。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 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.52.141,rw" device: ":/volume1/grafana"
|
部署应用
1
| docker stack deploy -c docker-compose.yaml monitor_stack
|
增加 Grafana 的副本数
1
| docker service scale monitor_stack_grafana=2
|
查看数据卷
在worker节点执行命令查看数据卷
1 2
| docker volume ls docker volume inspect monitor_stack_grafana-data
|
结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [ { "CreatedAt": "2020-08-27T20:21:45Z", "Driver": "local", "Labels": { "com.docker.stack.namespace": "monitor_stack" }, "Mountpoint": "/var/lib/docker/volumes/monitor_stack_grafana-data/_data", "Name": "monitor_stack_grafana-data", "Options": { "device": ":/volume1/grafana", "o": "addr=192.168.52.141,rw", "type": "nfs" }, "Scope": "local" } ]
|
可以看到,实际上 NFS 目录还是被挂载到节点宿主机上的。
为了确认挂载成功,还可以在 worker 节点 grafana 容器的共享目录创建文件,然后在 manager 节点 grafana 容器的共享目录中查看文件是否存在。