深入理解Docker(基础技术)

深入理解Docker(基础技术),第1张

深入理解Docker(基础技术) Linux Namespace

Linux Kernel的一个功能,可以隔离一系列的系统资源:UTS、mount、PID、User、Network等。

UTS

UTS Namespace主要用来隔离nodename和domainname两个系统标识。在UTS Namespace中,每个Namespace运行有自己的hostname。

mount

用来隔离各个进程看到的挂载点视图。在不同Namespace进程中,看到的文件系统层次是不一样的。在mount namespace中调用mount()和umount()仅仅只会影响当前namespace内的文件系统,对全局的文件系统是没有影响的。即mount namespace在子进程中重新mount了/proc文件系统

PID

Namespace建立系统的不同视角,从用户角度来看,每个命名空间都应该像一个单独的Linux,A和B空间都有PID为1的init进程。子命名空间的进程映射到父命名空间的进程上,父命名空间知道每一个子命名空间的运行状态,而子命名空间之间是隔离的。

User

使用Namespace可以做到UID级别的隔离,也就是说可以为UID为n的用户虚拟化出一个Namespace,在这个Namespace中,用户是有root权限的,但是在真实的物理机上,他还是那个UID为n的用户。

IPC

IPC:共享内存、信号量、消息队列等;隔离开只让同一个Namespace下的进程才能互相通信;IPC需要有一个全局的ID,Namespace对这个ID隔离,不能让其他Namespace的进程看到

IPC Namespace用来隔离System V IPC和POSIX message queues。每个IPC Namespace都有自己的System V IPC和POSIX message queue

Network

用来隔离网络设备、IP地址端口等网络栈的Namespace

可以让每个容器拥有自己独立的网络设备,而且容器内的应用可以绑定到自己的端口,这样不会互相冲突

Linux网络虚拟化技术

Linux Cgroup

Namespace主要解决了环境隔离的问题,但是计算机资源的使用问题没有解决,比如进程中使用CPU、内存、磁盘等计算资源是随心所欲的。Linux Cgroup就解决了进程资源利用上的限制或控制。

Linux Cgroups(Control Groups),控制与分离一个进程组群的资源(CPU、内存、磁盘输入输出、网络带宽)。通过Cgroups,可以方便的限制每个进程的资源占用,并且可以实时地监控进程地监控和统计信息,甚至在运行中的系统中也能动态配置cgroup

功能:

  • Resource Limitation:限制资源使用,比如内存使用上限以及文件系统的缓存限制

  • Prioritzation:优先级控制,比如CPU利用和磁盘IO吞吐

  • Accounting:一些审计或一些统计,主要用于计费

  • Control:挂起进程,恢复执行进程

Cgroup子系统
  • cgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem的系统参数关联起来

  • subsystem是一组资源控制的模块

    • blkio设置对块设备(如硬盘、USB)输入输出的访问控制

    • cpu设置对cgroup中进程的CPU被调度的策略

    • cpuacct可以统计cgroup中进程的CPU占用

    • cpuset 为Cgroup中的任务分配独立CPU(多核)和内存节点

    • devices可以允许或者拒绝cgroup中的任务访问设备

    • memory设定任务使用的内存限制,自动生成内存使用报告

    • net_cls使用等级标识符(classid)标记网络数据包,可允许linux流量控制程序(tc)识别从具体cgroup中生成的数据包

    • net_prio用来设计网络流量的优先级

    • hugetlb针对HugeTLB系统进行设计,这是大页文件系统

术语
  • tasks,任务,就是系统的一个进程

  • control group,控制组,cgroup的呈现就是一个目录带一系列的可配置文件

  • hierarchy,层级,控制组可以组织成hierarchical,即一颗控制组的树(目录结构)。控制树上的子节点;即hierarchy就是在一个或多个子系统上的cgroups目录树

  • subsystem,子系统,一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都会受到这个子系统的控制。

三个组件:cgroup控制组、hierarchy层级、subsystem子系统

三个组件之间的关系:

  • 一个subsystem只能附加到一个hierarchy上

  • 一个hierarchy可以附加多个subsystem

  • 一个进程可以作为多个cgroup的成员,但是这些cgroup必须在不同的hierarchy中

  • 一个进程进行了fork,子父进程是在同一个cgroup中的,也可以根据需要将其移动到其他cgroup中

文件系统

Linux文件系统由两部分组成:

  • bootfs:bootloader+kernel

  • rootfs:包含典型linux系统中的/dev /proc /bin /etc等标准目录和文件

传统的Linux加载bootfs时会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write,然后我们就可以在rootfs上进行写和读的 *** 作了。

但Docker的镜像却不是这样,它在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。在加载了这么多层的rootfs之后,仍然让它看起来只像是一个文件系统,在Docker的体系里把union mount的这些read-only的rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行 *** 作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

联合文件系统的解决方案有以下几个:AUFS、DeviceMapper、Btrfs、OverlayFS

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5504328.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存