前言

前面已经写了两篇关于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 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

testfor volumes by ken

第四步:启动容器的apache

/ # httpd -h /data

第五步:查看端口

可以发现现在宿主机已经有了7879端口了

[root@ken ~]# ss -tnl

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN0 128 *:111 *:*LISTEN0 1024 127.0.0.1:8080 *:*LISTEN0 511 *:80 *:*LISTEN0 128 *:22 *:*LISTEN0 1024 :::7879 :::*LISTEN0 70 :::3306 :::*LISTEN0 128 :::111 :::*LISTEN0 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

testforvolumes by kenthis 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

第五步:浏览器访问

访问浏览器可以看到如下的界面

这样就实现了数据的迁移。

docker的文件流处理_Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken...相关推荐

  1. docker学习5--docker数据卷(volume)

    https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...

  2. Docker 基本操作 数据卷 -- docker 数据卷基本操作、挂载数据卷

    文章目录 1. docker 数据卷基本操作 1.1 容器与数据耦合的问题 1.2 数据卷介绍 1.3 数据卷的基本语法 1.4 创建一个数据卷,并查看数据卷在宿主机的目录位置 1.5 小结 2. 挂 ...

  3. docker 数据卷 volume

    集群直接部署tomcat项目,可能项目在不同的服务器上,如何实现不同服务器上面的项目同步,可是使用docker数据卷的形式 首先我们来认识最为基础的docker数据卷 如何创建一个数据卷: 1.创建 ...

  4. Docker数据卷(Volume)

    一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...

  5. 09 数据卷容器(实现数据同步)

    文章目录 1 容器之间实现数据共享 1 容器之间实现数据共享 使用上一节课制作的镜像,启动一个名为docker'01 的centos'容器' docker run -it --name docker0 ...

  6. docker数据卷volume详解

    # docker cp命令 将容器内的文件拷贝的宿主机.

  7. Docker学习(六)-----Docker数据卷

    十.Docker数据卷 问题:通过镜像创建一个容器,容器一旦被销毁,则容器内的数据将一并被删除,但有些情况下,通过服务器上传的图片出会丢失.容器中的数据不是持久化状态的. 那有没有一种独立于容器,提供 ...

  8. Docker 数据卷之进阶篇

    Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...

  9. docker 和挂载文件一起打包成新镜像_Docker文件系统和数据卷

    分层结构 当容器启动时,一个新的可写层被加载到镜像的顶部. 这一层通常被称作"容器层","容器层"之下的都叫 "镜像层".所有对容器的改动 ...

最新文章

  1. (二)阅读器客户端开发实战_需求阐述
  2. powerdesigner箭头如何画_用Scratch编程画几何图形:如何画多边形
  3. 担当大任者的九大特征
  4. 首个比较成型的切图作品
  5. (30)VHDL实现比较器(有符号)
  6. 计算机二级MS Office中最难的是Excel?那是因为你没有掌握这些【重难点】!!!
  7. Visio直角连接线增加直角拐弯
  8. windows7自带的计算机,win7电脑自带投屏吗?
  9. 五十个产品可靠性性能提高的方法详解
  10. Android常用开源项目
  11. CSS 样式实现单边阴影
  12. 深入浅出图神经网络~卷积神经网络(上)
  13. linux 消息队列的单工通信,半双工通信
  14. 2022-2028全球与中国品牌许可市场现状及未来发展趋势
  15. RPC + Dubbo
  16. 【从C开始学编程】之(序言)大家为什么要学C语言以及C语言好不好学?
  17. 敢不敢问导师是不是讨厌自己_您一直想知道的有关人类记忆的一切(但不敢问)...
  18. 力扣PTA~每天至少三题
  19. 《计算机网络》信道划分介质访问控制
  20. 伪睡眠排序(c++实现)

热门文章

  1. linux 设计与实现 pdf,Linux库的设计与实现.pdf
  2. java 请求响应_java http接口请求响应 request response
  3. vue axios 跨域_SpringBoot+Vue从零开始搭建系统(三)前后端整合二
  4. python下载图片、已知url_python 爬虫之requests爬取页面图片的url,并将图片下载到本地...
  5. if condition 大于_条码打印软件之脚本编程的应用(if语句)
  6. angularjs的双向绑定原理实现
  7. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)
  8. PHP:验证邮箱合法性
  9. 【转载】 C++中回车换行(\n\r)和换行(\r)的区别
  10. Oracle 数据恢复指导具体解释