若是Docker Swarm集群中运行了mysql、nginx等服务,这些服务的数据若是没有挂载到宿主机中,那么容器一旦中止运行,那就意味着数据丢失。html
有什么方法能够解决swarm集群中运行的服务可以数据持久化呢?咱们能够经过volme、nfs等方法来实现swarm集群应用数据持久化,其实也和docker数据持久化的形式是同样的。node
能够用两种方式来实现:mysql
volume 默认模式:工做节点宿主机数据同步到容器内。nginx
volume NFS 共享存储模式:管理节点宿主同步到工做节点宿主,工做节点宿主同步到容器。sql
1、经过volume实现数据持久化 docker
注意:这种方式各个节点的数据不能共享。 安全
卷是绕过联合文件系统的一个或多个容器内的特定目录。 卷被设计为保持数据,与容器的生命周期无关。 所以,Docker在删除容器时不会自动删除卷,也不会“垃圾收集”再也不由容器引用的卷。 也称为:数据卷。服务器
使用的语法格式以下: 网络
使用案例: 异步
在Swarm上部署服务,同时指定相应的数据卷
docker service create -p 7788:80 --replicas 3 --name myswarmtest \ --mount type=volume,src=myvolumn,dst=/usr/share/nginx/html/ collenzhao/mynginx:v1
查看数据卷
docker volume ls
查看数据卷挂载的目录
docker volume inspect myvolumn
2、经过NFS实现数据持久化
NFS(Network File System)即网络文件系统,它容许网络中的计算机之间经过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用能够透明地读写位于远端NFS服务器上的文件,就像访问本地文件同样。
为了方便咱们进行测试,单独准备一台机器做为NFS的服务器:node3。接下来,咱们就须要安装NFS了。
一、全部节点安装NFS
yum -y install nfs-utils
二、NFS服务器端的部署
开启NFS服务
systemctl enable nfs systemctl start nfs
建立NFS目录
mkdir /nfs
编辑NFS配置文件
vi /etc/exports 输入如下内容: /nfs *(rw,sync,no_root_squash) 参数说明: /nfs : 共享的目录 * : 能够访问的主机网段,星号表示全部网段。 rw : 可读写权限,只读权限ro sync : 同步,数据更安全,速度慢 async : 异步,速度快,效率高,安全性低 no_root_squash :NFS 服务共享的目录的属性, 若是用户是root, 对这个目录就有root的权限
重启NFS
systemctl restart nfs
三、NFS客户端的部署
启动NFS客户端
systemctl start rpcbind
测试挂载nfs共享目录
mount -t nfs 192.168.15.140:/nfs /mynfs 其中:192.168.15.140为node3(NFS服务器的地址)
在文件/mynfs/a.txt 输入一些内容,在nfs服务器端查看是否可以看到刚才输入的内容。也能够经过下面的语句卸载NFS目录。
umount /mynfs/
四、基于NFS共享目录,建立Swarm集群服务
docker service create \ --replicas 3 \ --name my-nginx \ -p 7788:80 \ --mount 'type=volume,src=my-nfs-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=192.168.15.140:/nfs,"volume-opt=o=addr=192.168.15.140,vers=4,soft,timeo=180,bg,tcp,rw"' \ collenzhao/mynginx:v1
参数说明:
五、验证明验环境
在Manager节点上,查看服务和数据卷目录
docker service ls
docker volume ls
查看node1数据卷目录
docker volume ls
查看node2数据卷目录
docker volume ls
在任意一个节点上,进入数据卷共享目录修改a.html