引用:http://www.thinkphp.cn/topic/33316.html
现在就开始今天的分享~
M老师:docker 的很多特性都表现在它所使用的文件系统上,比如大家都知道docker的文件系统是分层的,所以它可以快速迭代,可以回滚。这个回滚机制跟github很像,每次提交的时候都会有一个id, 回滚就是跟据这个id来操作的。
M老师:docker所支持的文件系统有以下几种:Aufs、devicemapper、btrfs和Vfs,其中前三种是联合文件系统,可以支持分层,VFS 不支持。平时用的最多的是aufs 和devicemapper。
M老师:先介绍一下Aufs,Aufs(advanced multi layered unification filesystem), 直译过来就是高级分层联合文件系统,做为一种Union FS ,它支持将不同的目录挂载到同一个虚拟文件系统下。
M老师:这个怎么理解呢,通过一条命令我们来看一下:
mount -t aufs -o br=/tmp/dir1=ro:/tmp/dir2=rw none /tmp/newfs
M老师:大家有条件的可以一起做下实验,方便理解,-o 指定mount传递给文件系统的参数;br 指定需要挂载的文件夹,这里包括dir1和dir2;ro/rw 指定文件的权限只读和可读写;none 这里是挂载的设备,而没有设备用none表示。
M老师:为什么要有只读和可读写两种呢,因为docker在启动容器的时候就会用到这两种,而上面这个例子是模拟这个docker文件系统模型。
问:启动docker的时候,对硬盘使用只读,意义在于什么?
答:这个问题很好,一个image可以启动多个container,这时候会有一个问题,如果每个container对大家共有的部分都有可写的权限,就会出问题。所以docker启动的时候会加载镜像的文件系统那层是只读的,然后每个contianer 获取自己的可读写的层,如果container要修改只读层的文件,那么该文件就会从只读层提取到读写层。只读层的文件就被读写层的文件覆盖了,但只读层的那个文件依然存在 这个就实现了文件系统上的隔离。
问:就像我们写程序抵触共享的东西不变,只是利用这个共性来底层共享?
答:是的。
问:加那个none是干什么用的?
答:none 这里没有设备,用none表示,其实是没有意义的。但命令要求要有一个设备,这条命令中设备是none
问:这个命令是在容器里执行的吗?还是在宿主机?
答:容器。
M老师:继续咱们的分享,刚才实验的结果是什么样子呢,就是把/tmp/dir1和/tmp/dir2 合并之后挂载到/tmp/newfs,如果这时在/tmp/dir1 下创建一个文件a,/tmp/dir2下创建一个文件b 则 在/tmp/newfs 会看到a,b 这两个文件,这就是联合,并且a文件是只读的。
M老师:如果有相同的文件则以先挂载的为准,后面挂载的操作会被忽略掉。大家可以想像一下,我每做一次操作都相当于去挂载一个新的目录,这样所有的操作就保存下来了。当然实际情况并不是每次操作都去挂载。当container 发生改变的时候,并且我提交commit 才会重新挂载一层。
问:比如mkdir test 这也算是重新挂载了一层?
答:docker有一个命令docker commit,执行这个的时候会重新挂载一层。
M老师: 可能还会有一些不理解,下面用实际的docker 镜像来举个例子。大家启动一个container 之后,执行 docker save,可以把container保存成镜像。
例如:
docker save
cloud_jiankongbao:01.tar
cloud_jiankongbao:01
其中cloud_jiankongbao:01.tar是镜像的名字,后面的cloud_jiankongbao:01是这个container的ID,可以看到,保存下来的是tar 包。 不是.iso文件^_^
M老师:镜像解压之后是什么呢,我们来看一下:
ls .
a005304e4e74c1541988d3d1abb170e338c1d45daee7151f8e82f8460634d329
d9bde94c518a16a886514758b6b4431200145ecd58e30c5633ac3c0256544d77
f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
fb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f
里面有四个目录,其实分别是4个docker的ID,每次使用docker commit 提交对docker的修改之后就会产生一个新的id,就是通过这个ID实现对镜像的回滚。
M老师:这4个目录之间是有关系的。这个关系可以通过docker image --tree 来查看。
docker images --tree
└─f1b10cd84249 Virtual Size: 0 B
└─fb9cc58bde0c Virtual Size: 203.1 MB
└─a005304e4e74 Virtual Size: 203.1 MB
└─d9bde94c518a Virtual Size: 1.957 GB Tags: cloud_jiankongbao:01
M老师:每个目录下有json layer.tar VERSION 这三个文件,我们现在只研究他们的结构,所以只看layer.tar 这个文件。
M老师:我们到一个目录下把layer.tar 解压一下
dfb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f;tar -xflayer.tar;ls
ls fb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f/
binetcjsonliblost+foundmntprocsbinsrvtmpvar
devhomelayer.tar lib64 mediaopt root selinux sys usr VERSION
问:为什么会提交四次?
答:提交4次是我们自己提交的.
M老师:在使用docker的过程中我们需要保存自己的修改,docker commit 执行完之后就把container中的内容回写到镜像中了,就相当于加了一层文件系统,每次提交后就生成了一个新的镜像。4个ID是4次提交的镜像的ID,这4个ID 其实相当于一个镜像的4个tag。我们再看一下4个镜像ID的系统:
f1b10cd84249 这个镜像是初始镜像,大小为0
fb9cc58bde0c 这个镜像是在f1b10cd84249基础上创建新的镜像;
a005304e4e74是以fb9cc58bde0c为基础创建新的镜像,是树状继承的关系;
M老师:我们再看一下不同ID目录下的bin 目录。
ls a005304e4e74c1541988d3d1abb170e338c1d45daee7151f8e82f8460634d329/bin/
gtar tar
a005304e4e74只有两个文件,fb9cc58bde0c包括了大部分bin下的文件,对应的场景是 fb9cc58bde0c,是装好操作系统, 然后我又装了tar这个工具。docker commit提交之后,就是a005304e4e。
问:可以认为fb9cc58bde0c是一个最小化的OS
答:可以这么理解。
M老师:最后简单说一下devicemapper,回到最开始说的,docker支持多种文件系统。devicemapper是利用了Snapshot 和Thinly-Provisioned Snapshot两种原理,将多个快照挂在同一个卷下从而实现文件系统的分层。这里的快照技术其实就是vm中的快照。
M老师:刚才说的autofs 是将不同的目录挂到一个虚拟目录,devicemapper 就是把多个快照挂载到同一个卷下,不过使用devicemapper 的话,一个container的大小最大只能是10G,启动docker daemon时用参数-s 指定:
docker -d -s devicemapper
M老师:当容器基于镜像启动之后,每个容器都会获得自己的写读可写的文件系统层。原镜像的那部分文件系统是只读的,从而实现每个容器的在文件系统上的隔离。
问:autofs 最大一个container是多大?
答:没有限制,直到物理服务器没有资源,但通常不会将数据库和LOG保存在镜像中,所以也不会写的太大,因为docker本身是轻量级的。
M老师:平时大家都在说dokcer 是弱隔离的,因为他没有隔离的很彻底,比如内核是跟大家共用的,跟宿主机共用同一个内核。SELinux、 Cgroups以及/sys、/proc/sys、/dev/sd*等目录下的资源是与宿主机共用的。如果要隔离的彻底那就是VM了,而且如果dockers要想实现这些隔离就必然要牺牲一下现在轻量级的特性。
M老师:好吧,今天的分享就到这里了,谢谢大家!
相关推荐
。。。
。。。
容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。...
- **UnionFS (AUFS)**:用于文件系统的分层合并。 - **Quota**:用于磁盘配额管理。 除了上述技术外,还有一些开源项目致力于轻量虚拟化的管理和安全方面,例如: - **LXC (Linux Containers)**:一种轻量级容器...
文件系统联合挂载采用类似AUFS的分层Layer结构,提供统一视图。 Azure Stack部署Docker Swarm Mode时,需要注意ARM模板的选择。原始模板可能只支持单个Master节点,但通过修改定制扩展脚本并利用ACS-Engine,可以...
3. **Union File System (Aufs)** 或者 **overlayfs**:一种分层、轻量级并且高性能的文件系统,用于构建容器镜像。 4. **Linux Kernel**:提供底层支持,确保容器之间的隔离性和安全性。 #### Docker的关键优势 -...
JDOS负责基础设施资源管理、容器生命周期管理和监控指标采集,利用OpenStack、Docker、JFS(分布式文件系统)和OVS(Open vSwitch)构建基础平台。CAP则专注于应用治理、部署、监控报警、资源利用率统计以及弹性伸缩...
Java商城系统通常采用分层架构设计,包括表现层(UI)、业务逻辑层(Service)、数据访问层(DAO)以及实体模型(Entity)。这种架构模式有利于代码复用,提高系统的可维护性。此外,Spring Boot框架常被用于快速...
- **文件系统分层**:支持overlayfs等多种文件系统分层技术,提高容器存储的效率和性能。 #### 四、研发与运维的变革 ##### 1. 研发关注点的变化 - **传统要素**:功能与性能、稳定性、可扩展性、可测试性。 - **...
2. **操作系统原理**:熟悉各种操作系统(如Windows、Linux、Unix)的内部机制,包括进程管理、内存管理、I/O管理和文件系统。理解操作系统的调度策略、内存分配策略以及对系统性能的影响。 3. **网络协议与架构**...
这种分层设计有利于代码的重用和维护,同时也提高了系统的可扩展性。 二、功能模块设计 1. 用户管理:包括用户注册、登录、权限分配等功能,确保不同角色(如学生、教师)拥有相应的操作权限。 2. 实验资源管理:...
作为一个独立的守护进程,containerd运行在主机操作系统上,它与容器编排系统如Docker Swarm、Kubernetes等集成,提供底层的容器运行时支持。 **主要功能:** 1. **容器镜像管理**:containerd支持高效的镜像分层...
容器技术依赖Linux系统的NameSpace、Cgroups和文件系统镜像分层等机制,通过这些技术实现了资源隔离、空间隔离以及跨平台的打包和部署。NameSpace保证了容器的运行环境独立,Cgroups则确保了资源的有效管理和隔离。 ...
- **MyBatis**:持久层框架,负责与数据库的交互,通过SQL映射文件实现灵活的SQL操作。 2. **数据库设计** - **SqlServer**:作为数据库管理系统,SqlServer提供了强大的数据存储和管理能力,支持事务处理、并发...
2. **分布式存储**:使用分布式文件系统,如Hadoop HDFS,来处理大量媒体数据。 3. **云服务集成**:结合云存储和计算服务,实现弹性伸缩和降低成本。 三、关键技术 1. **云计算**:利用云服务提供弹性的计算和...
- **Docker Compose**:容器编排,一键部署整个系统。 - **Jenkins**:持续集成/持续部署工具,自动化构建和发布流程。 - **Prometheus+Grafana**:监控系统性能,及时发现和解决问题。 6. **代码资源** 压缩包...
Docker需要文件系统层提供Copy on Write(CoW)功能,目前btrfs、aufs、overlayfs等文件系统层技术以及device mapper等块设备层技术均被考虑在内。overlayfs作为一种特殊的文件系统层技术,其内核dentry的合并、工作...
在系统设计上,可能会遵循软件工程中的分层架构,包括表现层(视图)、业务逻辑层(控制层)和服务层(模型)。表现层负责与用户交互,业务逻辑层处理业务规则和操作,服务层则封装数据库操作。此外,考虑到安全性和...
8. **部署与运行**:项目完成后,通常打包为WAR文件部署到Tomcat、Jetty等Web服务器上,或者通过Docker容器化部署,以实现环境隔离和资源优化。 综上所述,【SSM项目源码】分数管理系统是一个综合运用Spring、...
- **应用场景**:常见于分布式文件系统(DFS)和区块链技术。 - **优点**:提高了系统的可靠性和容错性。 #### 二十年来分布式架构的演进历程 过去二十年,分布式系统架构经历了从单一应用程序到复杂微服务架构...