容器技术的核心

所谓容器,其实是由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. 2019牛客暑期多校训练营(第三场)H题目

    题意:给你一个N×N的矩阵,求最大的子矩阵 满足子矩阵中最大值和最小值之差小于等于m. 思路:这题是求满足条件的最大子矩阵,毫无疑问要遍历所有矩阵,并判断矩阵是某满足这个条件,那么我们大致只要解决两个 ...

  2. C#托盘程序设置

    打开Microsoft Visual Studio 2010,新建解决方案--添加项目--托盘的实现     从工具栏里,把NotifyIcon控件拖到窗体上,并设置属性: 1.visible 设置默 ...

  3. 【Intellij】导出 jar 包

    需要在 Intellij 导出 jar 包,一时不知道该怎么做,后来总算找到了方法,步骤如下: 1. File → Project Structure... → Artifacts → + → jar ...

  4. c#图片的平移与旋转

    1新建文件夹,添加一个图片 2 添加控件 两个button控件 一个image控件 一个Canvas控件 3 代码实现 using System;using System.Collections.Ge ...

  5. Tomcat源码分析 (一)----- 手写一个web服务器

    作为后端开发人员,在实际的工作中我们会非常高频地使用到web服务器.而tomcat作为web服务器领域中举足轻重的一个web框架,又是不能不学习和了解的. tomcat其实是一个web框架,那么其内部 ...

  6. 2.PHP利用PDO连接方式连接mysql数据库

    代码如下 <?php$serverName = "这里填IP地址";$dbName = "这里填数据库名";$userName = "这里填用户 ...

  7. elk系列教程:docker中安装配置elk

    elasticSearch Docker安装elasticsearch: docker pull docker.io/elasticsearch:7.2.0 启动: docker run -p 920 ...

  8. Python模拟登录淘宝

    最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章!看了下网上有很多关于模拟登录淘宝,但是基本都是使用scrapy.pyppeteer.sel ...

  9. lumen 路由访问路径

    项目目录/public/index.php/接你设置的路由 比如设置了 $app->get('/test', function () use ($app) {    return $app-&g ...

  10. Yii GridView Ajax 刷新

    Yii GridView  Ajax 刷新,当页面点击一个按钮时,刷新数据. 1.控制器 <?php class privController extends Controller{ publi ...