容器技术的核心

所谓容器,其实是由Linux Namespace、Linux Cgroups和rootfs三种技术构建出来的进程的隔离环境

对于Docker项目来说,其实最核心就是为待创建的用户进程:

  1. 启动Linux Namespace配置
  2. 设置指定的Cgroups参数
  3. 切换进程的根目录(Change Root)

1. Namespace机制

PID Namespace实现创建(clone)出来的进程,认为自己的当前容器里PID为1的进程,看不到宿主机的真正的进程,也看不到其他PID的具体情况

Mount Namespcace实现被隔离的进程只能看到当前Namespace的挂载点信息

Network Namespace实现让被隔离进程看到当前Namespace的网络设备和配置

Linux提供了UTS、IPC、User的Namespace

总结 :Namespce技术修改了应用进程看待整个计算机的“视图”,只能看到某些指定的内容

Namespace隔离机制的不足:

多个容器使用的是同一个宿主机的操作系统内核,windowns上运行Linux容器,或者在低版本的Linux宿主机上运行高版本的Linux容器,是不行的

2. Cgroups

虽然进程被隔离起来了,但是它所能使用的资源,比如CPU、内存,是可以被宿主机上的其他进程占用的,也可以将所有的资源耗尽,而Cgroups解决了这个问题

Cgroups全称是Linux Control Group,主要作用就是限制一个进程能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。

Cgroups的缺点:

/proc文件不知道用户通过Cgroups给容器做了什么资源限制,所以当我们在容器里执行top命令的时候,看到的其实是宿主机的CPU和内存数据

3. rootfs

容器的根目录通常会挂载一个完整的文件系统,在容器启动后就可以用ls /查看根目录所有的内容,

这个挂载在容器根目录,为容器提供隔离后执行环境的文件系统,就是rootfs(容器镜像),

容器镜像中,通过会包括如下目录和文件

bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var

rootfs只是一个操作系统的所有文件和目录,并不包含内核,通过Mount Namespace和rootfs,可以构建出一个完善的文件系统隔离环境,其中使用了chroot和pivot_root两个系统调用切换进程根目录的能力。

在mount namespace被创建后,父进程会把自己的文件结构复制给子进程,而子进程中新的namespace所有的mount操作都只影响自身的文件系统,不对外界产生任何影响。

每次修改rootfs,新的rootfs和旧的就不同了,Docker公司为了解决rootfs的增量修改的功能,创新的提出了层的概念

容器中的层的概念

在rootfs的基础上,Docker公司创新的使用了多个增量rootfs联合挂载一个完整rootfs的方案

例如,C目录是由A和B挂载得到,拥有A和B的所有文件

层分为三种,如下图

1.只读层

位于rootfs最下面,挂载方式是只读,这些层以增量的方式分别包含了操作系统的一部分

2.可读写层

挂载方式为rw,比如,当删除只读的一个xx文件时,这个删除操作实际只是在可读写层创建了一个名叫.wh.xx的文件,当两个层联合挂载后,xx文件会被.wh.xx文件遮挡,相当于“消失了”

在容器中修改文件时,Docker会从上到下在各镜像层中查找文件。找到后会把此文件复制到容器层(可读写层),这就是Copy on Write

3. init层

以一个-init结尾的层,在只读和读写层之间,用来存放/etc/hosts、/etc/resolve.conf等信息,这此文件本来是属于操作系统层的一部分,但是用户往往需要在运行时指定hostname,所以就需要在可读写层修改,这些修改往往保对当前容器有效,我们并不想在docker commit的时候,把这些和读写层一起提交,于是就有了这一层

参考链接:https://coolshell.cn/articles/17010.html

Docker容器技术的核心的更多相关文章

  1. Docker容器技术的核心原理

    目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...

  2. k8s 核心功能 - 每天5分钟玩转 Docker 容器技术(116)

    本节带领大家快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新. 部署应用 执行命令: kubectl run kubernetes-bootcamp \ --im ...

  3. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

  4. Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)

    本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usag ...

  5. 如何快速部署 Prometheus?- 每天5分钟玩转 Docker 容器技术(85)

    上一节介绍了 Prometheus 的核心,多维数据模型.本节演示如何快速搭建 Prometheus 监控系统. 环境说明 我们将通过 Prometheus 监控两台 Docker Host:192. ...

  6. 学习 Kubernetes 的 Why 和 How - 每天5分钟玩转 Docker 容器技术(114)

    这是一个系统学习 Kubernetes 的教程,有下面两个特点: 系统讲解当前最流行的容器编排引擎 Kubernetes包括了安装部署.应用管理.网络.存储.监控.日志管理等多各个方面. 重实践并兼顾 ...

  7. 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)

    据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数 ...

  8. 定时执行 Job - 每天5分钟玩转 Docker 容器技术(135)

    Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job.CronJob 配置文件示例如下: ① batch/v2alpha1 是 ...

  9. Docker容器技术的PaaS云平台架构设计***

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...

随机推荐

  1. Linux文件系统损坏导致无法正常启动与fsck修复工具

    今天在打开自己的虚拟机学习的时候,发现在文件系统检查过程中出现以下的报错: /dev/mapper/VolGroup-lv_root:UNEXPECTED INCONSISTENCY;RUN fsck ...

  2. 洛谷P1003 题解

    题面 思路一:纯模拟.(暴力不是满分) 思路: 1.定义一个二维数组. 2.根据每个数据给二维数组赋值. 3.最后输出那个坐标的值. 思路二(正规思路): 逆序找,因为后来的地毯会覆盖之前的,一发现有 ...

  3. 【Maven】Mac 使用 zsh 后 mvn 命令就无效

    RT -- 解决方法: 打开 .zshrc 文件,将 Maven 环境变量配置加入其中,或者 将 source ~/.bash_profile 添加到 .zshrc 中. PS: 之前搞不懂,每次使用 ...

  4. 【iOS】ERROR ITMS-90032: "Invalid Image Path...

    用 Application Loader 提交苹果审核时出现了这个问题,具体如下: ERROR ITMS-: "Invalid Image Path - No image found at ...

  5. Something wrong with EnCase v8 index search results

    My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...

  6. c#小灶——数据类型

    C#中有许多数据类型,存储不同的数据要用不同的数据类型.我们这里面向初学只介绍值类型,引用类型和指针类型在后续的学习中会有接触. 整型 int是最常用的整型,用来存储整数.除了int之外,还有其他不常 ...

  7. 『开发技术』GPU训练加速原理(附KerasGPU训练技巧)

    0.深入理解GPU训练加速原理 我们都知道用GPU可以加速神经神经网络训练(相较于CPU),具体的速度对比可以参看我之前写的速度对比博文: [深度应用]·主流深度学习硬件速度对比(CPU,GPU,TP ...

  8. python面试总结1(基础章节)

    python语言基础 语言特点 python是静态还是动态类型?是强类型还是弱类型 动态强类型语言 动态还是静态指的是编译期还是运作期确定类型 强类型指的是不会发生隐式类型转换 python作为后端语 ...

  9. Spring基础笔记

    Spring带给了我们什么便利? 注解版本的IOC如何玩? 组件注册 组件注册的过程中有哪些过滤规则? 如何控制组件的作用域(单例多例)? 六种注册组件的方式? 生命周期 什么是bean的生命周期 在 ...

  10. 《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...