博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker 第六章 存储卷
阅读量:5221 次
发布时间:2019-06-14

本文共 4382 字,大约阅读时间需要 14 分钟。

Docker volume 的几种形态

有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。

 

  不使用 Docker volume

默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。

  

  Data volume (数据卷)

 

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

  (1)使用 “-v 容器内目录” 形式

[root@localhost ~]# docker run -dit --name v1 -v /test_data busyboxca436842125042039399e9b8c5854d1e45e27c9798f4f4547749f6f07593643e[root@localhost ~]#

  

"Mounts": [           -v /test_data 在docker 容器中创建一个 test_data 目录并且通过联合文件系统将docker 自动创建的目录挂在到一起,我理解相当于容器和宿主机文件目录的互相映射            {                "Type": "volume",                "Name": "16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45",                "Source": "/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data",                "Destination": "/test_data",                "Driver": "local",                "Mode": "",                "RW": true,                "Propagation": ""            }        ],

  

[root@localhost ~]# docker exec -it ca4368421250 sh/ # lsbin        etc        proc       sys        tmp        vardev        home       root       test_data  usr/ #

 

其实,在busybox  容器被删除后,/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了

  

使用 -v 来挂载一个主机上的目录到容器的目录  

#format :    -v host_file:docker_faile
[root@localhost /]# docker run -it --name v2 -v /boot:/boot busybox/ # lsbin   boot  dev   etc   home  proc  root  sys   tmp   usr   var/ # cd boot/boot # lsSystem.map-3.10.0-957.el7.x86_64config-3.10.0-957.el7.x86_64efigrubgrub2initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.imginitramfs-3.10.0-957.el7.x86_64.imginitramfs-3.10.0-957.el7.x86_64kdump.imgsymvers-3.10.0-957.el7.x86_64.gzvmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389vmlinuz-3.10.0-957.el7.x86_64

  

使用 data container

如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:创建一个 data container:
#format  :  --volumes-from v2   #继承某个容器的卷文件
[root@localhost boot]# docker run -it --name v3 --volumes-from v2 busybox/ # / # lsbin   boot  dev   etc   home  proc  root  sys   tmp   usr   var/ # ls /bootSystem.map-3.10.0-957.el7.x86_64config-3.10.0-957.el7.x86_64efigrubgrub2initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.imginitramfs-3.10.0-957.el7.x86_64.imginitramfs-3.10.0-957.el7.x86_64kdump.imgsymvers-3.10.0-957.el7.x86_64.gzvmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389vmlinuz-3.10.0-957.el7.x86_64

  

使用 docker volume 命令

[root@localhost boot]# docker volume --helpUsage:	docker volume COMMANDManage volumesCommands:  create      Create a volume  inspect     Display detailed information on one or more volumes  ls          List volumes  prune       Remove all unused local volumes  rm          Remove one or more volumesRun 'docker volume COMMAND --help' for more information on a command.[root@localhost boot]#

Docker 新版本中引入了 docker volume 命令来管理 Docker volume。

(1)使用默认的 ‘local’ driver 创建一个 volume

[root@localhost boot]# docker volume create --name vollvoll[root@localhost boot]# docker volume inspect voll[    {        "CreatedAt": "2019-06-12T22:58:45-04:00",        "Driver": "local",        "Labels": {},        "Mountpoint": "/var/lib/docker/volumes/voll/_data",        "Name": "voll",        "Options": {},        "Scope": "local"    }][root@localhost boot]#

使用这个 volume

[root@localhost _data]# docker run -it --name v6 -v voll:/volume busybox/ # lsbin     dev     etc     home    proc    root    sys     tmp     usr     var     volume/ # cd volume//volume # ls1qaz/volume #

  

可以使用 docker rm -vf 命令在删除容器时删除该容器的卷。

 

[root@localhost /]# docker volume ls   #强制删除容器和卷文件DRIVER              VOLUME NAMElocal               d8a9ddb3f7ce482f170b88485b1f5802a9437c0921daf5e77ab170a18bf4ad4e[root@localhost /]# docker rm -vf v1v1[root@localhost /]# docker volume lsDRIVER              VOLUME NAME[root@localhost /]# docker container ls -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES[root@localhost /]#

  

 

github 上有很多脚本可以自动化地清理孤单卷,比如:

  

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/zy09/p/11015035.html

你可能感兴趣的文章
Python-Mac 安装 PyQt4
查看>>
实验2-2
查看>>
String,StringBuffer与StringBuilder的区别?? .
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
服务器被疑似挖矿程序植入107.174.47.156,发现以及解决过程(建议所有使用sonatype/nexus3镜像的用户清查一下)...
查看>>
JQuery 学习
查看>>
session token两种登陆方式
查看>>
IntelliJ IDEA 12集成Tomcat 运行Web项目
查看>>
java,多线程实现
查看>>
个人作业4-alpha阶段个人总结
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>