1. 相关内核知识

docker本质上是宿主机上的进程。

通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制机制copy-on-write实现高效文件操作。

依赖kernel版本3.10+

1.1 namespace

namespace的6项隔离:
UTS——主机名与域名
IPC——信号量、消息队列、共享内存
PID——进程编号
Network——网络设备、网络栈、端口等
Mount——挂载点(文件系统)
User——用户和用户组

1.2 cgroups

它可以限制被namespace隔离起来的资源,还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等。

本质上来说,cgroups是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

cgroups的作用:
(1)资源限制——可以限制任务使用的资源总额。
(2)优先级分配——通过分配的CPU时间片数量及磁盘IO带宽大小,实际上就相当于控制了任务的优先级。
(3)资源统计——可以统计系统的资源使用量,如CPU使用时长、内存用量等。
(4)任务控制——可以对人物执行挂起、恢复等操作。

cgroups的组织结构:
(1)任务task——linux内核本身的调度和管理并不对进程和线程进行区分,只根据clone创建时传入的参数不同来从概念上区分,所以统一称为任务。
(2)控制组cgroup——cgroups中的资源控制都以cgroup为单位实现。cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。
(3)子系统subsystem——cgroups中的子系统就是一个资源调度控制器。
(4)层级hierarchy——层级由一系列cgoup以一个树状结构排列而成,每个层级通过绑定对应的子系统进行资源控制。

传统的Unix任务管理,先启动init任务作为根节点,再由init节点创建子任务作为子节点,形成树状结构。而系统中的多个cgroup构成的层级并非单根结构,可以允许多个根。

子系统实际上就是cgroups的资源控制系统,共有9种:
(1)blkio——块设备
(2)cpu——cpu资源
(3)cpuacct——cpu资源使用情况报告
(4)cpuset——可以为cgroup中的任务分配独立的CPU(针对多处理器)
(5)devices——可以开启或关闭cgroup中任务对设备的访问
(6)freezer——可以挂起或恢复cgroup中的任务
(7)memory——内存资源控制及报告
(8)perf_event——性能测试
(9)net_cls——cgroup中的任务创建的数据报文的类别标识符

2. 容器引擎发展

容器是一个与宿主机系统共享内核但与系统中的其他进程资源相隔离的执行环境。

根据得到的信息,容器引擎在宿主机上创建namespace以及相应的cgroups配置。

lxc——>libcontainer——>runC

docker早期就是对lxc的封装,后来产生了libcontainer引擎,runC是对libcontainer的精简封装。

(个人理解,可能有误)

3. Docker架构概览

https://docs.docker.com/engine/docker-overview/

docker使用C/S架构,client发起请求到daemon,daemon根据约定信息执行相应命令。

例如图中docker run命令的执行过程,client端发起请求,把表单post到daemon,daemon解析这些参数之后,寻找本地的image文件,并启动容器。

注:大部分内容参考《Docker容器与容器云》

docker基础——1.原理解读的更多相关文章

  1. Docker基础(1) 原理篇

    Docker是什么 Docker的构成 Docker的分层和写时拷贝策略 Docker与主流虚拟机的区别 Docker镜像与容器的关系 镜像的变更管理 Docker是什么 Docker是一个开源的应用 ...

  2. Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读

    本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...

  3. 『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理

    目录 1.Docker的底层原理 2.Docker中常用的基本概念 3.run命令的运行流程 4.为什么Docker比VM快 Docker架构图: 我们依照Docker架构图进行Docker基础概念的 ...

  4. docker基础_docker引擎内部原理

    docker引擎内部原理 docker主要由以下主要组件构成:docker客户端.docker守护进程(daemon).containerd.runc.shim daemon daemon的主要功能包 ...

  5. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  6. Docker 基础技术:Linux Namespace(下)

    导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...

  7. docker基础内容讲解

    一.初识docker 1.1 LXC介绍 LXC为LinuX Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提 ...

  8. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

  9. Docker容器的原理与实践(上)

    本文来自网易云社区. 虚拟化 是一种资源管理技术,将计算机的各种资源予以抽象.转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源. Hypervisor 一种运 ...

随机推荐

  1. 初识python 之 取101到200之前的所有素数

    素数:只能被1或本身整除 思路分析:这个数只有2个数据能整除 代码如下: n = 0 li = [] for i in range(101,200): m = 0 for j in range(1,2 ...

  2. [ vue ] Quasar封装q-dialog组件,在外层实现弹出框的开启和关闭

    场景描述: 见:https://www.cnblogs.com/remly/p/12981582.html 具体实现: <!-- 父组件 --> <template> < ...

  3. c# - 常量定义与赋值

    1.前言 c#与Java很相似,但是不一样,又与js(JavaScript)相似,但是也不一样,所以我认为c#是Java和 js的孩子. 2.常量定义 字符串: const string = &quo ...

  4. Leetcode系列之两数之和

    Leetcode系列之两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你 ...

  5. javaScript(笔记1)

    一.JavaScript数据类型: 1.分类: 基本数据类型 & 高级引用数据类型 2.基本数据类型: 数字类型(number), 字符串类型(string), 布尔类型(boolean) 3 ...

  6. 一文搞懂Flink Window机制

    Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算. 窗口化的Flink程序的结构通常如下,有分组流(keyed streams)和无分组流(non ...

  7. python 读取配置文件ini ---ConfigParser

    Python读取ini文件需要用到 ConfigParser 模块 关于ConfigParser模块的介绍详情请参照官网解释:https://docs.python.org/2.7/library/c ...

  8. AVD模拟器怎么配置上网

    转自:http://blog.csdn.net/you_jinjin/article/details/7228303 方法一 首先,Windows下,配置Adroid环境变量(Win7为例) 1.桌面 ...

  9. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  10. Mybatis 学习记录 续

    项目结构如下: 1.数据库建表 表名:user 结构: 内容: 2.pom.xml文件更新如下: 注:其中build部分尤其需要重视 <?xml version="1.0" ...