Docker中的数据卷及数据卷容器


前言

在生产环境中使用Docker的时候,往往要在多个容器中进行数据共享,这就涉及到了容器的管理操作。而在Docker中,有两种数据管理的方法,就是下面将要介绍的数据卷及数据卷容器。


一、数据卷

1.什么是数据卷

数据卷是一个可供容器用的一个目录,实在本地宿主机上创建的,可以挂载到所有的容器中。

2.创建数据卷(volume create)

命令格式:

docker volume create [OPTIONS] [VOLUME]

Options:
-d, --driver string 指定卷驱动程序名称
–label list 设置卷的元数据
-o, --opt map 设置驱动程序特定选项

这里来试一下:

[root@localhost ~]# docker volume create vltest
vltest
[root@localhost ~]# ls /var/lib/docker/volumes/
metadata.db  vltest/      
[root@localhost ~]# ls /var/lib/docker/volumes/vltest/
_data
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               vltest

创建出来的数据卷,位于宿主机/var/lib/docker/volumes/
除此之外,volume下还支持其余子命令来管理卷,下载来一起说一下,格式:

docker volume COMMAND

Commands:
create 创建一个卷
inspect 显示一个或多个卷的详细信息
ls 列出卷
prune 删除所有未使用的本地卷
rm 删除一个或多个卷

3.挂载数据卷

当我们需要在容器内挂载数据卷时,一般都是在创建容器run时添加-v选项
例如将本地/app目录挂载到容器内的/下,一般来说,用绝对路径即可。

docker run -it -d -v 本地目录:容器内目录 镜像iD
docker run -it -d -v /app:/ 镜像iD
docker run -it -d -v /app:/:ro 镜像iD   **默认权限是读写(rw),这样的话 是只读(ro)**

我是不太喜欢用数据卷的,以为如果是只挂载一个文件时,若用vi修改的时候,可能会造成文件inode的改变,所以推荐是直接挂载文件所在的目录到容器内,这也是我为什么用数据卷容器多的原因。

二、数据卷容器

1.什么是数据卷容器

数据卷容器其实也是容器,只不过他的作用就只是用在来提供数据卷供其他容器进行挂载。一般来说,这种情况更适合于要在多个容器之间共享一些数据来使用。

2.数据卷容器的创建及挂载

上面说了,所谓的是数据卷容器,其实就是个容器,单纯的做一个数据卷容器来供别人来挂载的。下面将示例一下数据卷容器的挂载及创建,可以看到示例依靠run命令,所以平时要多实践一下docker run --help看看,多练多了解下子命令,

[root@localhost ~]# docker images            #查看本地镜像,
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newnginx            newtar              4bb46517cac3        4 weeks ago         133MB
nginx               1.19.2              4bb46517cac3        4 weeks ago         133MB
centos              centos7.3.1611      c5d48e81b986        18 months ago       192MB
[root@localhost ~]# docker run -it -d -v /data --name data c5
24afaab595ad86f0c0d7dc82b6e9f7d5044c3d510793c89626e318679eaaf41f
[root@localhost ~]# docker ps   
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
24afaab595ad        c5                  "/bin/bash"              12 seconds ago      Up 11 seconds                           data
[root@localhost ~]# docker attach 24        #进入容器
[root@24afaab595ad /]# ls               #可以看到/data目录已经被创建了
anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@24afaab595ad /]# cd data/
[root@24afaab595ad data]# touch test.txt
[root@24afaab595ad data]# mkdir testdir
[root@24afaab595ad data]# ls
test.txt  testdir

然后可以创建两个新的容器,通过--volumes-from来挂载数据卷

[root@localhost ~]# docker run -it -d --volumes-from 24 --name db1 c5
24f24c01b5b3040e83831ab9fb00398f570023b566f8f8fffeb4396104f19b87
[root@localhost ~]# docker run -it -d --volumes-from 24af --name db2 c5
22a8b32cf265067a604f1067b917bbee47ec9dd5731180ce5e37377fc53b443c
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
22a8b32cf265        c5                  "/bin/bash"              40 seconds ago      Up 39 seconds                           db2
24f24c01b5b3        c5                  "/bin/bash"              2 minutes ago       Up 2 minutes                            db1
24afaab595ad        c5                  "/bin/bash"              10 minutes ago      Up 10 minutes                           data

进入db1看看挂载的数据卷,可看到跟数据卷容器内文件是相同的

[root@localhost ~]# docker attach db1
[root@24f24c01b5b3 /]# ls
anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@24f24c01b5b3 /]# ls data/
test.txt  testdir

如果删除了挂载的容器(包括 data db 1和 db2 ),数据卷并不会被自动删除 如果删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v命令来指定同时删除关联的容器。这里有一点要注意,使用 --volumes-from所挂载数据卷的容器并不需要保持在运行状态下。
同时,使用数据卷容器可以自由的更新和移动数据卷,这也是我为什么喜欢用数据卷 容器的第二原因。

三、数据卷容器对数据的操作

1.备份数据

备份数据的原理很简单,但是也有点绕。下面我先贴一下备份data数据卷容器内的数据卷。

docker run --volumes-from data -v /back:/back --name dabaoji c5 tar cvf /back/back.tar /data

我们一点点拆开来看。
首先,我基于c5镜像创建了一个新的名叫dabaoji容器docker run --name dabaoji c5,让他挂载数据卷容器data里的数据卷--volumes-from data,然后做了个跟宿主机做了个目录映射-v /back:/back,容器启动后,将会执行打包命令tar cvf /back/back.tar /data,将包放到了容器内的/back下,即宿主机的/back下。
由于没有加其余参数,这个容器将会在执行完打包命令后自动关闭。

2.恢复数据

恢复的话,就有很多种方式了,比如cp命令发送到容器内,或者新建容器时挂载数据卷容器内的数据卷。这里就不多做赘述了。


总结

数据无价,保护好数据责无旁贷的。数据卷的机制也是如此。这篇介绍了通过数据卷和数据卷容器对容器内的数据进行共享、备份和恢复等操作 ,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可。只要保证数据卷容器不发生故障即可。
当然,在生产环境下,最好将主机本地数据进行备份,或者用分布式文件系统,如NFS。这个云时代,注意定期快照,尽可能的将损失降到最小甚至损失为0,使我们每个运维的职责。
另外,有些时候不希望将数据保存在宿主机或容器中,还可以使用 tmpfs 类型的数据卷,其中数据只存在于内存中,容器退出后自动删除

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值