日常部署项目中,不同的的应用运行于不同虚拟机的不同docker 容器之中, 

不少是有状态的容器,需要把数据卷 独自挂出来。  比如下面postgresql 数据库的代码:

#more start-docker.sh

#!/usr/bin/env bash

file_path=$(cd "$(dirname "$0")"; pwd)
cd ${file_path}
docker stop postgresql
docker rm postgresql
firewall-cmd --add-port=5432/tcp --permanent --zone=public
firewall-cmd --reload

DATA_PATH=${file_path}/postgres-data

if [ ! -d "$DATA_PATH" ]; then
    echo "Create dir ${DATA_PATH} "
    mkdir "$DATA_PATH"
fi

DATA_BACKUP_PATH=${file_path}/postgres-backup

if [ ! -d "$DATA_BACKUP_PATH" ]; then
    echo "Create dir ${DATA_BACKUP_PATH} "
    mkdir "$DATA_BACKUP_PATH"
fi
 

docker run --name postgresql \

           --restart always \

           -v ${DATA_PATH}:/var/lib/postgresql/data \

           -v ${DATA_BACKUP_PATH}:/postgres-backup \

           -p 5432:5432 \

           -e POSTGRES_USER=centos \

           -e POSTGRES_PASSWORD=your_password \

        -d postgres:9.6.2 \

        postgres -c max_connections=500

 

以上代码可以正常运行,一般情况下都正常。但是部署在mesos + marathon 或者kubernet 分布式docker 容器平台时,就发现了一个问题: 容器故障挂掉是很正常的事情,虚拟机故障也是大概率事件,如果确保数据和容器彻底独立呢? 故障能及时恢复呢?

   之前成功尝试过moosefs 分布式文件系统+ 自己编译的通用java docker 容器可以解决这个问题。但是大部分容器镜像都是来自github,但是仅仅是为了 让容器变成无状态的,我们没有必要每次都非得重新编译一个属于自己的镜像,这代价也太大了。应该有更好的更简单的方式。

后来谷歌再次搜索了相关问题,看到vmware官方的资料,发现了,有更好的解决办法.

 

环境描述: Vmware Vsphere  Esxi6.0 + Centos7.3 

适用于Docker的vSphere Storage
vSphere Storage for Docker使客户能够满足vSphere环境中Docker容器的持久存储要求。 此服务与Docker Volume Plugin框架集成。 Docker用户现在可以使用Docker将vSphere Storage(vSAN,VMFS,NFS,VVol)用于有状态容器。

vSphere Storage for Docker经Docker认证,可与Docker Enterprise Edition配合使用,并可在Docker商店中使用。

vSphere Storage for Docker使您能够在VMware vSphere之上运行有状态的容器化应用程序。

它旨在满足企业IT和应用程序开发人员的需求,并提供以下好处:

提供经过验证的持久共享存储:您现在可以使用由vSAN,VMFS,NFS,VVol等支持的任何VMware支持的企业级存储。
启用多租户,安全性和访问控制:vSphere Admins可以从一个位置轻松地跨主机,数据存储和VM共享存储的访问权限
操作一致性和简单性:零配置,零凭证管理。 它易于部署和管理
自助服务操作:使用docker API管理卷生命周期,同时保持管理员对消耗的控制
此服务与Docker Volume Plugin框架集成。 它不需要凭据管理或配置管理。

安装
在ESXi上安装
基于VUM的VIB安装
通过esxcli / localcli安装VIB
在Linux Docker主机上安装
依赖
安装说明
在Windows Docker主机上安装
升级说明
降级到以前的版本
安装包括两部分 - 在ESXi上安装vSphere安装捆绑包(VIB)以及在计划运行具有存储需求的容器的主机上安装Docker插件。

在ESXi上安装
VIB和Offline Depot是为在ESX上安装服务的后端而构建的软件包。可以使用esxcli或vmware工具(如VUM)安装后端

基于VUM的VIB安装
VDVS的ESXi组件以脱机库的形式提供,可以将最新版本下载为ZIP存档。

将VIB捆绑包下载为zip格式后,使用以下步骤使用VUM执行安装。

转到更新管理器选项卡中的管理视图。
使用import zip选项导入zip包。
创建基线并包含zip包。
扫描您的主机与基线。
修复主机。
有关更多信息,请参见VUM用户指南。

环境准备: 3 台虚拟机

序号

虚拟机名称

ip

说明:虚拟机需要安装vsphere 插件

1t110.20.1.31docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
2t210.20.1.32docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
3t310.20.1.33docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest

一. 通过esxcli / localcli安装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

 

最新下载地址:

https://github.com/vmware/vsphere-storage-for-docker/releases

https://bintray.com/vmware/vDVS/download_file?file_path=VMWare_bootbank_esx-vmdkops-service_0.21.2.8b7dc30-0.0.1.vib

安装结果
   消息:操作成功完成。
   需要重新启动:false
   已安装VIB:VMWare_bootbank_esx-vmdkops-service_0.12.ccfc38f-0.0.1
   VIB已删除:
   VIB跳过:
注意:要在ESX主机上使用admin命令集,请在安装vib后重新启动hostd。 /etc/init.d/hostd restart

在Linux Docker主机上安装
VDVS插件可以像任何docker插件安装一样安装在Linux Docker主机上。您将需要VM上的docker版本17.06.1或更高版本。在大型节点池中,您可以通过配置管理工具(如Ansible / Salt)或使用远程shell会话将插件安装推送到多个VM。插件的安装非常简单,我们将逐步完成安装/卸载,启用和验证插件安装的步骤。

依赖
该插件使用VMCI(虚拟机通信接口)和vSockets联系ESX上的服务。相关的Linux内核驱动程序通过VMware Tools及其开放版本(即open-vm-tools,packages)安装。必须在guest虚拟机操作系统中安装其中一个软件包。建议安装这些软件包中最新版本的软件。

安装说明
该插件在公共docker注册表中以docker镜像的形式提供,但如果您使用的是私有注册表,则必须指向该图像的相应URL。

注意:我们已经停止了基于DEB / RPM的Docker插件安装。
要安装插件

二. 在虚拟机里安装vsphere 插件 (请确保你的虚拟机域名能解析,能上互联网)
〜#docker plugin install --grant-all-permissions --alias vsphere vmware / vsphere-storage-for-docker:latest
最新:从vmware / vsphere-storage-docker中拉出来
f07d34084e57:下载完成
摘要:sha256:e1028b8570f37f374e8987d1a5b418e3c591e2cad155cc3b750e5e5ac643fb31
状态:已下载vmware / vsphere-storage-for-docker的最新映像:latest
已安装的插件vmware / vsphere-storage-for-docker:最新版本
验证它是否已安装并列出
〜#docker plugin ls
ID名称描述已启用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume插件为true
如果需要,您可以启用或禁用插件
〜#docker plugin禁用vsphere
的vSphere
〜#docker plugin ls
ID名称描述已启用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume插件为false

〜#docker plugin启用vsphere
 的vSphere
〜#docker plugin ls
ID名称描述已启用
831fd45343af vsphere:最新的VMWare vSphere Docker Volume插件为true
最后从给定的Docker主机中删除插件:
〜#docker plugin rm vsphere
的vSphere
〜#docker plugin ls
ID名称描述已启用
在Windows Docker主机上安装
可以使用PowerShell安装程序在Windows Server 2016 / Windows 10 VM上安装vSphere Storage for Docker。您将需要VM上的Windows版本17.06或更高版本(启用Windows容器模式)的Docker EE / Docker。

首先,使用“以管理员身份运行”选项启动PowerShell实例。

下载插件安装程序
PS C:\

三. 创建远程持久性数据卷:vsphereVolume10gb

docker volume create --driver=vsphere --name=vsphereVolume10gb -o size=10gb

docker volume inspect vsphereVolume10gb

 docker inspect vsphereVolume10gb@cw_m4_sas_datastore
[
    {
        "Driver": "vsphere:latest",
        "Labels": null,
        "Mountpoint": "/mnt/vmdk/vsphereVolume10gb@cw_m4_sas_datastore/",
        "Name": "vsphereVolume10gb@cw_m4_sas_datastore",
        "Options": {},
        "Scope": "global",
        "Status": {
            "access": "read-write",
            "attach-as": "independent_persistent",
            "capacity": {
                "allocated": "289MB",
                "size": "10GB"
            },
            "clone-from": "None",
            "created": "Wed Sep 12 02:03:22 2018",
            "created by VM": "t1",
            "datastore": "cw_m4_sas_datastore",
            "diskformat": "thin",
            "fstype": "ext4",
            "status": "detached"
        }
    }
]

 在esxi 主机上: 可以查看

[root@localhost:~] /usr/lib/vmware/vmdkops/bin/vmdkops_admin.py volume ls

Volume             Datastore           VMGroup   Capacity  Used   Filesystem  Policy  Disk Format  Attached-to  Access      Attach-as          Created By  Created Date       

-----------------  ------------------  --------  --------  -----  ----------  ------  -----------  -----------  ----------  -----------------  ----------  -----------------  

vsphereVolume10gb  cw_m4_sas_datast..  _DEFAULT  10GB      216MB  ext4        N/A     thin         detached     read-write  independent_per..  t1          Wed Sep 12 02:0..  

 

 

[root@t2 server]# more start-postgres-docker.sh
#!/usr/bin/env bash

file_path=$(cd "$(dirname "$0")"; pwd)
cd ${file_path}
docker stop postgresql
docker rm postgresql
firewall-cmd --add-port=5432/tcp --permanent --zone=public
firewall-cmd --reload

DATA_PATH=${file_path}/postgres-data

if [ ! -d "$DATA_PATH" ]; then
echo "Create dir ${DATA_PATH} "
mkdir "$DATA_PATH"
fi

DATA_BACKUP_PATH=${file_path}/postgres-backup

if [ ! -d "$DATA_BACKUP_PATH" ]; then
echo "Create dir ${DATA_BACKUP_PATH} "
mkdir "$DATA_BACKUP_PATH"
fi

docker run --name postgresql \
--restart always \
-v vsphereVolume10gb@cw_m4_sas_datastore:/var/lib/postgresql/data \
-v vsphereVolume10gb@cw_m4_sas_datastore:/postgres-backup \
-p 5432:5432 \
-e PGDATA=/var/lib/postgresql/data/db-files/ \
-e POSTGRES_USER=centos \
-e POSTGRES_PASSWORD=your_password \
-d docker.ascs.tech/public/postgres:9.6.2 \
postgres -c max_connections=500

[root@t2 server]

验证过程:

在t2上启动 /var/server/start-postgres-docker.sh

打开DBschema 获取其他可以连接数据库的工具  或手动 在命令打入,随便创建一个表格:

插入少量数据。

提交成功后,查询一下,确认插入成功后,退出。

然后容器.

在t2上执行

docker stop postgresql;docker rm postgresql

在t3上执行:

 /var/server/start-postgres-docker.sh

 

 

 

可以看到,数据确实还在.

 

到此为止, docker 容器使用vsphere volume 成功!

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐