若是你用过Docker你就会知道,共享卷和跨主机的数据访问是个很是棘手的问题。虽然Docker的生态系统在逐渐走向成熟,但对大多数人来讲,在不一样环境中实现持久化存储仍是很麻烦的。幸运的是,Rancher一直在研究这件事,而且想出了一个能独特的、能解决大部分这个问题的方案。用共享存储运行数据库的方法仍没有被普遍推荐,但对于许多其余的状况,跨主机共享卷却是一个很好的作法。git
这个指南中的大部份内容是受Rancher的一个线上Meetup的启发。另外,若是你想本身从头开始搭建Convoy-NFS,这个网页上有一些有关NFS配置的信息,你也许能做为参考:https://github.com/rancher/ra...。github
若是你之前没有据说过Rancher的Convoy项目,我如今能够先简单介绍一下。Rancher但愿能够经过Convoy项目让持久化容量存储变得简单方便。Convoy是一个很是棒的磁盘插件,由于它为用户提供了多种不一样的选择。例如EBS卷和S3的支持,与VFS/NFS一块儿,为用户提供了一些用于配置共享存储的厉害而且灵活的选择。docker
这里有一个小秘诀,教你怎样启动一个能和Convoy-NFS服务链接起来的Docker化的NFS服务器。Docker-NFS基本上是一个穷人的EFS。若是你想运行它,你必须有足够的信心,相信服务器不会被毁,或相信你的数据无足轻重,即便丢失了也无所谓。你能够在这里找到更多我过去使用的Docker NFS服务器的信息。数据库
给点进阶些的提议,我会建议你看看这个叫作弹性文件存储或简称EFS的东西,它是 NFS的AWS实现。这个解决方案更简单粗暴,它是一个随时可用于生产的NFS服务器,你能够把它视为Convoy-NFS的后端。构建EFS是很简单的,不过它超出了这篇文章的讨论范围。你能够在这个连接中看看如何构建和配置EFS。ubuntu
警告:由于EFS是AWS的一个较新的服务,它只能在有限的几个位置上使用。(不过更多的可以使用位置也很快会出现)。后端
下面就是对于Docker-NFS服务器来讲,你的docker-compose.yml 可能的样子:bash
docker-nfs: image: cpuguy83/nfs-server privileged: true volumes: - /exports command: - /exports
在采用这个容器化的NFS服务器的方法时你可能会碰到的一个疑难杂症是,你的主机要么没有安装NFS内核模块,要么没有打开伴随的服务。服务器
在Ubuntu上很容易安装内核模块,SSH到主机上, 运行NFS Server容器以及如下命令:tcp
sudo apt-get install nfs-kernel-server
在CoreOS上,模块是安装了的,只是没有打开。要启用NFS,你须要SSH到对应主机上,运行NFS Server容器,并运行下面的命令:测试
sudo systemctl start rpc-mountd
配置EFS是很容易的。用上面提到过的连接,你能够了解到建立一个能与Convoy链接的EFS卷的所有步骤。EFS共享卷既能够简单配置成IP访问,也能够深刻地配置成经过DNS域名访问。
在Rancher的社区应用服务目录里有一个新的目录入口,有了它,你能够直接经过Convoy使用EFS卷,这能简化某些配置。使用应用服务目录入口仍须要你先建立EFS share,但配置Convoy来与其链接的过程会简单不少。只须要从AWS里复制出EFS ID,选择其中你已建立共享的区域,而后指定要将EFS share安装到本地的位置。“/efs”就是一个很好的在最开始测试东西的例子:
目前,Rancher还提供另一种名叫“Convoy-NFS”的应用服务目录项,来将容器链接到NFS Server上:
安装程序是很是简单的,但也有几件事情要注意。首先,堆栈必须命名为“Convoy-NFS”,这是插件的名称。其次,NFS Server应该和在其上设置NFS Server的主机名相匹配。若是你建立的是Docker-NFS容器,记得使用容器的IP(为了写这篇文章,我用了一个测试环境,于是只用了Rancher容器内部IP来部署NFS Server)。当你用EFS建立你的NFS share时,使用已配置的DNS的名称。
最后一点要注意的是安装选项和安装点。这里的端口须要与将NFS Server 和(2049 for docker-nfs)配置在一块儿的端口相匹配,而且确保你打开了nfsver=4。另外,若是你要使用nfsvers=4选项,记得必定为MountDirectory用“/”。不使用nfsvers=4选项的话就用“/exports”。
最终一步的配置和下面看上去差很少:
proto=tcp,port=2049,nfsvers=4
你能够添加其余选项来调整共享,但这些都是最低限度的构建所必需的组件。
给Rancher几分钟时间提供Convoy-NFS容器。一切完成后你就能够建立和攻击NFS卷了。最快的检查是否一切正常的方法,是点击Infrastructure -> Storage Pools选项。若是你在视图中看见了主机,那你就能够开始准备建立和分享卷了。
如今你能够开始从Storage Pools视图中手动建立一个卷,或干脆建立一个使用Convoy-NFS driver和卷名的服务。
我将建立一个测试容器,它可跨越两个主机共享相同的“test_volume”以及数据,以下图所示(我在本地使用了rancher-compose来堆栈,若是你以为使用GUI更容易的话敬请使用GUI)。
test: image: ubuntu volume_driver: convoy-nfs tty: true volumes: - test_volume:/data command: - bash
一个新的卷会在Storage Pools页面上弹出来:
若是你想验证是否一切运行正常,你能够将容器的数量扩展到两个或更多个。而后exec到一个容器中,在其中建立一个文件,看你可否从另外一个容器中读取这个文件,并且最好是在一个不一样的主机上。若是这些都没问题,你应该已经成功了:
在第一个容器中,咱们能够编写出文件:
在第二个容器中,咱们能够从新读取它,检测一下共享存储是否运行正常:
随着Convoy不断的发展和壮大,咱们会看到更多的部署的选择。如今,NFS是稳定的,能正常工做的。若是你已经在使用AWS了,EFS会让一切都变得更加容易。我很是期待看到Convoy和Rancher中的共享卷会有什么下一步的发展。