linux怎么查看本机内存大小
355
2022-10-23
运维技术栈-Docker原理
Docker
在Docker之前,VM(VirtualMachine)技术,实现了虚拟化,这种虚拟化的实现是通过基于当前OS的一部分硬件资源,模拟出另一个虚拟OS的手段实现,显而易见,这种手段带来的代价是系统资源的占用,从创建到运行的过程也是耗时比较长的;这时,Docker结合Linux本身自有的隔离技术NameSpace、Cgroup、Union FS等技术创造出了独特的容器隔离技术。
Docker的架构
其中,可以看出containerd是docker 对容器的管理和操作的核心模块。Containerd所做的事情是,通过为每个容器子进程构建一个父进程shim,而shim的父进程是OS的systemd进程,从而规避掉了自身重启导致的容器子进程被强行结束所带来的问题。
那么,containerd 是什么呢?
Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。详细点说,Containerd 负责干下面这些事情:
管理容器的生命周期(从创建容器到销毁容器)拉取/推送容器镜像存储管理(管理镜像及容器数据的存储)调用 runC 运行容器(与 runC 等容器运行时交互)管理容器网络接口及网络
说的简单一点,Container的作用就是负责把镜像跑起来,负责镜像的pull/push,以及相关的其他能力。
为什么docker要多此一举,把 containerd独立出来呢?
我们可以从下面几点来理解为什么需要独立的 containerd:
继续从整体 docker 引擎中分离出的项目(开源项目的思路)可以被 Kubernets CRI 等项目使用(通用化)为广泛的行业合作打下基础(就像 runC 一样)
同时,在引入containerd之前,docker使用docker daemon作为核心时,存在一个缺陷,就是每次docker版本时,会因为升级必须结束掉daemon,而daemon作为父进程所fork出来的容器子进程必会受到影响,中断运行。通过containerd的引入,成功地解决掉了这个问题。
为了支持容器解决方案,Linux基金会主导开发了OCI规范和标准。OCI 轻量级开放式管理组织Runtime Specification 规范文件系统包如何解压至硬盘,供运行时运行Image Specification 规范如何通过构建系统打包,生成镜像清单(Manifest)、文件系统序列化文件、镜像配置
为了便于不同企业之间容器化技术对接,定义了该标准,该标准定义了容器化的方式,从而实现对接引入的简化。containerd也是为遵循这一标准而设计。
Namespace
namespace 可以隔离 pid(进程ID)、net(IP、网络设备、路由表)、ipc(进程间交互方法,包括常见的信号量、消息队列、共享内存)、mnt(文件目录)、uts(实现独立的host name、domain name)、user(用户),通过namespace这些特性,实现了docker的进程的隔离。
Cgroups
Linux用于对一个或一组进程进行资源控制和监控的机制,这些资源包括CPU、内存、磁盘IO。
多个进程共享CPU并不是每个进程独享一个内核这样理解,实际上,系统是通过为每个进程分配使用CPU的相对值,从而实现多个进程共享CPU资源的。那么Cgroups的原理,就是限制目标进程使用CPU的时间,从而实现CPU资源的隔离。
对于memory的使用限制,也同样是cgroups来管理。
Docker借助于Cgroups,便实现了容器硬件资源的分配,这就可以理解,在为容器限制了CPU资源的情况下,即便一个容器运行时耗尽了CPU,也不需要担心主机的CPU被耗光。
Docker 默认通过cgroupfs做为cgroup驱动,而kubernetes默认通过systemd作为驱动,但docker同时也可以切换为systemd驱动,所以为了避免不一致带来的问题,在结合k8s使用时需要将docker改为systemd驱动。
Union FS
将不同的目录挂载到同一个文件系统下支持为每一个成员目录设定readonly、rw以及whiteout-able权限文件系统分层,对readonly权限的branch可以逻辑上进行修改(增量的,不影响readonly部分的)通常UnionFS有两个用途,一个是可以将多个disk挂载到同一个目录,一个是将一个readonly的branch和一个writeable的branch联合
写时复制
一个镜像可以被多个容器使用,但是不需要在内存和磁盘上做多个拷贝。在需要对镜像提供的文件进行修改时,该文件会从镜像的文件系统被复制到容器的可写层的文件系统进行修改,而镜像里面的文件不会改变。不同容器对文件的修改都相互独立、互不影响。
用时分配
按需分配空间,而非提前分配,即当一个文件被创建出来后,才会分配空间。
OverlayFS
用于把多个不同的文件目录合并挂载成一个目录, upperdir 处于上层,会覆盖掉lowerdir
mount -t overlay overlay -o lowerdir=xxx upperdir=xxx workdir=xxx together
网络
网桥和NAT模式(主机内网络访问)
启动docker daemon,docker会创建网桥,通过iptables查看路由规则可以看到;
启动容器时,docker会创建veth的虚拟网卡设备
此时,针对每个容器,veth一端连接网桥,另一端连接容器内eth0,
而宿主机上的网桥通过iptables创建DNAT到主机IP的路由,将来自各个veth的流量转发到主机eth0
跨主机网络打通
Underlay(跨主机网络访问)
预留IP段并分配给容器,该IP段物理机可以识别并能正常访问,从而实现跨物理机的容器之间网络连通
Overlay(隧道模式)
将流量数据包进行封包,增加对应主机的IP地址,再进行物理机间的转发,走物理机网卡,这个原理类似于LVS的隧道模式。
Flannel下,通过处于物理机与容器之间的flanneld的中间角色,进行该类包的封装与解析,并进行UDP转发,从而实现跨物理机的容器连通
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~