利用docker快速部署无状态业务是非常便利的操作,但是部署类似数据库等需要持久保存数据的应用就需要将容器保存数据的卷以共享存储的形态挂接在容器中,如果直接将本地存储磁盘挂接在容器中,如果运行容器的机器出现故障,在另外机器上启动的容器无法访问原容器挂接的存储资源导致业务失败。
VMware的vSphere有设计专用于支持Docker的vSphere Docker卷服务-VDVS,架构如下图所示:
vSphere Docker Volume Service技术支持在vSphere环境中运行由所选存储技术支持的有状态容器。VDVS与VMWare的成熟存储技术配合使用,易于从最终用户的角度安装和使用,同时保持vSphere管理员的可见性和控制。
VDVS的一些主要功能是:
一、vSphere支持docker持久化的基本原理
用于vSphere的新Docker卷驱动程序由两部分组成:
第一部分是安装在Docker主机(VM)内部的vSphere Docker卷插件,允许您实例化新的Docker卷。
第二个是安装在ESXi Hypervisor主机中的vSphere Data Volume Driver,它将处理VMDK创建以及Docker Volume请求到Docker主机的映射。
如果ESXi主机上有共享存储,则可以在一个ESXi主机上创建一个VM,创建一个Docker Volume,并在另一个ESXi主机上安装完全不同的VM,安装完全相同的Docker Volume。下图是帮助说明构成适用于vSphere的Docker Volume Driver的不同组件的图表。
二、安装vSphere支持docker插件操作实施步骤
1、实验条件准备
具体操作步骤需要注意流程:首先在ESXi上安装对应的VIB插件,然后重启ESXi的hostd服务使VIB插件生效,然后在到对应安装DOCKER的VM上安装docker插件,顺序不要搞反了。
2、ESXi安装插件操作步骤
a、基于VUM的VIB安装
VDVS的ESXi组件以脱机库的形式提供,可以将最新版本下载为ZIP存档。
下载VIB捆绑包作为zip格式后,使用以下步骤使用VUM执行安装。
b、基于ESXi命令行安装VIB
VDVS的ESXi组件以VIB的形式提供。VIB代表vSphere安装捆绑包。在概念层面,VIB类似于tarball或ZIP存档,因为它是打包到单个存档中以便于分发的文件集合。
登录ESXi主机并在ESXi上下载最新版本的VDVS驱动程序VIB。假设您已在/ tmp位置下载了VIB,则可以运行以下命令将其安装在ESXi上。您将需要ESXi 6.0或更高版本
esxcli software vib install -v /tmp/vmware-esx-vmdkops-0.12.ccfc38f.vib
Installation Result
Message: Operation finished successfully.
Reboot Required: false
VIBs Installed: VMWare_bootbank_esx-vmdkops-service_0.12.ccfc38f-0.0.1
VIBs Removed:
VIBs Skipped:
注意:要在ESX主机上使用admin命令集,请在安装vib后重新启动hostd。 /etc/init.d/hostd restart
3、虚拟机安装docker插件操作步骤
VDVS插件可以像任何docker插件安装一样安装在Linux Docker主机上。您将需要VM上的docker版本17.06.1或更高版本。在大型节点池中,您可以通过配置管理工具(如Ansible / Salt)或使用远程shell会话将插件安装推送到多个VM。插件的安装非常简单,我们将逐步完成安装/卸载,启用和验证插件安装的步骤。
docker上执行下面的命令即可。
docker plugin install --grant-all-permissions --alias vsphere vmware/vsphere-storage-for-docker:latest
docker plugin install --grant-all-permissions --alias vsphere vmware/vsphere-storage-for-docker:latest
latest: Pulling from vmware/vsphere-storage-for-docker
f07d34084e57: Download complete
Digest: sha256:e1028b8570f37f374e8987d1a5b418e3c591e2cad155cc3b750e5e5ac643fb31
Status: Downloaded newer image for vmware/vsphere-storage-for-docker:latest
Installed plugin vmware/vsphere-storage-for-docker:latest
安装成功后执行docker plugin ls查看安装效果如下。
# docker plugin disable vsphere
vsphere
~# docker plugin ls
ID NAME DESCRIPTION ENABLED
831fd45343af vsphere:latest VMWare vSphere Docker Volume plugin false
~# docker plugin enable vsphere
vsphere
~# docker plugin ls
ID NAME DESCRIPTION ENABLED
831fd45343af vsphere:latest VMWare vSphere Docker Volume plugin true
# docker plugin rm vsphere
vsphere
~# docker plugin ls
ID NAME DESCRIPTION ENABLED
三、虚拟机上通过docker使用vsphere共享资源实现持久化验证步骤
1、创建docker-swarm集群,并在集群中每台机器上安装docker支持vsphere的插件
2、 在集群内任意一台机器上创建一个docker的共享卷
docker volume create --driver=vsphere --name=vol1 -o size=2gb
创建完毕后通过docker volume ls查看是否创建成功。
还可以通过查看vsphere在虚拟机上的日志文件来进一步观察docker与vsphere文件系统交互的详细信息,
/var/log/vsphere-storage-for-docker.log
可以通过docker volume inspect vol1 查看该卷的详细信息,默认挂载路径是/mnt/vmdk/vol1/,设置该卷的大小为2G,实际分配占用105M大小,改卷在vsphere上是精简置备模式。
下面进入vpshere中显示对应的实际存储位置及文件,对照上面的内容可以有更加直观的认识。
3、 在集群1号机器上启动一个容器挂载vol1卷,进入容器在对应目录写入新文件
docker run --rm -it -v vol1:/mnt/volume1 busybox
上面一张图在mysql-cloud1主机上挂载了vol1卷,下面把mysql-cloud1上的容器退出,在mysql-cloud3上挂载vol1卷,看刚刚在mysql-cloud1上创建的helloworld文件是否存在,如果存在则证明跨主机容器数据共享成功。
通过下图显示,mysql-cloud1-3三台虚拟机在vsphere集群中实际部署在三台不同的物理主机上,vsphere实现了跨主机支持docker写入共享存储的功能,对开发人员来说vsphere集群对其是透明状态。
四、总结
1、docker容器持久化必须要把数据保存在共享存储中,这个共享存储是相对于ESXi主机不是相对于虚拟机来说的;
2、也可以不通过vsphere插件实现共享存储,可以在网络中实现NFS、ceph等网络共享存储方式实现docker的持久化;
3、通过ESXi主机内置的python脚本也可以查询已创建的Docker卷列表
/usr/lib/vmware/vmdkops/bin/vmdkops_admin.py volume ls -c 'volume','datastore','capacity','used','attached-to','created-by
','created'
4、这种模式不支持两台机器同时共享一个卷,也就是说如果vol1在某一台主机上加载后,其它主机无法再次加载只能等已经加载的主机退出加载后 其它主机才能加载,否则会报错,如下图: