docker容器的使用过程(详解docker容器的层的概念)
docker容器的使用过程
详解docker容器的层的概念目录
- 01 容器的一致性
- 02 层的概念
- 03 分层设计的优点
今天我们看看容器的层的概念。
上一节中,我们知道了,容器是一个进程,在这个进程的基础上,添加了下面3个部分:
1、启动Linux Namespace的配置实现与物理机的隔离。
2、设置Cgroups参数限制容器的资源。
3、生成系统文件目录,也就是rootfs文件,也叫镜像文件
这里需要备注的是:rootfs只是容器需要使用的基本文件的组合,并不包括操作系统内核,容器的操作系统内核依旧是使用宿主机的内核。当然,rootfs的存在,并不是没有意义,它的存在,使得容器拥有了一个最主要的性能:一致性。
01 容器的一致性容器的rootfs打包了操作系统的所有文件和目录,包含了所有的依赖,有了这个特性,就使得容器无论在本地、云端,用户只需要解压打包好的容器镜像,那么应用运行的环境就被搭建好了。
这就是容器的一致性。
02 层的概念"我之所以看的远,是因为我站在巨人的肩膀上",牛顿曾经这句话在今天也依旧适用。"不要做重复造轮子的人",在我们开发应用的时候,我们只需要借助Linux操作系统去开发即可,我们不需要为了跑我们的应用,重新开发一个Linux系统。
在容器的使用过程中,如果我们已经存在一个已有的MySQL容器镜像,里面有数据A;此时,其他人也想要一个MySQL容器镜像,导入他们的数据B,这个时候,我们只需要在我们自己的MySQL容器删除数据A,再重新导入数据B即可。
在上面描述的场景中,一旦删除数据A,导入数据B,那么这个容器我们自己就不能用了,因为数据A已经删除了。这显然不是我们想要的结果。很明显,数据集A和数据集B都需要的是一个安装了MySQL,但是没有数据的容器镜像(也就是rootfs)。
Docker软件在设计的时候,引入了"层"的概念,很巧妙的解决了这个问题。
"层"的概念是通过联合文件系统AuFS来实现的,全称是Advance UnionFS。它的概念不难理解,举例如下:
目录1包含文件a,文件c
目录2包含文件b,文件c
通过联合文件方式,将目录1和目录2挂在在目录3上,此时,目录3拥有文件a、b、c三个文件。
此时,如果在目录3中对文件a、b、c进行修改,对应的目录1和目录2也会生效。
如何通过"联合文件系统"实现层,这个问题其实比较复杂,留给有兴趣读者自己思考吧,这里,我们只需要了解层的概念是通过联合文件系统实现的就行。
下面是一个mysql基础镜像的"层"的例子:
[root@VM-0-14-centos ~]# docker image inspect docker.io/mysql [ { "Id": "sha256:db2b37ec6181ee1f367363432f841bf3819d4a9f61d26e42ac16e5bd7ff2ec18", "RepoTags": [ "docker.io/mysql:latest" ], ...... "RootFS": { "Type": "layers", "Layers": [ "sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c", "sha256:329fe06a30f03f9131ce8d9db2e8a9f725b18efe3457d6f015e1c4d8a3f41a0a", "sha256:ec8c80284c72bcf47ffedc0dde4d5792de761d52f974c30d37d52b9ac00e8a2a", "sha256:9dae2565e824235798981525d6ff9114817b7139c073e0d216b00ae9e58f74d0", "sha256:36b89ee4c647b9c21de8b5476b4922efc873aba69705c169e1a3edcf9128679b", "sha256:c21e35e55228365b268f57fac382a6e991db216cb03d9b7079496f5498956ab0", "sha256:15b463db445cb750fa6bc908a41fd18e38c4d2a02a978b66beb598c4f3f57b95", "sha256:7832ac00d41eda3a773a18408dea0b8e05ddbdd3a1e94afef3b6e3dc6444b7bb", "sha256:7f893b7c04ac2f939737d2da4e15af796c7acc0fd10c2951d9ae5bf33ceec2dc", "sha256:060fef62a228fff7e9dc3b7008bc9089e642ef29dc699f7e90c36ced5b2e75c6", "sha256:af6e790b82373cc65ca73efe5cc8945731525a9dcae6deeea2a5a5802561a72a", "sha256:9b0377a95c0e0bd5aa5b220449d17333faaa0e2bd7e8b93565beeadbf3906646" ] } } ]
可以看到,RootFS字样的就是容器的文件系统,Layers就是“层”。
那么一个docker容器镜像,分为哪些层呢???
按照功能的不同,主要分为只读层、init层和读写层。
只读层:
只读层的挂载方式都是只读的,这些层都是以增量的方式挂载了操作系统的一部分。
可读写层:
它是这个镜像的最顶层,它的挂载方式为读写,没有写入文件之前,这个目录是空的,而一旦在容器里面执行了写操作,你修改的内容就会通过增量的方式出现在这个层中。
init层:
init层是docker专门生成的一个内部层,主要是存放/etc/hosts、/etc/resolv.conf等文件的。
之所以存放这些特定文件,是因为这些文件本来是操作系统的一部分,但是用户的应用程序往往会修改这些文件,这些修改只对当前容器有效,我们不希望docker commit的时候,将这些改变同读写层一起提交掉。
几点注意:
1、用户执行docker commit的时候,只会提交读写层的内容。
2、如果我们要删除一个只读层文件a.txt,那么我们只需要在读写层写一个同名的文件.wh.a.txt,这样,a.txt这个文件就会被.wh.a.txt这个文件给遮挡起来,实现了删除的目的。
03 分层设计的优点通过分层设计,增量式数据操作,每次拉取、修改的内容,比完整的操作系统小;
底层只读层的共享,让多个容器镜像使用的总空间,也比每个容器镜像的总和要小;
同时,基于容器镜像的团队协作,可以将各个公司,不同领域的人联系起来,更加快速的迭代出新的功能。
以上就是详解docker容器的层的概念的详细内容,更多关于docker容器的层的资料请关注开心学习网其它相关文章!
- docker自动入门教程(Docker Machine深入详解)
- docker怎么连主机数据库(docker 安装nacos并配置数据库的教程详解)
- 日常操作docker命令(SEATA事务服务DOCKER部署的过程详解)
- docker搭建elasticsearch(docker安装ElasticSearch:7.8.0集群的详细教程)
- docker怎样安装mysql8(docker-compose安装db2数据库操作)
- docker容器内查看内存占用(docker 查看进程, 内存, cup消耗的情况)
- docker如何简化部署(Docker使用Portainer搭建可视化界面的方法)
- docker容器root密码(docker用root进入容器的操作)
- docker-compose查看服务状态(Docker+DockerCompose封装web应用的方法步骤)
- docker配置和管理(Docker 容器监控原理及 cAdvisor的安装与使用说明)
- docker启动命令大全(Docker常用命令Study03详解)
- docker 退出容器详解(Docker 使用nsenter工具进入容器的操作)
- shell监控docker各种状态(如何监控docker容器运行状态 shell 脚本)
- mongodb容器化部署映射端口访问(Docker 部署 MongoDB容器的方法)
- harbor 1.8安装部署(docker5 全功能harbor仓库搭建过程)
- dockerswarm网络模式(详解Docker Swarm概念与用法)
- 袁冰妍轧戏 拍《琉璃》的同时还在拍《将夜》,难怪被骂演技差(拍琉璃的同时还在拍将夜)
- 刚红就耍大牌,《琉璃》角色滤镜碎一地,心疼工作人员(琉璃角色滤镜碎一地)
- 袁冰妍郑业成这对可以处,有脸红情话他们是真的敢说(袁冰妍郑业成这对可以处)
- 《祝卿好》台词又土又甜,就喜欢这么直接的恋爱(祝卿好台词又土又甜)
- 大女主 汤唯垂青电视圈,搭档朱亚文出演《大明皇妃孙若微传》(汤唯垂青电视圈)
- 红色代表什么(红色代表什么情感和含义)
热门推荐
- 如何禁止按回车键提交表单
- hive分析后如何录入mysql(hive从mysql导入数据量变多的解决方案)
- 怎么把网站放进云服务器(云服务器可以放几个网站?)
- canvas图片裁剪(使用canvas压缩图片上传的方法示例)
- C#中的反射
- docker删除多个镜像命令(Docker 彻底删除私有库镜像的操作)
- dedecms标签怎么调用(DEDECMS自定义表单提交后的跳转链接修改方法)
- python怎样看字符unicode编码(Python3中编码与解码之Unicode与bytes的讲解)
- sqlcount函数转化为数值型(SQL判断是否"存在",还在用 count 操作?很耗时的!)
- css的列表符号怎么设置(reset.css引入以及1px边框问题的解决方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9