docker 数据卷管理

docker 数据卷管理

 

用户在使用dokcer的过程中,往往需要能查查看容器内应用产生的数据,或者需要把容器内容的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据数据管理操作。

容器中管理数据主要有两种方式:

  • 数据卷(data Volumes)
  • 数据卷容器(Dota volume Dontainers)

 

本章将首先如何在容器内创建数据卷,并且把本地的目录或文件挂载导容器内的数据卷中。

接下来,会介绍如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和回复。

数据卷

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用。
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像。
  • 卷会一直存在,直到没有容器使用。

数据卷的使用,类似于Linux下对目录或文件进行mount操作。

在容器内创建一个数据卷

 

在用docker run 命令的时候,使用-v标记可以在容器内创建一个数据卷。多次使用-v标记可以创建多个数据眷

下面使用centos:7镜像创建一个容器,并创建一个数据卷挂载到容器的/webapp目录

[root@docker ~]# docker run -d -P --name web01 -v /webapp/ centos:7 bash
7e0d4039a449aff04b38e969af9e4a18d4567b988c7e421c86150c5830bfd711

注意:

-P是允许外部访问容器需要暴露的端口。

挂载一个主机目录作为数据卷

使用-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷:

[root@docker ~]# docker run -itd --name web02 -v /webapp/:/webapp/ centos:7 bash
4a31852676dd817caf005be274b9a3b6986e6422c2206bb24c10170f26a0ed5c

 

上面的命令加载主机的/webapp目录到容器的/webapp目录:

这个功能在进行测试的时候十分方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器内运行和使用。另外,本地的路径必须是绝对路径,如果目录不存在,docker会自动创建

docker挂载数据卷的默认权限读写(rw),用户也可以通过,ro指定为只读:

[root@docker ~]# docker run -it -P --name web04 -v /webapp/:/opt/:ro centos:7 bash
[root@032568228a06 /]# ifco

加了:ro之后,容器内挂载的数据卷的数据就无法修改了。

挂载一个本地主机文件作为数据卷

-v标记也可以从主机挂载单个文件到容器中作为数据卷:

[root@docker ~]# docker run --rm -it -v /root/.bash_history:/.bash_history centos:7 /bin/bash
[root@1924ed898d94 /]# 

 

这样就可以记录容器输入过的命令历史。

注意:

如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或sed --in-place的时候,可能会造成文件innode的改变,这会导致错误信息。所以推荐的方式是直接挂载文件所在目录。

 

数据卷容器

如果用户需要在容器之间共享一些持续更新的数据,最简单方法是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用方法如下。

首先,创一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdaya:

[root@docker ~]# docker run -it -v /dbdata --name dbdata centos:7 
[root@46a65daa69b8 /]#   

查看/dbdata目录

[root@46a65daa69b8 /]# ls  
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

然后,可以在其他容器中使用-volumes-from来挂载dbdata容器中大数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

[root@docker ~]# docker run -it --volumes-from dbdata --name db1 centos:7 
[root@docker ~]# docker run -it --volumes-from dbdata --name db2 centos:7 

 

此时,容器db1和db2都挂载同一个数据卷到相同/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。

例如,dbdata容器中创建一个test文件

结果如下图

docker 数据卷管理

在db2内查看它:

[root@docker ~]# docker run -it --volumes-from dbdata --name db2 centos:7
[root@d2388d7676a6 /]# ls
anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@d2388d7676a6 /]# cd dbdata/
[root@d2388d7676a6 dbdata]# ls
test.txt

可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷:

docker run -d --name db3 --volumes-from db1 centos:7 bash

注意

使用--volumes-from参数所挂挂载数据卷的容器自身并不需要保持运行状态。

使用删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载它的容器时显示使用docker rm -v命令来指定同时删除关联的容器。

使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷。具体的操作将在下一节中进行讲解。

 

利用数据卷迁移数据

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份

使用下面的命令来备份dbdata数据卷容器的数据卷:

[root@docker opt]# docker run -itd --volumes-from db -v $(pwd):/backup --name worker2 centos:7 bash
3600e8db61135a5aedfc4724bf125950b5d5b6174d460500011c046a4944369d

 

这个命令稍微有点复杂,具体分下。

首先利用centos镜像创建一个容器为woker。使用--volumes-form db参数来让worker容器挂载到db容器的数据卷(即db数据卷);使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器中的/backup目录。

worker容器启动后,使用tar xf /backup/backup.tar /db命令来将/dbdata下内容备份为容器内的/backup/backup.tar,宿主机当前目录下的backup.tar.

恢复

如果恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器db2

docker run -v /db --name db2 centos:7 /bin/bash

然后创建另一个新的容器,挂载db的容器,并使用centos7untar解压备份文件到所挂载的容器卷中即可:

docker run --volumes-from db -v $(pwd):/backup bash tar xvf /backup/backup.tar

 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
百度已收录
Linux

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: