docke07数据存储(docker volume)

docke07数据存储(dokcker volume)

一.引子

本质上docker volume的使用就像我们的设备挂载到目录,方便调用。
大家有没有想过docker如何存储文件的,当我们清理掉容器的时候我们是不是将容器的数据全部删除了呢?让我们带着这两个问题进入我们docker volumn的学习吧。

二.docker volumn的基本原理

(一).docker数据的储存方式

Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的读写层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 是有持久化存储数据的需求的。

(二).docker持久化存储数据的两种方式

Docker的数据持久化主要有两种方式:bind mount,volume
Docker的数据持久化即使数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。此处不做两者的具体探讨,bind mount不能出现在dockerfile文件中,我们本章重点在doker volumn上

(三).docker volume的使用

一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:

三.docker volume的实验搭建

(一)docker volumn的使用(docker volume/dockerfile)

data volime(数据卷)
1.将容器数据挂载到容器目录上(-v 指定容器内目录)

#查看容器的volume
[root@localhost ~]# docker inspect web
            "VolumeDriver": "",
            "VolumesFrom": null,
[root@localhost ~]# docker run --name web1 -it -d -v /webapp nginx /bin/bash
2f97a7ff4d6b8a5fef1d8ab0aa759033a9664f89ec1f73a8141722a40e82e899
[root@localhost ~]# docker inspect web1
"Source": "/var/lib/docker/volumes/4bb5f394088f83ec7252b3756a5596363954e5f3607a2f642259adb805ec2795/_data",
"Destination": "/webapp",
使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 webapp 目录了:
[root@localhost ~]# docker exec -it web1 /bin/bash
root@2f97a7ff4d6b:/# ls
media  opt  root  sbin  sys  usr  webapp
在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了

2.将主机目录挂载到容器目录上

[root@localhost _data]# docker run --name web -it -v /var/lib/docker/:/webapp nginx
[root@localhost ~]# docker exec -it web /bin/bash
root@5b53dc3e58e8:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr  webapp
root@5b53dc3e58e8:/# cd webapp/
root@5b53dc3e58e8:/webapp# ls
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。
其实这种形式和第一种没有本质的区别,容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标。

但还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录

(二).docker volume 在容器之间的共享(data container)

1.授权一个容器访问另一个容器的Volume(-volumes-from)

[root@localhost ~]# docker run --name web1 -it -d --volumes-from web nginx /bin/bash
0351b25c4326120121b161b042eefdfcd51cff3d714102bb85f11dd510bbf8b1
[root@localhost ~]# docker exec -it web1 /bin/bash
root@0351b25c4326:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr  webapp
root@0351b25c4326:/# cd webapp/
root@0351b25c4326:/webapp# ls
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
#web与web1容器都有同一个webapp目录且内容一致

2.data container(数据容器)
如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。

#创建数据容器
[root@localhost ~]# docker run --name web2 --volumes-from web-back -d nginx
5e570fc965c8111504e133754952d0149449bfe7fae620ecd59b84f27cc636aa
#启动一个进程容器
[root@localhost ~]# docker create -v /dbdata --name web-back nginx
9aabd47c77e613a50503c86bded74bc461431907a845f5859a124314f66aa0e8
#查看挂载
[root@localhost ~]# docker inspect web2
    "Mounts": [
            {
                "Type": "volume",
                "Name": "e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257",
                "Source": "/var/lib/docker/volumes/e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257/_data",
                "Destination": "/dbdata",

使用数据容器的两个注意点:
不要运行数据容器,这纯粹是在浪费资源。
不要为了数据容器而使用“最小的镜像”,只使用数据库镜像本身就可以了。你已经拥有该镜像,所以并不需要占用额外的空间。

(三).删除volume(docker rm -v )

1.删除单个容器

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               4bb5f394088f83ec7252b3756a5596363954e5f3607a2f642259adb805ec2795
local               541ef21c50a18308810d0181f391b448ac3de725a036b5a75f38137f0a5fdb90
local               761acd39018a07351bafecd3e5c47ee9566189fba5e78ccc4767e4edd3f6cd65
local               862f8ff76db3c668eca95f8a0f7ca8c26f9876d5dbefdf940faa406194add5ac
local               c8673d44b27e9b3d668dec202fb356aa3ae90cae6a1deebae01f3c8e294cf2ea
local               e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257
[root@localhost ~]# docker rm -vf web5
web5
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               4bb5f394088f83ec7252b3756a5596363954e5f3607a2f642259adb805ec2795
local               541ef21c50a18308810d0181f391b448ac3de725a036b5a75f38137f0a5fdb90
local               761acd39018a07351bafecd3e5c47ee9566189fba5e78ccc4767e4edd3f6cd65
local               c8673d44b27e9b3d668dec202fb356aa3ae90cae6a1deebae01f3c8e294cf2ea
local               e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257

(2). 批量删除孤单 volumes
使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理

[root@localhost ~]# docker volume ls -qf dangling=true
4bb5f394088f83ec7252b3756a5596363954e5f3607a2f642259adb805ec2795
541ef21c50a18308810d0181f391b448ac3de725a036b5a75f38137f0a5fdb90
761acd39018a07351bafecd3e5c47ee9566189fba5e78ccc4767e4edd3f6cd65
c8673d44b27e9b3d668dec202fb356aa3ae90cae6a1deebae01f3c8e294cf2ea
e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257
[root@localhost ~]# docker volume rm $(docker volume ls -qf dangling=true)
4bb5f394088f83ec7252b3756a5596363954e5f3607a2f642259adb805ec2795
541ef21c50a18308810d0181f391b448ac3de725a036b5a75f38137f0a5fdb90
761acd39018a07351bafecd3e5c47ee9566189fba5e78ccc4767e4edd3f6cd65
c8673d44b27e9b3d668dec202fb356aa3ae90cae6a1deebae01f3c8e294cf2ea
e9e73264cfad542c3d0eb37222157b76010b8a4d58fcb06baf554d5287f36257
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
即使用以上两种命令,也只能删除没有容器连接的Volume。连接到用户指定主机目录的Volume永远不会被docker删除。

四.小结:

1.容器内的数据是临时性的,它会随着容器生命周期的结束而消失
2.默认的 Docker volume 不管是哪种形式,本质上都是将容器所在的主机上的一个目录 mount 到容器内的一个目录,因此,它不具备可移植性。

关于docker持久化存储的内容主要给大家介绍了docker volume的使用和管理,基本内容还是很齐全的。感谢大家阅读。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值