云计算Docker之数据管理篇

经过之前基础篇、镜像容器以及私有仓库管理,今天我们一起来看看Docker数据管理。对于基于内核的虚拟容器启动成功之后,它肯定使用的是宿主机的磁盘空间。我们需要面对的一个问题时,如果容器停止或者删除时,数据也随之灰飞烟灭了。比如一些运行着MySQL的容器,数据安全性难有保障。我们怎么解决这个问题呢?

容器<->宿主机:挂载到宿主机目录

对于上面提到的问题,我们可以利用容器迁移将容器备份为镜像,这样是可以保存数据下来,但这难免有些不现实。那么,我们采用的方案是:当虚拟容器启动时,我们指定一个宿主机目录去挂载在其系统下。这样,具体操作如下:

mkdir /data #因为虚拟机测试,我分区时没有特意去划/data分区
echo putty.biz /data/1
docker run -itd --name centos_data_test -v /data/:/centos centos bash #-v就是指定挂载的目录,冒号左边是宿主机目录,右边是容器添加的挂载点
docker ps #确保启动成功
docker exec -it centos_data_test bash #进入容器shell
[root@e9ed2801798f /]# df -h #查看容器磁盘分区,可以看到有个主分区挂载点是我们之前指定的/centos
[root@e9ed2801798f /]# ls /centos
[root@e9ed2801798f /]# cat /centos/1
[root@e9ed2801798f /]# touch /centos/2
ls /data/2

现在,不管我们是停止还是删除docker容器,数据依然存在。那么,我们每次新建都需要去-v? 试想,我们做负载均衡的时候,是否有一个方式让所有负载均衡的虚拟容器都去复制第一台设置的数据目录挂载?

容器<->容器:数据卷挂载

在docker里,我们称之为数据卷挂载,它实现了容器间的数据共享。如下:

docker run -itd --volumes-from centos_data_test centos bash #这一次我没有用--name去指定容器名称,那么将会是随机名。
docker ps #确定新容器启动成功,并获取容器ID
docker exec -it 6a312f777d17 bash #进入新容器
[root@6a312f777d17 /]# df -h
[root@6a312f777d17 /]# cd /centos
[root@6a312f777d17 /]# ls
[root@6a312f777d17 /]# cat 1

<->容器<->容器<->容器:数据卷挂载

结合以上两点,我们可以单独运行一个容器,然后安装上合适得服务(例如:NFS),专门用来给一组容器共享数据。

docker run -itd -v /datacenter/ --name centos_datacenter centos bash
docker ps
docker exec -it centos_datacenter bash
[root@39b47e23333e /]# ls /datacenter
[root@39b47e23333e /]# exit
docker run -itd --volumes-from centos_datacenter --name centos_test centos bash
docker exec -it centos_test bash
[root@0fb79343d12d /]# mkdir /datacenter/{1,2}
[root@0fb79343d12d /]# exit
docker exec -it centos_datacenter bash
[root@39b47e23333e /]# ls /datacenter/
[root@39b47e23333e /]# exit

这样的架构,我们必须保护好centos_datacenter容器的数据卷/datacenter,这就意味着合适得备份和还原是必不可少的。

容器数据卷的备份与还原操作


mkdir /datacenter_backup
docker run -itd --name centos_with_backup --volumes-from centos_datacenter -v /datacenter_backup/:/backup centos bash
docker exec -it centos_with_backup bash
[root@2a99573e5cd8 /]# tar cf /backup/data_bk.tar /data/
[root@2a99573e5cd8 /]# ls /backup/
[root@2a99573e5cd8 /]# exit
ls /datacenter_backup #宿主机也可以看到备份文件

下面看看还原操作,我们假设不小心删除了上面的centos_datacenter和centos_with_backup,亦或它们都出现了问题。

docker run -itd -name centos_datacenter_new -v /datacenter/ centos bash
docker run -itd --name centos_new --volumes-from centos_datacenter_new -v /datacenter_backup/:/backup centos tar -xf /backup/data.tar

因为我们的数据都还存在于宿主机的/datacenter_backup目录下,所以我们直接新建两台删除或被损坏的容器,然后直接解压备份的tar打包文件即可。