管理Container中的数据

本章我们将讨论Container中的或者Docker Container之间的数据。

我们有两个基本的方法来管理Docker中数据:

  • Data volumes
  • Data volume container

Data volumes

       data volume在一个或者多个容器中是一个特别设计的目录,它绕过了union file system来提供若干有用的特性来保护或者分享这个些数据:

  •        当Container被创建,volume被初始化。
  •        在Container之间data volume能够被分享和重用。
  •        直接的更改data volume。
  •        data volume的改变不会被包括在image的更新中。
  •        即使Container被删除了,data volume依然存在。

      Data volume被设计与保留数据,与Container生命周期的独立。因此Docker不会自动删除volume,也不会垃圾回收这些不被Container引用的volume,当我删除Container时。


添加data volume

       我们与docker create 和docker run命令一起使用-v 标签,来添加data volume。你可以使用-v 多次,来过挂载多个data volume。在我们的web应用Container中挂载一个单独的volume。

$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
         这将在容器内部创建一个新的volume,在/webapp下。

         注意:你可以在Dockerfile中使用VOLUME指令为从这个image创建的Container附加一个或者多个新的volume。


挂载一个主机目录作为Data Volume

        除了使用-v 标签创建一个新的volume,你也可以使用挂载Docker daemon主机的目录到Container上。

        注意:如果你使用Boot2Docker,你的Docker daemon只被限制访问OSX/Windows文件系统。Boot2Docker尝试自动分享/Users(OSX)或者C:\USers(Windows)目录,那么挂载文件或者目录可以使用docker run -v /Users/<path>:/<container path>...(OSX)或者docker run -v /c/Users/<path>:/<container path>...(Windows)。所有其他来自Boot2Docker虚拟机的文件系统的路径。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
        这将挂载主机目录,将/src/webapp挂载到Container的/opt/webapp下。

        注意:如果/opt/webapp路径已经存在Container的image中,它的内容将被/src/webapp的内容代替,来保持与mount行为一致的结果。

        对于测试这是非常有用,例如我们挂载源代码到Container上,当我们改变了源代码后应该开始工作。主机上的路径必须被指定为绝对路径,如果路径不存在,Docker将自动创建。

        注意:这在Dockerfile中是不可用了,由于为了保障构建image的可移植性和可分享的目的。主机目录由于主机独立、自然的特性,指定在dockerfile的host目录可能不能再所有的主机上工作。

       Docker默认挂载一个可读写的volume,但是也可以挂载一个只读的目录。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
       我们挂载了相同的/src/webapp目录,但是加了ro选项,来指定挂载的目录为只读。


挂载一个主机文件作为Data Volume

        -v 标签可以用于挂载单个文件,在主机上的。

$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
        我们将在新容器中启动bash shell,你将从主机获得你的bash历史记录。当你退出Container时,主机将有你在Container中输入的过的命令。

       注意:许多编辑文件的工作,包括vi和sed --in-place 可能导致索引节点的变化。到Docker v1.1.0,这样做会导致错误,例如“sed:cannot rename ./sedKdJ9Dy:Device or

 resource busy”.在这个例子中,想要修改被挂载的文件,最简单的方式替代挂载的源文件。

 创建和挂载Data Volume Container

          如果想在Container之间分享一些永久保留的数据,或想要使用非持久性的Container,这是一种很好的方式,创建一个名为Data Volume Container,然后挂载数据。

          让我们创建一个带有Volume,用于分享的的新命名Container。当这个Container不在运行应用,重用training/postgres image,以致所有Container使用相同的层,节约磁盘空间。 

$ sudo docker create -v /dbdata --name dbdata training/postgres

         你可以使用--volumes-from标签来挂载/dbdata volume到另外一个Container中。

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
         另外一个:

$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
        你可以使用多个--volumes-from参数来聚集多个来自不同Container的data volume。

        你也可以拓展来自dbdata Container的volume的挂载链,通过挂载db1或者db2 Container挂载到其他Container。

$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
         如果你想要移除挂载volume的Container,包括,初始的dbdata Container或者后续的容器db1和db2,volume不会被删除。为了删除磁盘上的volume,你必须显示在最后一个引用这个Container中使用docker rm -v。这有助于在Container之间,提升或者有效率的移动data volume。

       注意:当移除Container时没有提供-v来删除volume,Docker不会警告我们。如果你移除容器没有使用-v选项,你可能导致“dangling” volume;volume将不再被Container引用。“dangling” volume很难摆脱,占用大量磁盘空间,我们正在为了提高volume管理,你可以在pull request #8484  上检查进度。

备份、还原、移动data volume

        我们使用volume另外一个很重要的功能是备份、还原、移动。我们通过使用--volumes-from标签来创建一个新的Container,挂载了volume,像这样:

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
         这里,我们启动了一个新的Container,挂载来自dbdata的volume。我们挂载了本地主机目录/backup。最后,我们使用了tar命令,备份dbdata volume的内容到我们目录/backup下的backup.tar文件。当这个指令完成,Container停止,将留下dbdata volume的备份。

         你可以还原它到相同的Container,或者其他地方创建的Container。创建一个新Container。

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
         然后,un-tar备份文件,在新的Container的data volume。

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
          你可以使用上面的技术去自动备份、移动、还原测试,通过使用你喜欢的工具。


猜你喜欢

转载自blog.csdn.net/ronggangzhao/article/details/43986467