理解Docker(8):Docker 存储之卷(Volume)
转载于https://www.cnblogs.com/sammyliu/p/5932996.html
1. Docker volume 的几种形态
有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
1.1 无 - 不使用 Docker volume
默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。
1.2 Data volume (数据卷)
一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:
(1)使用 “-v 容器内目录” 形式
docker run -d -P --name web -v /webapp training/webapp python app.py
使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 webapp 目录了:
"Mounts": [{"Name": "f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b","Source": "/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data","Destination": "/webapp","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
其实,在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。
(2)使用 -v 来挂载一个主机上的目录到容器的目录
docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py
主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。
其实这种形式和第一种没有本质的区别,容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标。
(3)使用 -v 来挂载主机上的一个文件到容器内的一个文件
docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
1.3 使用 data container
如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:
创建一个 data container:
docker create -v /dbdata --name dbstore training/webapp /bin/true
启动一个 app container:
docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py
其实,对 web3 这个容器来说,volume 的本质没变,它只是将 dbstore 容器的 /dbdata 目录映射的主机上的目录映射到自身的 /dbdata 目录。
"Mounts": [{"Name": "5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330","Source": "/var/lib/docker/volumes/5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330/_data","Destination": "/dbdata","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
但是,其好处是,可以不管其目录的临时性而不断地重复使用它。
1.4 使用 docker volume 命令
Docker 新版本中引入了 docker volume 命令来管理 Docker volume。
(1)使用默认的 ‘local’ driver 创建一个 volume
root@docker1:/home/sammy# docker volume create --name vol1 vol1 root@docker1:/home/sammy# docker volume inspect vol1 [{"Name": "vol1","Driver": "local","Mountpoint": "/var/lib/docker/volumes/vol1/_data","Labels": {},"Scope": "local"} ]
(2)使用这个 volume
docker run -d -P --name web4 -v vol1:/volume training/webapp python app.p
结果还是一样的,即将 vol1 对应的主机上的目录挂载给容器内的 /volume 目录。
"Mounts": [{"Name": "vol1","Source": "/var/lib/docker/volumes/vol1/_data","Destination": "/volume","Driver": "local","Mode": "z","RW": true,"Propagation": "rprivate"}],
1.5 Volume 删除和孤单 volume 清理
1.5.1 在删除容器时删除 volume
可以使用 docker rm -v 命令在删除容器时删除该容器的卷。
root@docker1:/home/sammy# docker run -d -P --name web5 -v /webapp training/webapp python app.py 69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69 root@docker1:/home/sammy# docker volume ls DRIVER VOLUME NAME local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330 local 838f4dd99721a9445be22a6b42d35e04cb43ad145ecf26107a9025f428587f76 local vol1 root@docker1:/home/sammy# docker rm -vf web5 web5 root@docker1:/home/sammy# docker volume ls DRIVER VOLUME NAME local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330 local vol1
1.5.2 批量删除孤单 volumes
从上面的介绍可以看出,使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理:
root@docker1:/home/sammy# docker volume ls -qf dangling=true 244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236 c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46 f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b root@docker1:/home/sammy# docker volume rm $(docker volume ls -qf dangling=true) 244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236 c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46 f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b root@docker1:/home/sammy# docker volume ls DRIVER VOLUME NAME local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330 local vol1
github 上有很多脚本可以自动化地清理孤单卷,比如:
- https://github.com/chadoe/docker-cleanup-volumes/blob/master/docker-cleanup-volumes.sh
- https://github.com/meltwater/docker-cleanup
1.6 小结
对以上内容的两点小结:
- 容器内的数据是临时性的,它会随着容器生命周期的结束而消失
- 默认的 Docker volume (driver = ‘loclal’)不管是哪种形式,本质上都是将容器所在的主机上的一个目录 mount 到容器内的一个目录,因此,它不具备可移植性。
2. Flocker:容器的分布式存储平台
第一部分提到过,原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。先来看看 Flocker volume 和 Docker 原生 volume 的对比:
启动一个使用 Flocker 卷的容器:
docker run --volume-driver flocker -v flocker-volume:/container/dir --name=container-xyz
它带来的好处包括:
- 容器的数据会被写入 Flocker 后端存储而不是主机上,因此,在主机出现故障时可以保证数据不丢失
- 在容器迁移时,Flocker 会自动地将卷从一个 host 移植到另一个 host
Flocker 的结构:
转载于:https://www.cnblogs.com/cheyunhua/p/8961555.html
理解Docker(8):Docker 存储之卷(Volume)相关推荐
- Docker存储卷volume(V18.X)
文章目录 1. 简介 1.1 介绍 1.2 作用 1.3 分类 2. 存储卷使用 2.1 设置卷的命令 2.1.1 -v或`--volume`选项指定卷 2.1.2 `--mount`指定卷 2.1. ...
- docker的文件流处理_Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken...
前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...
- docker学习5--docker数据卷(volume)
https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...
- docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]
docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...
- Docker镜像、容器数据卷和Dockerfile
Docker镜像 概述 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. UnionFS ...
- docker 保存 环境持久化_18、docker的持久化存储和数据共享
18.1 Data Volume Docker持久化数据方案 基于本地文件系统的Volume 可以在执行docker create或者docker run的时候,通过-v参数将主机的目录作为容器的数据 ...
- Docker映像存储在哪里? Docker容器路径介绍
Docker has been widely adopted and is used to run and scale applications in production. Additionally ...
- Docker 镜像的存储机制
作者:网易云基础服务姜政冬. 近几年 Docker 风靡技术圈,不少从业人员都或多或少使用过,也了解如何通过 Dockerfile 构建镜像,从远程镜像仓库拉取自己所需镜像,推送构建好的镜像至远程仓库 ...
- Docker(容器、数据卷、Docker Compose)
Docker 本次介绍以下几个内容: Docker概念 容器数据卷 Dockerfile 应用部署 服务编排 私有仓库 Docker概念 Docker 是一个开源的应用容器引擎 • 诞生于 2013 ...
- Docker将在存储上崭露头角?
Docker与存储纪实 在容器中运行应用的想法--也作为OS级虚拟化著称--目前来看是一种潮流技术.这种技术的真身可以追溯到大型机时代. 但是在过去的12个月当中,在单一OS中运行多个相隔离的负载的思 ...
最新文章
- python strip函数用法_python strip()函数 介绍
- 【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
- java string输入_怎么让Java获取用户输入的字符串
- FTP服务器配置部分
- internal java compiler error_java字节码注入AOP作业心得
- NSIS:IfFileExists+Goto实现简单跳转
- PyTorch学习:参数初始化
- 网络对抗技术 实验二
- IntelliJ IDEA后台程序启动
- 二极管整流和同步整流区别
- iOS开发各种证书详解
- ccc-sklearn-11-线性回归(1)
- 模拟器上下载Fiddler证书
- 上传声音 微信小程序_微信小程序之----audio音频播放
- jQuery weui Select组件显示指定值
- 隐函数存在定理1的几何解释
- 苹果cms常见100个问题及解决方法
- 小猫打螃蟹-第10届蓝桥杯Scratch省赛真题第2题
- android 流星动画,超简单的android 流星雨动画 流星动画
- 基于matlab活体检测,人脸识别中活体检测算法综述.PDF
热门文章
- 从Spring中的@Transactional注解说起
- CentOS7命令自动补全
- C#高级编程9 第19章 程序集
- linux安装与登录
- Invalid escape sequence(valid ones are \b \t \n \f \r \ \' \\)
- rhel6 dhcp dns配置小贴士
- 苹果宣布CEO乔布斯辞职 COO库克接任
- 利用PlayerPrefs存储数据
- 关于利用border-radius变形后,margin的参照对象
- 工程管理 -- makefile