Docker数据卷Volume实现文件共享、数据迁移备份(三)
数据卷volume功能特性
数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的
对于数据卷你可以理解为NFS中的哪个分享出来的挂载点,指宿主机共享的目录。
主要有如下的功能和特性
- 容器中数据的持久存储
- 容器间的资源共享
- 容器的迁移(分布式)
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除 (注意docker自主管理的会被删除,容器删除前一定要对数据卷进行备份)
数据卷volume共享方式
实现数据卷有如下三种方法
- Bind mount volume:用户需要明确指定容器中的目录和宿主机中的哪个目录进行绑定
- Docker Management Volume:docker daemon自行管理将容器中的目录和宿主机中的哪个目录进行绑定
- 基于一个现有容器实现多个容器之间文件共享
数据卷volume文件共享之Bind Mount Volume
1. Bind mount volume
第一步:在宿主机创建目录并准备测试文件
[root@ken ~]# mkdir /ken
[root@ken ~]# echo "test for volumes by ken">/ken/index.html
第二步:启动容器
-it:互动模式登录容器,并分配一个终端
–name:指定容器名称
-p:小p指定容器的80端口映射为宿主机的7879端口。忘记的童鞋可以温习我上一篇博客《Docker端口映射及创建镜像演示(二)–技术流ken》
–rm:表示退出容器时,容器一起删除
-v:指定volumes,格式为: 宿主机共享目录:容器目录 ,这样宿主机的/ken目录就被挂载到了容器的/data/目录下了
[root@ken ~]# docker container run -it --name ken1 -p 7879:80 --rm -v /ken:/data/ busybox
/ #
第三步:查看挂载点
可以发现容器内有了/data目录而且还有了我们创建测试文件
注意:如果容器内没有我们指定的挂载点,会自动创建
[root@ken ~]# docker container run -it --name ken -v /ken:/data/ busybox
/ # ls /data
index.html
/ # cat /data/index.html
test for volumes by ken
第四步:启动容器的apache
/ # httpd -h /data
第五步:查看端口
可以发现现在宿主机已经有了7879端口了
[root@ken ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 1024 127.0.0.1:8080 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 1024 :::7879 :::*
LISTEN 0 70 :::3306 :::*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
第六步:浏览器进行访问
现在我们就可以使用宿主机的IP地址加上我们映射的端口就可以访问容器中的网站数据内容了


第七步:修改网站数据进行测试
现在我们修改宿主机分享出去的目录下的内容,检查看容器内的内容是否会发生改变
[root@ken ~]# echo "this is the append line for ken">> /ken/index.html
第八步:浏览器刷新
可以发现我们追加的内容已经可以看到了,说明容器中网站数据内容已经被成功修改了


数据卷volume文件共享之Docker Management Volume
Docker Management Volume与Bind Mount Volume区别就是它会自己管理将会把容器中的目录与宿主机哪个目录进行绑定
第一步:启动容器
这个时候的-v后面只需要跟上容器内的一个目录即可
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
第二步:查看容器的目录
可以发现目录不存在也是自动创建
现在目录下没有任何文件
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ #
第三步:查看挂载点
我们检查看下容器内的这个目录被挂载到了那个宿主机的那个位置
可以发现容器中的data目录被挂载到了宿主机的如下目录下
[root@ken ~]# docker container inspect ken1 | grep Source
"Source": "/var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data",
第四步:宿主机创建文件进行测试
我们可以在宿主机的共享目录中创建文件查看容器内是否有相同文件即可验证
[root@ken ~]# cd /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
[root@ken _data]# touch ken{1..5}
[root@ken _data]# ls
ken1 ken2 ken3 ken4 ken5
第五步:容器内查看
第二次查看/data目录下即可发现我们刚才在宿主机内创建的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
/ #
数据卷volume文件共享之基于一个现有容器
第一步:再次启动一个容器
–volumes-from:后面指定容器名,上一个实验我已经启动了一个容器ken1
[root@ken ~]# docker run --name ken2 -it --volumes-from ken1 --rm busybox
第二步:查看新容器的文件
可以在新创建的容器有了我们之前创建容器的文件了
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
第三步:在新容器内创建新的文件
如下我创建了一个kenken的文件
/ # cd /data
/data # touch kenken
/data # ls ./
ken1 ken2 ken3 ken4 ken5 kenken
第四步:查看ken1容器
在ken1容器内查看是否已经有了我们创建的文件
可以发现在ken1容器内也有了我们在新容器内创建的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
/ # ls /data
ken1 ken2 ken3 ken4 ken5 kenken
第五步:查看宿主机
其实这个时候宿主机也应该有我们刚才创建的文件
这样就实现了多台容器之间以及和多台容器和宿主机之间的文件共享
[root@ken ~]# ls /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
ken1 ken2 ken3 ken4 ken5 kenken
数据卷volume之实现数据迁移备份
相信大家在读懂上面的实验之后对于如何实现数据的迁移备份已经有了大概的认识,其实我们只要备份宿主机共享目录下的数据即可。
下面进行详细演示,我还是以我上面的实验为基础,实现删除容器ken1,ken2, 再次创建一个容器ken3,实现数据的迁移。
第一步:删除容器
下面我将所有的容器都删除掉了
[root@ken ~]# docker container rm $(docker ps -a -q)
a8b4931d0482
b0a31b4fabe5
636651b79907
1b47e65fbb56
e958c6ea706b
c8b820f356ec
[root@ken ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
第二步:查看宿主机文件
数据卷有一个特性就是即使容器被删除了,数据卷也会一直存在
但是需要注意docker自主管理的数据卷会被删除,容器删除前一定要做备份。
现在我们自己创建的数据卷还在
[root@ken ~]# cat /ken/index.html
test for volumes by ken
this is the append line for ken
第三步:启动一个容器
[root@ken ~]# docker run --name ken3 -it -p 6767:80 -v /ken:/data/ --rm busybox
第四步:启动容器的apache
/ # httpd -h /data
第五步:浏览器访问
访问浏览器可以看到如下的界面
这样就实现了数据的迁移。


volume 生命周期管理
1.备份
因为 volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份。
[root@ken1 ~]# docker run -d -v /ken:/usr/share/nginx/html nginx-game:v1
在这里只需要备份/ken目录下的文件即可
2.恢复
volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝到 /ken就可以了。
3.迁移
如果我们想使用httpd,这就涉及到数据迁移,方法是:
- docker stop 当前容器。
- 启动新版本容器并 mount 原有 volume。
[root@ken1 ~]# docker run -d -v /ken:/var/www/html httpd
当然,在启用新容器前要确保新版本的默认数据路径是否发生变化。
4.销毁
可以删除不再需要的 volume,但一定要确保知道自己正在做什么,volume 删除后数据是找不回来的。
docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。对于 docker managed volume,在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume,目的是保护数据,非常合理。
如果删除容器时没有带 -v 呢?这样就会产生孤儿 volume,好在 docker 提供了 volume 子命令可以对 docker managed volume 进行维护。
容器 bbox 使用的 docker managed volume 可以通过 docker volume ls 查看到。
因为没有使用 -v,volume 遗留了下来。对于这样的孤儿 volume,可以用 docker volume rm 删除
如果想批量删除孤儿 volume,可以执行:
docker volume rm $(docker volume ls -q)
volume container 的数据归根到底还是在 host 里,有没有办法将数据完全放到 volume container 中,同时又能与其他容器共享呢?
当然可以,通常我们称这种容器为 data-packed volume container。其原理是将数据打包到镜像中,然后通过 docker managed volume 共享。
Docker数据卷Volume实现文件共享、数据迁移备份(三)的更多相关文章
- Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...
- docker——数据卷volume:文件共享
volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...
- docker学习5--docker数据卷(volume)
https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...
- Docker之数据卷Volume(七)
一.简介 Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...
- docker数据卷(volume)
1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...
- Docker容器数据卷-Volume详解
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...
- Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解
此文来源于:https://yq.aliyun.com/ziliao/43471 参考原文件之外,做了些修改. Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录 ...
- 数据卷Volume
数据卷概述 Kubernetes Volume(数据卷)主要解决了如下两方面问题: 数据持久性:通常情况下,容器运行起来之后,写入到其文件系统的文件暂时性的.当容器崩溃后,kubelet 将会重启该容 ...
- 你必须知道的Docker数据卷(Volume)
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...
随机推荐
- 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用
本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 算法-搜索(4)ISAM算法
ISAM技术是一种典型的多叉搜索树结构,它使用了3级索引结构:主索引.柱面索引.磁道索引 所有数据记录在基本区按关键码升序排序,后一磁道所有关键码均大于前一磁道.在某一磁道插入新记录时,如果原来该磁道 ...
- python列表的索引与切片
<1>.python的列表 索引方式: 例如,list1 = ['张三','男','33','江苏','硕士','已婚',['身高178','体重72']] 1.正向单索引 print(l ...
- latex:公式的序号
1.排序单位 在文类book或report中,行间公式是以章为排序单位的,即每一新章节开始,公式序号计数器equation就被清零.比如第1章第3个公式的序号是(1.3),第2章第1个公式的序号是(2 ...
- ent orm笔记1---快速尝鲜
前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用. 安装 ent orm 需 ...
- Kubernetes K8S之资源控制器StatefulSets详解
Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...
- Photon PUN 一 介绍
有句话说的好 , 官网永远是最好的学习地方 . 虽然国内的资料不多 , 但是官网的资料还是很充足 , 这就带着英汉词典就着作阅读理解的劲头去官网学习吧 https://doc.photonengine ...
- js 原生功底 (一)
欢迎大家一起学习,点击查看
- Myabtis动态SQL,你真的会了吗?
目录 前言 什么是动态SQL? 常用的标签 if choose.when.otherwise where foreach set sql include 总结 拓展一下 Mybatis中如何避免魔数? ...
- Q200510-03-02: LRU缓存机制
问题: LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果 ...