容器技术的核心

所谓容器,其实是由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. jsp数据交互(一).2

    01.什么是JSP内置对象(jsp核心)? Java 内置对象 Java  作用域 解析:jsp内置对象是web容器创建的一组对象.我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以 ...

  2. 【JS档案揭秘】第一集 内存泄漏与垃圾回收

    程序的运行需要内存,对于一些需要持续运行很久的程序,尤其是服务器进程,如果不及时释放掉不再需要的内存,就会导致内存堆中的占用持续走高,最终可能导致程序崩溃. 不再需要使用的内存,却一直占用着空间,得不 ...

  3. spark shuffle写操作三部曲之UnsafeShuffleWriter

    前言 在前两篇文章 spark shuffle的写操作之准备工作 中引出了spark shuffle的三种实现,spark shuffle写操作三部曲之BypassMergeSortShuffleWr ...

  4. 浅谈 ASCII、Unicode、UTF-8,一目了然

    对于ASCII.Unicode.UTF-8这三种编码方式我们经常用到,也经常挂到嘴边,但他们是怎么来的,为什么要存在,具体是怎么个规则,我们并没有做深入了解,下面,就带你看一下他们到底是怎么回事吧…… ...

  5. 在docker中开启新的container

    当你在启动某个容器类型的时候  如果产生了类似的错误: docker: Error: No such image: b27f5dfcfc70c16d7b135889460def6b3f831bcc72 ...

  6. Python学习系列(四)Python 入门语法规则2

    Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...

  7. Pandas 库之 DataFrame

    How to use DataFrame ? 简介 创建 DataFrame 查看与筛选数据:行列选取 DataFrame 数据操作:增删改 一.About DataFrame DataFrame 是 ...

  8. ssm访问不了后台

    最近整理ssm,写完demo案例,无论如何都访问不了后台,百度了好多,终于解决了问题所在 先看页面信息: 因为一直报404错误,一直找路径是不是弄错了,或配置文件弄错了,仅仅这个配置文件都看了无数遍, ...

  9. 100天搞定机器学习|day37 无公式理解反向传播算法之精髓

     100天搞定机器学习(Day1-34) 100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算法 本篇为100天搞定机器学习之第37天,亦 ...

  10. 微信小程序页面跳转url如何传对象参数

    两步走 首先第一步:wx.navigateTo({ url:"XXX"+"&params="+ JSON.stringify(obj); }) 第二步获 ...