一 Docker volume形态

因为Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层,在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
  • 默认,即无Docker volume
  • Data volume (数据卷)
  • data container(数据卷容器)

二 默认无volume

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

三 Data volume (数据卷)

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

3.1 -v挂载容器内目录

数据卷特性:
  • 数据卷是目录或文件,而非没有格式化的磁盘(块设备)
  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除
root@docker:~# docker run -d -p 8080:80/tcp --name web01 -v /webroot:/usr/local/apache2/htdocs httpd #挂载固定目录
root@docker:~# docker run -d -p 9090:80/tcp --name web02 -v /usr/local/apache2/htdocs httpd #自动映射目录
  • -d:后台进程;
  • -p:映射端口,物理机端口:容器端口;
  • -v:物理机文件夹:容器的目录(容器中目录如果不存在,会自动创建,如果存在,会覆盖掉),即将宿主机中的目录挂载到镜像中的目录。
提示:若需要挂载多个目录,可多次采用-v。
区别:
类型
挂载固定目录
自动映射目录
volume 位置
可任意指定
/var/lib/docker/volumes/……
对已有mount point 影响
隐藏并替换为 volume
原有数据复制到 volume
是否支持单个文件
支持
不支持,只能是目录
权限控制
可设置为只读,默认为读写权限
无控制,均为读写权限
移植性
移植性弱,与host path绑定
移植性强,无需指定host目录
 root@docker:~# docker inspect b7 | grep -A11 "Mounts"
root@docker:~# echo "Hello web01!" >/webroot/index.html
root@docker:~# echo "Hello web02!" >/var/lib/docker/volumes/725d7d76ec8eb10f5730fe5663cb1d1eb7481efaa2a5a790343dca5d0557564a/_data/index.html
 
提示:若不指定本地目录则会自动在宿主机/var/lib/docker/volumes下为其生成一个随机目录。
测试:浏览器访问:http://172.24.8.90:8080/
测试:浏览器访问:http://172.24.8.90:9090/
提示:采用volumes数据卷的情况下,当对应的容器被删除时,其挂载的目录会保留。主机上的目录可以是一个本地目录,也可以在一个 NFS share等形式。

3.2 -v挂载文件

 root@docker:~# docker run --rm -it --name centos7-01 -v ~/.bashrc:/root/.bashrc centos:7
提示:本地主机文件作为数据卷挂载到容器中,不建议在容器中直接修改。

四 docker的数据共享

4.1 docker容器与宿主机共享数据

方式一:docker cp
cp的用法如下:
 docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
root@docker:~# docker cp /root/.vimrc centos7-01:/root/ #从宿主机拷贝至容器
root@docker:~# docker cp centos7-01:/root/.vimrc /root/.vimrc_bak #从容器拷贝至宿主机
 
方式二:采用数据卷挂载形式,见3。

4.2 docker容器之间共享数据

情景一:共享host宿主机目录
将同一个host目录挂载到不同的容器即可。
 root@docker:~# docker run -d -p 1010:80/tcp --name web03 -v /webroot:/usr/local/apache2/htdocs httpd
root@docker:~# docker run -d -p 2020:80/tcp --name web04 -v /webroot:/usr/local/apache2/htdocs httpd
root@docker:~# echo "This is share file!" >/webroot/index.html
 
测试:浏览器分别访问http://172.24.8.90:1010和/http://172.24.8.90:2020/。

4.2 docker容器与容器共享数据

见5.data container(数据卷容器)。

五 data container(数据卷容器)

data container中不会跑应用,而只是挂载一个卷,volume container是专门为其他容器提供volume的容器,它提供的卷的类型可以是bind mount,也可以是docker managed volume。

5.1 创建数据卷容器

data container。这种 container 中不会跑应用,而只是挂载一个卷。
 root@docker:~# docker create --name sharefile01 -v /data:/usr/local/apache2/htdocs centos:7
root@docker:~# docker inspect sharefile01 | grep -A11 "Mounts"
 
解释:创建一个名为sharefile01的用于容器之间共享数据的数据卷容器,并将宿主机的/data目录挂载至该容器的/usr/local/apache2/htdocs目录。
提示:其他容器只需获取数据卷容器的挂载点,因此可该容器可不运行。/usr/local/apache2/htdocs为容器中的目录,并非宿主机本地目录,当其他容器引用此容器时,会自动在容器中挂载此目录。

5.2 引用数据卷容器

新建容器时可通过--volumes-from参数指定需要引用的数据卷容器。
 root@docker:~# docker run -d -p 3030:80/tcp --name web05 --volumes-from sharefile01 httpd
root@docker:~# docker run -d -p 4040:80/tcp --name web06 --volumes-from sharefile01 httpd
root@docker:~# echo "This is share file two!" >/data/index.html
 
测试:浏览器分别访问http://172.24.8.90:3030和/http://172.24.8.90:4040/。

六 volume管理

6.1 创建volume卷

 root@docker:~# docker volume create --name data02
root@docker:~# docker volume inspect data02
 

6.2 使用volume卷

 root@docker:~# docker run -d -p 5050:80/tcp --name web07 -v data02:/usr/local/apache2/htdocs httpd
root@docker:~# echo "Hello web07!" > /var/lib/docker/volumes/data02/_data/index.html
 
测试:浏览器访问http://172.24.8.90:5050。

6.3 查看volume卷

 root@docker:~# docker volume ls				#查看所有volume卷
root@docker:~# docker volume ls -qf dangling=true #查看所有孤儿卷
 
提示:使用 docker run -v 启动的容器被删除以后,在主机上所挂载的卷不会删除,即残留孤儿卷。

6.4 删除volume卷

 root@docker:~# docker volume rm 95704ae78c05261a46d2dc1f2bf872a8c3dc634817e7c0db53e7e6d40f2dc8ea
root@docker:~# docker volume rm $(docker volume ls -qf dangling=true) #删除孤儿卷
 

6.5 删除容器时删除 volume

 root@docker:~# docker run -d -p 6060:80/tcp --name web08 -v /usr/local/apache2/htdocs httpd
root@docker:~# docker inspect web08
 
 root@docker:~# docker rm -vf web08
root@docker:~# docker volume ls
 
提示:若容器采用静态固定挂载,则使用-vf也无法删除volume卷。

七 volume数据备份及还原

7.1 备份

原理:将需要备份的容器,如web09,当做数据卷容器,以此容器创建一个mydatabackup临时容器,并将宿主机/mybackup挂载到mydatabackup容器的/databack,并在该临时容器中执行备份的打包命令,备份需要保存数据的目录,如/usr/local/apache2到/databack,也就是备份到宿主机/mybackup目录。
 root@docker:~# docker run -d -p 1111:80/tcp --name web09 -v /usr/local/apache2/htdocs  httpd
root@docker:~# docker inspect web09 | grep -A11 "Mounts"
root@docker:~# echo "This is web09 backup test!">/var/lib/docker/volumes/16aa6956e7076ecb9f256c302833640880e3bb1b8602771cca378e7230975488/_data/index.html
 
提示:创建用于备份的容器,并备份该文件。
 root@docker:~# docker run --volumes-from web09 --name mydatabackup -v /mybackup:/databack httpd tar zcf /databack/http-backup.tar.gz /usr/local/apache2/htdocs

7.2 还原

原理:新建一个临容器,如temp01,然后将容器需要保存的数据的目录,如/usr/local/apache2挂载至宿主机,然后再并将宿主机/mybackup挂载到该容器的/databack,将temp01临时容器当做数据卷容器新建web10容器,并将备份文件解压恢复,则恢复至temp01容器所挂载的宿主机目录,再以temp01为数据卷容器创建新的容器即可。
 root@docker:~# docker run -d -v /usr/local/apache2/htdocs --name temp01 httpd
root@docker:~# docker run --volumes-from temp01 --name web10 -v /mybackup:/databack httpd tar zxf /databack/http-backup.tar.gz
#此步骤执行完毕即将备份文件已经还原至容器的/usr/local/apache2/htdocs。
root@docker:~# docker run -d -p 2222:80/tcp --name web11 --volumes-from temp01 httpd
 
测试:浏览器访问http://172.24.8.90:2222。
 
参考链接:https://www.cnblogs.com/sammyliu/p/5932996.html
https://www.cnblogs.com/shoufengwei/p/7259496.html

005.Docker存储管理的更多相关文章

  1. docker存储管理及实例

    一.Docker存储概念 1.容器本地存储与Docke存储驱动 容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储.采用的是联合文件系统.通过存储驱动进行管理. 存储驱动:控制镜像和容器在 ...

  2. Docker入门 - 005 Docker 容器连接

    Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...

  3. 附005.Docker Compose文件详解

    一 Docker Compose文件简介 compose文件使用yml格式,主要分为了四个区域: version:用于指定当前docker-compose.yml语法遵循哪个版本 services:服 ...

  4. docker存储管理

    Docker 镜像的元数据 repository元数据 repository在本地的持久化文件存放于/var/lib/docker/image/overlay2/repositories.json中 ...

  5. 附007.Docker全系列大总结

    Docker全系列总结如下,后期不定期更新. 欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识. 若发现任何错误或纰漏,留言反馈或右侧添加 ...

  6. 云计算Docker全面项目实战(Maven+Jenkins、日志管理ELK、WordPress博客镜像)

    2013年,云计算领域从此多了一个名词“Docker”.以轻量著称,更好的去解决应用打包和部署.之前我们一直在构建Iaas,但通过Iaas去实现统一功  能还是相当复杂得,并且维护复杂.将特殊性封装到 ...

  7. 附003.Docker Compose命令详解

    一 Docker Compose命令格式 Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker- ...

  8. Docker之存储管理

    本文由作者邹珍珍授权网易云社区发布. 本文主要介绍Docker的存储管理.Docker拥有镜像分层,写时复制机制以及内容寻址存储等特征,为了支持这些特征,Docker设计了一套镜像元数据管理机制来管理 ...

  9. Docker 镜像之存储管理

    笔者在<Docker 镜像之进阶篇>中介绍了镜像分层.写时复制以及内容寻址存储(content-addressable storage)等技术特性,为了支持这些特性,docker 设计了一 ...

随机推荐

  1. ubuntu14.04 提示 卷 文件系统根目录 仅剩余xxx的硬盘空间

  2. vscode常用快捷键和插件(持续更新),以及一些常用设置的坑和技巧

    一 常用快捷键 ctrl+shift+p:  打开命令面板,最常用了 ctrl+p: 搜索窗口: 直接输入文件名,跳转到文件 > 可以进入 Ctrl+Shift+P 模式 ? 列出当前可执行的动 ...

  3. C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)

    什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...

  4. git操作之冲突解决

    应用场景,任哥,我两个人共同修改了git项目上的一个文件.zsh命令行模式 准备工作 简写命令解释 gl=git pullgp=git pushgst=git statusgcmsg=git comm ...

  5. 【bzoj1901】dynamic ranking(带修改主席树)

    传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...

  6. oracle 命令行

    背景 看到当初竟然记录了命令行,想想自己用了多久才知道了命令行,好像有几年了吧.当时还记得买了两本oracle9的管理书籍,就跟见了九阴真经一样,从头到尾熟悉了好几遍,不过也大部分忘了交给老师了.以下 ...

  7. jumpserver会话终端故障

    查看jumpserver的终端,发现无法访问,情况如下图 页面中提到,需要部署luna,coco和nginx的url分发. 然后进入到jumpserver的服务器,发现nginx启动了,但是没有coc ...

  8. zabbix3.0.4导入中文模板后乱码问题处理

    通过yum安装方式部署了zabbix3.0.4监控服务器,配置过程中发现当导入的模板中有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字 ...

  9. Linux(CentOS7)安装zip、unzip命令

    安装命令: yum install -y unzip zip

  10. [学习笔记]Javascript的包装对象

    例子1: var s="test"; s.len = 4; var t = s.len // t is undefined 原因是s是字符串,第二行代码,实际上是创建一个临时字符串 ...