(对docker感兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个docker爱好者群组里面。)
到目前为止,我们已经介绍了docker的一些基本概念,如:容器的操作,镜像的操作和网络的操作等。在本节,我们将介绍如何管理容器内部的数据,以及容器间的数据交互。我们将介绍如何创建:
数据卷
数据型容器
数据卷是一个经过特殊设计的文件夹,提供给容器使用。数据卷并不由unionfs管理,因此数据卷可以用作持久化和数据分享,它具有以下特性:
数据卷在容器创建的时候进行初始化。如果容器的镜像在特定的mount点下有数据,那么已有的数据将被拷贝到指定目录。
数据卷可以在容器间共享和复用
对数据卷的改变是直接操作,不会回滚。
当你更新镜像时,数据卷的改变不会被保存。
即使容器被删除了,数据卷也不会丢失。
因此,数据卷是用来持久化数据的,跟容器本身的生命周期是无关的。docker删除容器的时候,不会自动删除数据卷,因此当你使用数据卷的时候也要注意不要产生过多的垃圾数据。
数据卷是通过-v来指定的,在docker create和docker run的时候可以使用多个-v参数,指定多个数据卷。
这条命令在创建容器时,会创建一个/webapp目录。 注意:我们也可以通过volume指令在dockerfile中指定需要mount的数据卷。 默认情况下,数据卷是可读可写的,但是你也可以设置为只读:
其中source是文件系统在主机上的地址(注意这个地址是随机分配的,因此一定要注意垃圾回收),destination是容器中的地址。
通过-v我们可以给容器添加一个随机的数据卷,但是这种卷是不好控制的,因此我们可以mount一个本地文件夹作为数据卷。
上面这条命令,我们将本地的/src/webapp映射到了容器的/opt/webapp目录。由于将主机的文件系统映射到了容器中,因此容器有了主机的完全访问权限,因此一定要注意安全。
-v参数除了可以mount文件夹,还可以做文件的映射。比如:
这条命令,将把主机的~/.bash_histroy映射到容器中,因此主机和容器可以共享bash命令的历史数据。如果将~/.bash_profile映射进去,那就可以共享bash的配置。
如果你希望在容器间共享卷,那么就可以使用数据型容器。我们可以先创建一个命名容器:
接下来,我们通过--volumes-from选项来进行数据卷的复用:
然后再建一个容器:
之后我们就可以在db1和db2中同时对/dbdata进行操作了。
我们可以通过下面的命令进行数据备份:
--volumes-from将把dbdata容器的数据卷mount到当前容器;
-v 将当前目录映射到/backup目录
tar命令将/dbdata打包
接下来,我们可以对容器进行数据恢复:
通过上面的操作,我们就可以自动备份、还原和迁移数据了。
由于数据卷的共享,会出现多个容器同时写一个卷的情况,因此可能会导致数据丢失,这里面一定要特别注意。可以采取一定的同步机制来保证数据的一致性。