Docker小白到实战之容器数据卷,整理的明明白白

前言

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

正文

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查看主机挂载的数据卷信息,如下:

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

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

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

    image-20210825175448280
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综艺圈”,和我一起学习吧;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U9在SQL Server上的性能优化经验(转述) — 之 行版本快照

此文根据用友的文档《基于SQL Server 2008构建SOA大型管理软件技术实践》“翻译”而成,非原创。在baidu上看见此文,觉得写的很好,就将原先的PPT细化一下并除去废话。 第二篇部分将的是行版本快照的隔离。 这是PPT上的图片: 图片上…

C++学习之路: 线程封装(基于对象编程)

引言&#xff1a; 此次我们重新封装线程&#xff0c; 采用基于对象编程的方式&#xff0c;不用于面向对象编程中重定义虚函数的方式&#xff0c;这里我们用回调函数的方式。 Thread.h 1 #ifndef THREAD_H_2 #define THREAD_H_3 4 #include <boost/noncopyable.hpp>5 #inc…

程序员崩溃的40个瞬间!!!

全世界只有3.14 % 的人关注了爆炸吧知识说到程序员&#xff0c;在外界眼里&#xff0c;他们是掌控代码的大神&#xff0c;他们是改变世界的王者。其实程序员的工作不容易&#xff0c;不信&#xff0c;就来看看程序员崩溃的各种瞬间——01公司实习生找bug02在调试时&#xff0c;…

是否可以将 json 反序列化为 dynamic 对象?

咨询区 jswanson&#xff1a;是否有方法可以将 json 反序列化为 dynamic 对象&#xff0c;如果可以实现的话&#xff0c;那我就可以省去很多冗余类。回答区 Tom Peplow&#xff1a;如果你用 Json.NET 的话&#xff0c;那就非常简单了。dynamic stuff JsonConvert.DeserializeO…

java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2

前言&#xff1a;在各类网站论坛上,没有找到与工作比较贴切的技能,所以特此写一些对刚步入工作或者工作中没有重视的技能与问题,各位大牛请及时关闭文章.ps1&#xff1a;文中所有标点都是英文的,看官请不要在意.为了便于平时敲代码,所以中文输入法也默认了英文标点(防止各类因为…

Matlab学习------------带有右键菜单的GUI学习实例

实例步骤&#xff1a; 须要设置UIContextMenu&#xff0c;否则点击右键不显示。 右键点击第一个菜单之后&#xff1a;&#xff08;在菜单中加入对应的回调函数&#xff09; function r1_Callback(hObject, eventdata, handles) % hObject handle to r1 (see GCBO) % eventda…

多方位助您快速精准查阅文献和发文章的利器——X-MOL

全世界只有3.14 % 的人关注了爆炸吧知识无论您看文献的习惯是怎样的&#xff0c;X-MOL都有一种为您节省时间的功能:01根据参考文献一键直达全文—— X-MOL文献直达复制文章题录信息&#xff08;如“PNAS, 2020, 117, 6771-6776”&#xff09;或DOI&#xff0c; 粘贴到X-MOL首页…

关于Session的使用和优化

优点 如果要在诸多Web页间传递一个变量&#xff0c;那么用Session变量要比通过QueryString传递变量可使问题简化。 要使WEb站点具有用户化&#xff0c;可以考虑使用Session变量。你的站点的每位访问者都有用户化的经验&#xff0c;基于此&#xff0c;随着LDAP和诸如MS Site Ser…

ASP.NET Core端点路由中三种让人困惑的路由函数

早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和路由&#xff0c;其核心目的是将请求落地点与路由寻址方式解耦。《ASP.NET Core端点路由作用原理》这里面有几个容易混淆的函数•MapControllerRoute•MapDefaultControllerRoute•MapControllers有什么不同&#x…

java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

Java 环境变量和路径在 Solaris 系统上&#xff0c;必须先设置 JAVA_HOME 和 PATH 环境变量&#xff0c;Sun Management Center 3.6 安装向导、设置向导和 Java 控制台才能正常工作。与此类似&#xff0c;要使 Sun Management Center Java 控制台在 Microsoft Windows 上正常工…

电脑温度检测软件哪个好_实时检测Mac电脑的温度

想要实时检测Mac电脑的温度吗&#xff1f;那就来试试这款Temperature Gauge Pro吧。Temperature Gauge Pro又名为TG Pro&#xff0c;是一款专业的Mac实时温度的软件。这款软件能够帮助大家进行Mac中的风扇控制、温度监控和硬件诊断等功能&#xff0c;帮助大家更好的维护自己电脑…

【转】SQL SERVER 存储过程学习笔记

原文地址&#xff1a;http://www.cnblogs.com/nina-piaoye/archive/2006/09/18/507183.html 将常用的或很复杂的工作&#xff0c;预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命…

我一哥们,在东莞和五名女孩被抓了.....

1 人在东莞&#xff0c;与五名女子一起被抓现已失联▼2 羊&#xff1a;我有一句MMP&#xff0c;不知当讲不当讲▼3 这是在上网查下一步应该怎么做&#xff1f;▼4 人生处处是惊喜▼5 看似平平无奇的棉签▼6 陈独秀同学&#xff0c;有话你站在桌子上说▼7 现在的玩具都这…

取奇偶数

#取奇数……1..20|?{$_ % 2 -eq 1} #取偶数……1..20|?{$_ % 2 -eq 0} #取1、4、7、10……1..20|?{$_ % 3 -eq 1}转载于:https://www.cnblogs.com/dreamer-fish/p/4024198.html

【成长点滴】对SMART原则的一些粗浅理解

【成长点滴】对SMART原则的一些粗浅理解 以下解释来自百度百科 “所谓SMART原则&#xff0c;即是&#xff1a; S&#xff1a;(Specific) 目标要清晰、明确&#xff0c;让考核者与被考核者能够准确的理解目标&#xff1b;M&#xff1a;(Measurable) 目标要量化&#xff0c;考核时…

太神奇了!使用C#实现自动核验健康码:(2)OCR识别

前言上次太神奇了&#xff01;使用C#实现自动核验健康码&#xff1a;(1)二维码识别&#xff0c;我们已经实现了识别健康码的颜色&#xff0c;但是健康码的内容不包含时间属性。那么使用图片就可以通过检查&#xff0c;肯定是不合适的。因此&#xff0c;我们还需要读出健康码上方…

多个数求平均数java_[分享]求任意个数的平均数!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼自己编的小程序:import java.util.*;class notsure{private double numlist[];public notsure(double ... list)/*此数组个数可任意.*/{numlistlist;}public double doit(){double result0;if(numlist.length!0){int sum0;for(doub…

bo耳机h5使用说明_真香时刻·性价比大旗——红米AirDots2 TWS真无线耳机体验测评...

TWS真无线耳机经过了这几年的发展&#xff0c;在音质、连接稳定性、易用性等方面都有了长足的发展&#xff0c;价格也从最早的上千元下探到了数百元&#xff0c;真正从发烧玩家的尝鲜设备变成了大众的日常用品。我用过的TWS耳机不下数十个&#xff0c;但即使是如Bose、B&O等…

卖股技巧

买对股票只完成投资过程的一半或更少&#xff0c;接下来就是跟踪个股&#xff0c;并在股价大幅上涨之后卖掉股票&#xff0c;所以如何卖股票至关重要。笔者通过长期的研究&#xff0c;总结出了卖股的五大技巧。 技巧一&#xff1a;低于买入价8&#xff05;-9&#xff05;坚决止…

这个行业人才紧缺,就业率超高!未来大有可为!

全世界只有3.14 % 的人关注了爆炸吧知识近几年&#xff0c;伴随人工智能的兴起&#xff0c;数据分析师、算法工程师等职业也迎来需求高峰。时下人工智能是炙手可热的一个行业&#xff0c;2015-2018年&#xff0c;中国人工智能产业市场规模从112.4亿元增长至415.5亿元&#xff0…