Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
前言
前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了。相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了。本篇博客将会讲解如何让容器中的一个目录与宿主机的一个目录进行绑定。这样就可以实现容器与宿主机之间的文件共享。
例如:我们只要把网站数据放到宿主机的共享文件中,无需再频繁登录容器,就可以实现网站的部署,这样是不是很酷?
接下来本篇博客将会使用几个简单的命令带你完整演示上面的例子怎么玩。
另外,在《Docker端口映射及创建镜像演示(二)--技术流ken》我的这篇博文中虽然可以创建镜像, 但是还是严重依赖于一个别人做好的一个镜像,无法定制自己的镜像,其实更适合于备份或者容错使用。
下一篇博客将会再讲解一个创建镜像更高级的操作,让你可以真正定制属于自己的镜像。
但鉴于篇幅大小,本篇博客先详细讲解数据卷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 : --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 *: *:*
LISTEN 127.0.0.1: *:*
LISTEN *: *:*
LISTEN *: *:*
LISTEN ::: :::*
LISTEN ::: :::*
LISTEN ::: :::*
LISTEN ::: :::*
第六步:浏览器进行访问
现在我们就可以使用宿主机的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{..}
[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 : -v /ken:/data/ --rm busybox
第四步:启动容器的apache
/ # httpd -h /data
第五步:浏览器访问
访问浏览器可以看到如下的界面
这样就实现了数据的迁移。
Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken的更多相关文章
- Docker数据卷Volume实现文件共享、数据迁移备份(三)
数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...
- docker——数据卷volume:文件共享
volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...
- Docker端口映射及创建镜像演示(二)--技术流ken
前言 在上一篇博客<Docker介绍及常用操作演示--技术流ken>中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示. 现在我们已经可以自己下载镜像,以及创建容器了. ...
- Docker镜像构建的两种方式(六)--技术流ken
镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
- Docker网络(五)--技术流ken
本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...
- 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,首先我们 ...
随机推荐
- html5中如何更改、去掉input type默认样式
1.如何去掉input type=date 默认样式 HTML代码: 选择日期:<input type="date" value="2017-06-01" ...
- TensorFlow学习笔记1
1.daocloud 拉取 docker镜像 docker pull daocloud.io/daocloud/tensorflow:latest 镜像位置: /Users/{YourUserName ...
- vue solt 属性浅析
solt 也就是插槽,通俗的讲也是和div,span,p等类似的html标签,只是solt是子组件中的html标签.它显示不显示完全是由父组件决定的, 但是显示的位置是由子组件自己决定的.插槽主要分为 ...
- shell实例利用crontab自动清除日志
shell实例利用crontab自动清除日志 程序运行会产生很多的日志,对于无用的日志手动删除比价麻烦,写一个自动执行的命令是很有必要的. 删除文件shell命令 find 对应目录 -mtime + ...
- 实现一个simple 3层的神经网络
1.基本概念 1.1softmax softmax函数:一句话概括:是logistic 函数的扩展,将一个p维的数值向量映射成为一个k维的概率值,且这k个值的和为1. 公式: 解释: 1.2 cros ...
- TeeChart For VCL/FMX V2017使用教程:第一章-准备开始
https://blog.csdn.net/vbfgm/article/details/79338775 第一章 准备开始-构建图表和填充数据序列 1.1 简介 通过代码或Dataset(数据集)访问 ...
- Android-Java-接口Interface
接口Interface 与 抽象类不同: 抽象类关注的是事物本质,例如:水果Fruit 属于抽象的,说去买水果 是模糊的概念 是抽象的概念 不具体,到底买什么水果不知道,而水果包含了 香蕉,橘子 很多 ...
- 目标检测算法(1)目标检测中的问题描述和R-CNN算法
目标检测(object detection)是计算机视觉中非常具有挑战性的一项工作,一方面它是其他很多后续视觉任务的基础,另一方面目标检测不仅需要预测区域,还要进行分类,因此问题更加复杂.最近的5年使 ...
- 【Java】利用注解和反射实现一个"低配版"的依赖注入
在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...
- mysql 取名会涉及到关键字 的问题
如 comment 如下图错误