前言

上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失。从隔离性的角度来看,数据就应该和容器共存亡;但在实际用场景中,更多需要将数据持久化,即容器被删除,数据也应该正常存在;另外也有很多场景需要容器之间共享数据,那该怎么做呢,接下来说说容器数据卷。

正文

1. 手动保存数据

通常手动有两种方式,一是通过命令就行拷贝,二是将容器提交为镜像。接下来通过拉取centos镜像,运行演示

  • 通过命令形式

    主机和容器之间可以通过命令进行数据拷贝,也就是说,在容器删除之前可以先进行数据拷贝,如下:

    命令简述:docker run -it --name="mycentos" centos /bin/bash,直接根据镜像centos以交互模式启动容器,容器名称为mycentos,在容器内部执行/bin/bash命令进入到终端;具体命令在Docker小白到实战之常用命令演示,通俗易懂这篇文章中已经详细说明;这里简单回顾一下根据镜像启动容器流程,如图:

    上图简述:在Docker执行启动命令时,会先从本地查找镜像,如果没有,就会去远程仓库搜索并拉取到主机,然后主机就可以根据镜像启动容器;如果远程仓库也没有找到镜像,那么就报错

    好了,回到今天的话题,接着说拷贝数据;

    现在通过centos镜像启动了一个容器(Linux系统),在上面创建一些文件进行测试,如下:

    现在如果将容器删除,里面对应的数据也会删除,所以需要将对应的数据拷贝到主机上,如下:

    docker cp bfb96a6afdbc:/usr/TestData /usr/TestDataHost命令解析:

    • 语法:docker cp SRC_PATH DEST_PATH
    • bfb96a6afdbc:/usr/TestData对应的就是SRC_PATH ,表示源头,即需要拷贝的目录或文件;bfb96a6afdbc这是容器ID,通过这种方式限定是某个容器内的数据文件;
    • /usr/TestDataHost对应的就是DEST_PATH,表示目标,即拷到什么地方;

    按照上面的语法规则,同样可以将主机上的数据文件拷贝到指定容器中,只是调换一下SRC_PATHDEST_PATH的位置即可,如下:

  • 将容器提交为镜像的方式

    这种方式只能勉强说是一种备份,只是通过docker commit命令将容器提交为镜像,从而达到备份数据的作用

    但很明显能感觉到不灵活,数据还是在容器内。关于docker commit命令上次已经说过,这里就不重复截图啦。

以上两种方式都不是很好的选择,首先在时效上也不能及时备份,另外通过手动这种操作很明显效率不高,还容易出错;更重要的是苦了小伙伴们,所以必须把自动安排起来;手动这种方式,根据情况偶尔用用就可以啦。

2. 容器数据卷解放双手

2.1 简单理解容器数据卷

数据卷可以理解为目录或文件,设计目的就是为了数据的持久化和共享

挂载数据卷的容器,称为数据卷容器;数据卷完全独立于容器的生存周期,所以容器删除时,对应挂载的数据卷不会被删除。

通过将容器内的目录挂载到主机上面,就可以让数据实时同步,不管是主机改动,还是容器里有变动,都会同步更新

2.2 实操演示

这里先用命令的方式进行演示,关于Dockerfile中的应用会在后续的章节中说到。

docker run命令中-v的选项在上次没说,就是故意留到这里单独分享;直接在启动容器的时候挂载;语法主要有如下几种方式:

# 指定具体的主机路径和容器内的路径
docker run -v /宿主机路径:容器内路径 镜像名
# 指定容器内的路径,docker默认自动指定主机路径
docker run -v 容器内路径 镜像名
# 指定容器内的路径,并指定一个名字,主机路径docker自动指定
docker run -v 卷名:容器内路径 镜像名
  • 匿名挂载:在挂载时不指定名称,会自动生成一个名称

    指定主机目录

    命令解析如下图:

    # docker run -it --name="容器名称" -v 主机绝对路径:容器绝对路径 镜像名称
    docker run -it --name="TestVolumeCentos" -v /usr/TestDataHost/DataVolumeTest:/usr/TestVolumeData centos

    现在已经将容器内的目录挂载到主机上,接下来感受一下数据同步:

    通过上图演示可以看到,不管是在主机还是在容器中修改数据,都能及时同步更新; 容器停止之后,主机更新数据,容器再启动,修改的数据也会同步到容器; 容器删除,挂载的数据不会被删除,还是在主机中,这就是我们想要的。

    可以通过docker inspect 容器命令查看容器的详细信息,其中就有挂载卷的详细信息,如下部分截图:

    不指定主机目录

    很多时候,我们不喜欢自己指定主机目录,而是由Docker自动指定,所以通常我们只指定容器内目录,如下:

    看看Docker指定的主机路径在哪,还是通过docker inspect 容器ID查看详情,如下:

    看看刚才在容器操作的文件数据是否同步过来:

    默认情况,docker都会将挂载的主机目录指定到如上图的目录中。

    可以通过docker volume ls查看主机挂载的数据卷信息,如下:

    通过上图可以看到,名称不直观,看不懂,所以更多时候都会在挂载的时候指定一个名称,即具名挂载。

  • 具名挂载:在挂载时指定一个名称。

    这里除了挂载的时候是指定名称挂载,之后的操作和效果都一样,这里就不重复截图了; 需要注意的是这种方式和指定主机的命令很像,指定路径那种形式,冒号前面是路径,如下:

2.3 容器间传递数据

数据卷其实还可以通过容器继承方式进行挂载,从而实现容器之间的数据共享,如下:

关键命令解析:

  • 先启动一个具名挂载的容器TestVolumesFromCentos,如下命令:

    docker run -it --name="TestVolumesFromCentos" -v testVolumesFrom:/usr/TestVolumeData centos
  • 在启动另一个容器TestVolumesFromCentos2,挂载卷继承于TestVolumesFromCentos,如下命令:

    docker run -it --name="TestVolumesFromCentos2" --volumes-from TestVolumesFromCentos centos

    --volumes-from 后指定继承于哪个容器

现在不管在哪个容器中变更数据,都会实时同步到其他容器中,从而达成了容器数据的共享和实时同步。

通过docker inspect 容器ID看两个容器的挂载详情都一样,截其中一个容器如下:

其实在指定挂载的时候还可以限制容器的操作权限,比如在容器内的挂载目录下,可以限制容器内只读或可读写,如下:

ro:代表只读;

rw:代表读写;

好了,关于容器数据卷就说到这吧,是不是听起来名字高大上,其实就是对文件或目录的操作。

2.4 redis安装实战

关于Redis安装在Docker中很简单,直接执行命令即可,由于之前拉取过redis的镜像,所以就直接启动容器了,如果本地没有镜像,就会去远程仓库拉取。

上图中可以看到,默认情况下,redis的镜像将容器内的/data目录挂载到这个主机上,而这个目录就是redis数据存放的目录,这样就达到Redis的持久化。

对于Redis而言,很多时候需要修改配置文件,总不能每次修改都要到容器内更改,我们可以将配置文件放在已挂载的目录中,然后指定启动,也可以另外针对配置文件再加一个挂载,如下:

执行命令前,需要将配置文件提前放在主机的这个/usr/TestDataHost/redisconf目录中

docker run -d -v /usr/TestDataHost/redisconf:/usr/local/etc/redis --name myredisconfigtest redis redis-server /usr/local/etc/redis/redis.conf

通过docker inspect 容器看看挂载情况,如下:

通过挂载之后,如果需要修改配置文件,只需要在主机上修改配置文件内容即可。

总结

关于容器数据卷就说到这吧,对于容器是不是感觉很给力,既有隔离又有共享,满足各种场景。下一篇来说说Dockerfile,制作属于自己的镜像,关注“Code综艺圈”,和我一起学习吧;

Docker小白到实战之容器数据卷,整理的明明白白的更多相关文章

  1. Docker系列(16)- 容器数据卷

    什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!新增一个需求:数据可以持久化 MySQL,容器删了等于删库跑路!新增一个 ...

  2. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  3. Docker小白到实战之Docker网络简单了解一下

    前言 现在对于Docker容器的隔离性都有所了解了,但对容器IP地址的分配.容器间的访问等还是有点小疑问,如果容器的IP由于新启动导致变动,那又怎么才能保证原有业务不会被影响,这就和网络有挂钩了,接下 ...

  4. docker 12 docker容器数据卷

    数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...

  5. Docker容器数据卷

    ⒈Docker容器中数据如何持久化? ①通过commit命令使容器反向为镜像 ②以容器数据卷的方式将数据抽离 ⒉容器数据卷的作用? ①容器数据的持久化 ②容器间继承.共享数据 ⒊能干嘛? 卷就是目录或 ...

  6. Docker 安装mysql容器数据卷挂载到宿主机

    环境 Centos:7 Docker: 17.05-ce Mysql: 5.7 1. Mysql外部数据和配置文件路径 msyql配置文件路径:/etc/mysql mysql数据卷路径:/var/l ...

  7. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  8. docker系列之六容器数据卷

    docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...

  9. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

随机推荐

  1. HCNA Routing&Switching之动态路由协议RIP

    前文我们了解了动态路由的基本概念,以及动态路由和静态路由的区别,优缺点,动态路由的分类,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14995317.html ...

  2. 315M、433M和2.4G笔记

    一.315M无线模块 315m无线模块广泛地运用在车辆监控.遥控.遥测.小型无线网络.无线抄表.门禁系统.小区传呼.工业数据采集系统.无线标签.身份识别.非接触RF智能卡.小型无线数据终端.安全防火系 ...

  3. python 14篇 写日志

    import sys from loguru import logger # 日志级别: debug 调试信息打印日志比较详细,级别最低 # info 正常的提示信息,级别较低 # waring 警告 ...

  4. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  5. 前端性能优化实践-gzip

    一名优秀的前端工程师必备技能之一就是要会性能监控,并且能相应的进行性能优化.最近,有需求将项目做一些优化,提升用户的体验.看了一下项目并没有开启gzip,于是着手实现gzip压缩,下面就是具体的实践过 ...

  6. Python + Requests 知识点回顾

    http://www.downza.cn/soft/11145.html PS下载地址 http://www.bejson.com/jsonviewernew/ JSON的在线视图 import re ...

  7. Leetcode1.两数之和——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入一个数组和一个整数,从数组中找到两个元素和为这个整数,输出下标![在这里插入图片描述](https://img-blog.csdnimg.cn/img ...

  8. 技术期刊 · 天光台高未百尺 | Uber 工程师的 JS 算法课;大数据时代的个人隐私;设计师的 Github;告别 PPT 工程师;从零开始实现的像素画

    蒲公英 · JELLY技术期刊 Vol.42 这是一个最好的时代,多样化的平台给了所有人成长发展的机会,各种需求和解决需求的人让人大开眼界:但这也并不是完美的时代,"前端还需要懂什么算法?& ...

  9. 聪明的YZH

    [题目描述](杨子恒大佬) 聪明的YZH又开始搭积木了-- 他用1*1*1的立方体在n*m的平面搭积木,举几个他的杰作: 现在他又搭完了一个完美的杰作,他很好奇这对积木的表面积是多大 . [输入格式] ...

  10. 编写mysql多实例启动脚本

    脚本原理: 启动MySQL动作: mysqld_safe来执行启动 停止MySQL动作: 使用mysqladmin来执行停止动作 重启的MySQL动作:    原理就是先停止,然后再启动 但是要注意: ...