Docker中数据卷(Volume)的使用
数据卷有两种形式,一种是容器中的某个目录,它可以被别的容器引用,只要有一个容器引用了这个数据卷,数据就不会被删除;另一种数据卷是将容器中的数据卷和宿主机的目录进行挂载。
数据卷可以在多个容器之间共享,修改数据卷不会影响镜像。
创建数据卷
docker run -itd --name data1 -v /opt/data ubuntu:18.04
: 创建一个带有数据卷的容器,数据卷的位置是/opt/data
,目录不存在会自动创建,该容器的数据卷可以被其他容器引用(容器有读写权限)
docker run -itd --name data1 -v /opt/data ubuntu:18.04
87e1508b7825e9e24a90eb7e0c6998aff987634405903163c9329856b3f249a1
[root@localhost dockerdir]# docker inspect 87e1508b7825 | grep volumes
"Source": "/var/lib/docker/volumes/a0fb7c1f9c33efe41600fab9eaa612d409c75ce2e077107f1c8f5d798499bb57/_data",
[root@localhost dockerdir]# cd /var/lib/docker/volumes/a0fb7c1f9c33efe41600fab9eaa612d409c75ce2e077107f1c8f5d798499bb57/_data
[root@localhost _data]# echo "afjsldajf;lasjkfd;lakdsjf;lajf;ljdsalfj" >> data.txt
[root@localhost _data]# docker exec -it 87e1508b7825 bash
root@87e1508b7825:/# cd /opt/data
root@87e1508b7825:/opt/data# cat data.txt
afjsldajf;lasjkfd;lakdsjf;lajf;ljdsalfj
挂载宿主机的目录到数据卷
docker run -itd --name data2 -v $(pwd):/opt/data ubuntu:18.04
: 将当前目录(或文件)挂载到容器的opt/data
目录(或文件)下。宿主的目录(或文件)必须要已经存在,而容器中的目录(或文件)会自动创建。
查看数据卷在宿主机中对应的目录
docker inspect data|grep /var/lib/docker/volumes
[root@localhost dockerdir]# docker run -itd --name data2 -v $(pwd):/opt/data ubuntu:18.04
a6969d01a4778884d75b4a2820c7d1835ee659c40516b6bb7cab1268f49a90d1
[root@localhost dockerdir]# echo "this is data" >> data2.txt
[root@localhost dockerdir]# docker exec -it data2 bash
root@a6969d01a477:/opt/data# cat data2.txt
this is data
docker run -it --name data3 -v $(pwd)/dockerdir1:/opt/data1 -v $(pwd)/dockerdir2:/opt/data2 ubuntu:18.04
: 挂载多个目录。
另外,可以在-v后用ro和wo表示在容器中只读和只写($(pwd):/opt/data:ro
),不加表示不限制
引用数据卷
docker run -itd --name data4 --volumes-from data3 ubuntu:18.04
: 从data3中引用数据卷,可以继续引用data4,也可以直接应用data3。一次性将data3的两个数据卷都引用了过来- 只要依然有容器在使用这些数据卷,数据就不会丢失。除非没有容器引用它。
[root@localhost dockerdir]# docker run -itd --name data4 --volumes-from data3 ubuntu:18.04
[root@localhost dockerdir]# docker inspect data3 | grep Source
"Source": "/root/dockerdir/dockerdir1",
"Source": "/root/dockerdir/dockerdir2",
[root@localhost dockerdir]# docker inspect data4 | grep Source
"Source": "/root/dockerdir/dockerdir2",
"Source": "/root/dockerdir/dockerdir1",
备份数据卷
思路是,先引用需要的数据卷。再自己把宿主机上的某个地址dir1挂载到容器的dir2上,然后在容器里面,将数据卷中的内容都打包放到dir2中。这样在宿主机中就可以得到这些打包好的数据。
docker run -itd --rm --name data5 --volumes-from data3 -v $(pwd):/opt/backup ubuntu:18.04 tar cvf /opt/backup/data5_backup.tar /opt/data1 /opt/data2
: 引用data3的两个数据卷,在将数据打包放到于外部挂载的opt/backup/
目录上,这样就可以直接在外部拿到这些数据。--rm
容器用完就自动删除。
[root@localhost dockerdir]# docker run -itd --rm --name data5 --volumes-from data3 -v $(pwd):/opt/backup ubuntu:18.04 tar cvf /opt/backup/data5_backup.tar /opt/data1 /opt/data2
[root@localhost dockerdir]# ls
data2.txt data5_backup.tar dockerdir1 dockerdir2 Dockerfile
恢复数据
与数据挂载的用法类似,将备份文件所在的目录与容器中的目录挂载起来。在容器中解压备份文件到数据卷中,就可以完成数据的恢复。这部分可以活学活用,用法极多。
# 创建一个容器,他有两个数据卷
[root@localhost dockerdir]# docker run -itd --name data5 --privileged=true -v $(pwd)/dockerdir1:/opt/data1 -v $(pwd)/dockerdir2:/opt/data2 ubuntu:18.04
# 备份数据卷的内容
[root@localhost dockerdir]# docker run -it --rm --volumes-from data5 -v $(pwd):/opt/backup ubuntu:18.04 tar cvf /opt/backup/data5_backup.tar /opt/data1 /opt/data2
# 删除目录中的文件,在容器中不可删除目录,但是目录中的文件已经被删除了。在宿主中可以删除目录
root@aefbfa71f132:/opt# rm -rf data2
rm: cannot remove 'data2': Device or resource busy
root@aefbfa71f132:/opt# ls data2
# 恢复数据
[root@localhost dockerdir]# docker run -it --rm --name recover1 --volumes-from data5 -v $(pwd):/opt/backup ubuntu:18.04 tar xvf /opt/backup/data5_backup.tar -C /
opt/data1/
opt/data1/data
opt/data2/
opt/data2/file_in_data5.dat
root@aefbfa71f132:/opt# ls data2
file_in_data5.dat
坑
由于selinux的作用,如果将容器数据卷挂载到宿主机的目录上,在容器中将无法操作数据卷,解决方法是给容器加上一个优先级 --privileged=true
:
docker run -itd --name data5 --privileged=true -v $(pwd)/dockerdir1:/opt/data1 -v $(pwd)/dockerdir2:/opt/data2 ubuntu:18.04
参考资料
https://www.cnblogs.com/mydba-j/articles/9797931.html
Docker中数据卷(Volume)的使用的更多相关文章
- Docker之数据卷Volume(七)
一.简介 Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...
- Docker容器数据卷-Volume详解
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...
- 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...
- 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数据卷(volume)
1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...
- docker——数据卷volume:文件共享
volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...
- 你必须知道的Docker数据卷(Volume)
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...
- Docker 容器数据卷(Data Volume)与数据管理
卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...
随机推荐
- 【ARK UI】HarmonyOS ETS 资源管理基本使用
代码实现 api讲解 getStringArray getStringArray(resId: number, callback: AsyncCallback<Array>): void ...
- 【AGC】如何快速部署Serverless Url缩短模板
使用场景 Serverless短URL生成模板实现您将在云数据库服务中URL缩短的诉求.使用此模板后,仅需在云数据库服务侧配置长URL值.Serverless短URL生成模板会在后台与Bitly AP ...
- NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)
题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...
- 对Github指定类目的内容进行监控和推送
很久之前看到HACK学习呀有一个Github 安全搬运工的系列文章,个人觉得很不错,想要在自己的公众号上也做这方面的内容,内容的编辑排版相对来说比较容易,这样问题就回归到Github安全内容的获取上 ...
- 第九十二篇:Vue 自定义指令
好家伙, 1.什么是自定义指令? vue官方提供了v-text,v-for,v-model,v-if等常用的指令.除此之外vue还允许开发者自定义指令. 2.自定义指令的分类 vue中的自定义指令分为 ...
- Postman中的Pre-request Scrip详解
Postman中的Pre-request Scrip详解 一.Pre-request Scrip的简介 1.Pre-request Script是在请求发送之前需要执行的代码片段: 2.请求参数中包含 ...
- KingbaseES通过sys_waldump解析wal日志
前言 oracle中的redo日志我们无法直接读取,然而对于KingbaseES数据库,我们可以利用sys_waldump工具解析wal日志,查看wal日志记录的信息. 我们可以利用 sys_wald ...
- 2、String类
String类 String 对象用于保存字符串,也就是一组字符序列 字符串常量对象是用双引号括起来的字符序列,例如:"你好"."12.07"."bo ...
- 【设计模式】Java设计模式 - 模板模式
Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- 使用 EFKLK 搭建 Kubernetes 日志收集工具栈
转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247491992&idx=1&sn=a770252759 ...