11: docker存储之 数据卷以及数据卷容器

在使用容器的过程中,我们可能需要共享数据:

  1. 共享本地主机数据到容器;

  2. 共享容器数据到另一个容器。

Docker里的数据卷及数据卷容器恰好满足了这个需求。

1 数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录,它提供了很多有用的特性:

  • 对数据卷的修改会立马生效

  • 数据卷会一直存在,直到没有容器使用

  • 数据卷可以被多个容器使用

  • 数据卷数据改变不会被包含在容器中。

数据卷类似于Linux的mount。

1  :创建或运行容器的时候,使用-v创建一个数据卷,多次使用-v可以创建多个数据卷。

$ sudo docker run --name data -v /data -t -i ubuntu:14.04 /bin/bash
# 创建数据卷绑定到到新建容器,新建容器中会创建 /data 数据卷,然后容器会往里面写数据,其他容器可以从这个目录里读取数据。
# ls -ld /data/
drwxr-xr-x 2 root root 4096 Jul 23 06:59 /data/
# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
... ...
              ext4     91G  4.6G   82G   6% /data

创建的数据卷可以通过docker inspect获取宿主机对应路径

$ sudo docker inspect data
... ... "Volumes": { "/data": "/var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9" }, # 可以看到创建的数据卷宿主机路径 ... ...

或者直接指定获取

$ sudo docker inspect --format="{{ .Volumes }}" data
map[/data: /var/lib/docker/vfs/dir/151de401d268226f96d824fdf444e77a4500aed74c495de5980c807a2ffb7ea9]
2 挂载宿主机目录为一个数据卷

-v选项除了可以创建卷,也可以挂载当前主机的一个目录到容器中。

$ sudo docker run --name web -v /source/:/web -t -i ubuntu:14.04 /bin/bash
冒号前面为主机绝对地址,后面为容器绝对地址,
挂载主机目录有什么用?
1)容器启动之后可以,进入交互界面对这里面的数据做一些操作,或者 把本地一些目录挂在上去 用于存放 容器里的服务 产生的数据。
方便在本地查看。 例如日志目录,本地创建好,然后挂载上去。
2)把本地数据传输到容器中,方便容器使用。

   
   
-i 进入交互命令行,以下命令都是在容器里执行的
bash-4.1# ls -ld /web/
drwxr-xr-x 2 root root 4096 Jul 23 06:59 /web/
bash-4.1# df -Th
... ...
              ext4     91G  4.6G   82G   6% /web
bash-4.1# exit 

默认挂载卷是可读写的,可以在挂载时指定只读

$ sudo docker run --rm --name test -v /source/:/test:ro -t -i ubuntu:14.04 /bin/bash

2 数据卷容器

如果你有一些持久性的数据并且想在容器间共享,或者想用在非持久性的容器上,最好的方法是创建一个数据卷容器,然后从此容器上挂载数据。

创建数据卷容器

$ sudo docker run -t -i -d -v /test --name test ubuntu:14.04 echo hello
启动的时候把数据写到这个目录下。
 

使用--volumes-from选项在另一个容器中挂载 /test 卷。不管 test 容器是否运行,其它容器都可以挂载该容器数据卷,当然如果只是单独的数据卷是没必要运行容器的。

$ sudo docker run -t -i -d --volumes-from test --name test1 ubuntu:14.04 /bin/bash

添加另一个容器

$ sudo docker run -t -i -d --volumes-from test --name test2 ubuntu:14.04 /bin/bash

也可以继承其它挂载有 /test 卷的容器

$ sudo docker run -t -i -d --volumes-from test1 --name test3 ubuntu:14.04 /bin/bash

非常详细的 Docker 学习笔记


3 备份、恢复或迁移数据卷

备份
$ sudo docker run --rm --volumes-from test -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/test.tar /test
tar: Removing leading `/' from member names
/test/
/test/b
/test/d
/test/c
/test/a

启动一个新的容器并且从test容器中挂载卷,然后挂载当前目录到容器中为 backup,并备份 test 卷中所有的数据为 test.tar,执行完成之后删除容器--rm,此时备份就在当前的目录下,名为test.tar。

$ ls # 宿主机当前目录下产生了 test 卷的备份文件 test.tar test.tar
恢复

你可以恢复给同一个容器或者另外的容器,新建容器并解压备份文件到新的容器数据卷

$ sudo docker run -t -i -d -v /test --name test4 ubuntu:14.04  /bin/bash $ sudo docker run --rm --volumes-from test4 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/test.tar -C / # 恢复之前的文件到新建卷中,执行完后自动删除容器 test/ test/b test/d test/c test/a

8.4 删除 Volumes

Volume 只有在下列情况下才能被删除:

  • docker rm -v删除容器时添加了-v选项
  • docker run --rm运行容器时添加了--rm选项

否则,会在/var/lib/docker/vfs/dir目录中遗留很多不明目录。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值