0%

Docker Swarm使用NFS作为共享存储

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

创建目录

1
sudo mkdir /nfs

配置NFS共享目录

1
vi /etc/exports

输入以下内容:

1
/nfs 192.168.52.0/24(rw,no_root_squash)

重新加载NFS配置

1
sudo exportfs -rav

部署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目录

1
umount /mynfs

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 容器的共享目录中查看文件是否存在。