Docker容器的数据卷

数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件 UFS,为一个或者多个容器提供访问。
设计目的: 在于数据的永久化,它完全独立于容器的生命周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引起的数据卷进行处理。

特点:

  • 数据卷在容器启动时初始化,如果容器使用的镜像再挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
  • 数据卷可以在容器之间共享和重用
  • 可以对数据卷里的内容直接进行修改修
  • 数据卷的变化,不会影响镜像的更新
  • 卷会一直存在,即使挂载数据卷的容器已经被删除

数据卷的使用

为容器添加数据卷

docker run -it -v ~/datavolume:/data 2010jing/web /bin/bash

root@d32e282e6523:/# cd data/
root@d32e282e6523:/data# ls
root@d32e282e6523:/data# touch c1
root@d32e282e6523:/data# echo "hello world" > c1
root@d32e282e6523:/data# cat c1
hello world
root@d32e282e6523:/data# hejing@learning:~$ ls
data        Desktop    Downloads         get-docker.sh  mysite    Projects  Templates  web1
datavolume  Documents  examples.desktop  Music          Pictures  Public    Videos
hejing@learning:~$ cd datavolume/
hejing@learning:~/datavolume$ ls
c1
hejing@learning:~/datavolume$ cat c1
hello world
hejing@learning:~/datavolume$

在容器中创建文件 c1 并且写入数据,

// 进入后台守护进程
CTRL + P
CTRL + Q

在容器外,的datavalumne 中同时也能看到c1,并且也有相同数据。

为数据卷添加访问权限

docker run -it -v ~/datavolume:/data:ro 2010jing/web /bin/bash
root@4b6a4e69bfdc:/# touch data/c2
touch: cannot touch 'data/c2': Read-only file system
root@4b6a4e69bfdc:/#

使用Dockerfile构建包含数据卷的镜像
Dockerfile指令:

VOLUME ['/datavolume1','/datavolume2']
cmd /bin/bash

构建镜像

sudo docker build -t 2010jing/dvt .

创建容器

hejing@learning:/dockerfile/dvt$ docker run -it --name dvt3 2010jing/dvt
root@9ede358d8d83:/# ls
bin  boot  datavolume1  datavolume2  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@9ede358d8d83:/#

可以看到,创建容器同时也创建了 datavolume1 datavolume2。


使用数据卷容器
挂载方法:

docker run --volumes-from [CONTAINER_NAME]

创建 容器 dvt4, 并且在 datavolume1 内写入内容 "test3" 到一个文件 c4 内。

hejing@learning:~$ docker run -it --name dvt4 2010jing/dvt
root@19ce80a5dc75:/# ls
bin  boot  datavolume1  datavolume2  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@19ce80a5dc75:/# cd datavolume1
root@19ce80a5dc75:/datavolume1# ls
root@19ce80a5dc75:/datavolume1# echo "test3" > c4
root@19ce80a5dc75:/datavolume1# ls
c4
root@19ce80a5dc75:/datavolume1# cat c4
test3
root@19ce80a5dc75:/datavolume1# exit
exit

新建一个容器dvt5, 并且使用 --volumes-from

hejing@learning:~$ docker run -it --name dvt5 --volumes-from dvt4 2010jing/dvt
root@adf81690923b:/# ls
bin  boot  datavolume1  datavolume2  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@adf81690923b:/# cd datavolume1/
root@adf81690923b:/datavolume1# ls
c4
root@adf81690923b:/datavolume1# cat c4
test3
root@adf81690923b:/datavolume1#

可以看到 数据c4 已经存在于 容器 dvt5 内的 datavolume1 内,并且内容与 容器的 dvt4 的 一致。


Docker数据卷的备份和还原

备份

启动一个新容器来执行压缩命令

hejing@learning:~$ docker run --volumes-from dvt5 -v ~/backup:/backup --name dvt6 2010jing/dvt tar cvf /backup/dvt5.tar /datavolume1 /datavolume2
tar: Removing leading `/' from member names
/datavolume1/
/datavolume1/c4
/datavolume2/
hejing@learning:~$ ls backup/
dvt5.tar
hejing@learning:~$

还原

首先启动一个新容器 backcontainer

hejing@learning:~$  docker run -v /datavolume1 /datavolume2 -it --name backcontainer 2010jing/web

再执行一个新容器来执行恢复数据命令


hejing@learning:~$ docker run --volumes-from backcontainer -v ~/backup:/backup 2010jing/dvt tar -xvf /backup/dvt5.tar
datavolume1/
datavolume1/c4
datavolume2/
hejing@learning:~$ docker start -i backcontainer
root@2c3b63a33c35:/# ls
bin  boot  datavolume1  datavolume2  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@2c3b63a33c35:/# cd datavolume1/
root@2c3b63a33c35:/datavolume1# ls
c4
root@2c3b63a33c35:/datavolume1# cat c4
test3
root@2c3b63a33c35:/datavolume1#

可以看到在容器 container 中已经恢复了数据。

你可能感兴趣的:(Docker容器的数据卷)