文档章节

Docker数据卷Volume实现文件共享、数据迁移备份(三)

o
 osc_wws45aot
发布于 2019/08/21 13:29
字数 2335
阅读 63
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

数据卷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,这就涉及到数据迁移,方法是:

  1. docker stop 当前容器。
  2. 启动新版本容器并 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 共享。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
九、docker容器的数据管理

刚接触docker时总在思考两个问题: docker容器如何实现将数据持久化呢?比如一个httpd容器中用户上传的文件或者访问日志等! 如何实现便捷的更新容器中的文件呢? 比如需要快捷的更新容器中的...

osc_bg1i2mem
2018/01/16
1
0
Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了。相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了。本篇博客将会讲解如何...

osc_o60il3e6
2018/11/29
10
0
Docker 0x06: Docker Volume卷

Docker Volume卷 [toc] 在容器技术介绍篇,我们提到过容器的难点在构建网络和文件存储。容器的文件系统虽然可以保存数据,但是容器中的,容器本身是不可迁移的,只能导出其中的文件系统,但是...

osc_wu4wpoko
2019/07/08
5
0
docker数据卷volume功能特性

制作镜像的俩种方法 Commit制作镜像基于一个现有的容器 dockerfile基于镜像制作镜像 容器底层技术: 1.cgroup 实现了资源的使用限额,CPU,内存,以及磁盘 [root@zxw99 ~]# docker run -d -m...

osc_1z8ghska
2019/08/14
2
0
Dockers 快速学习(四)Docker 容器的使用

Docker 容器的使用 1、容器间的链接: 运行一个容器,给它一个名称,例如: docker run -d -p 0.0.0.0:4455:22 -p 0.0.0.0:8080:80 --name one centos6-ssh 再运行另一个容器 docker run -d ...

ZhouLS
2014/07/18
1.4W
0

没有更多内容

加载失败,请刷新页面

加载更多

VB语言基础重要知识点12

我们课程,我们做一些针对于考试的简要讲解。 一、有关考试的几个问题 首先,提问:考试最重要的是什么? 答案其实很简单:得分!!!!! 想要得分,就要做到基本的保存。 保存哪些文件呢?...

刘金玉编程
2019/10/30
5
0
全网最全JAVA、Python电子书!限时领取,过时不候!

给大家整理了最全的入门+进阶书籍!!! 免费领取,无套路! 加微信发送“电子书” 秒通过,秒发资源! 本文分享自微信公众号 - Python进击者(JAVAandPythonJun)。 如有侵权,请联系 supp...

kuls
01/16
18
0
原创356--免费还是付费

最近得有一个星期,被一个录屏软件(record it)烦到了,本来免费版可以无限制录制,只能720p,GIF不支持,高清不支持,没有剪辑功能。 之前调研了好几种,用起来还是这个方便,就一直用了。...

八音弦
04/24
14
0
数字IC技术讨论群,设计和验证、前端和后端,总有你感兴趣的话题。快满了,需要的抓紧加入。

本文分享自微信公众号 - 白山头讲IC(gray_mount)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

白山头
04/29
5
0
how to install mongodb in centos7

[root@xtwj88 ~]# cat /etc/yum.repos.d/mongodb-org-4.2.repo [mongodb-org-4.2]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86......

qwfys
47分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部