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. 简单查看windows蓝屏原因

    相信各位在使用windows(xp.7.8.1.10...)过程中都遇到过蓝屏的情况,而蓝屏时,系统会将其记录起来,并追踪到引起蓝屏的程序,以下内容将简单介绍一下如何查看引起windows蓝屏的原因: ...

  2. Java中List与数组互相转换

    1.说明 在Java中,经常遇到需要List与数组互相转换的场景. List转换成数组,可以使用List的toArray()或者toArray(T[] a)方法. 数组转换成List,可以使用Arra ...

  3. 第10组 Alpha冲刺 (3/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13971668.html ·作业博客:https://edu.cnblogs.co ...

  4. vue3.0+vue-cli3.0项目搭建

    因为需要兼容其他vue2.0的项目,所以先卸载vue-cli,再全局安装桥接工具 卸载vue-cli2.0 npm uninstall vue-cli -g 安装vue-cli3.0 npm inst ...

  5. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  6. shell基础知识查缺补漏

    最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...

  7. Android官方文档翻译 十二 3.Supporting Different Devices

    Supporting Different Devices 支持不同设备 Dependencies and prerequisites 依赖关系和先决条件 Android 1.6 or higher A ...

  8. day5 数组对角线及最大值

    1.输出M行M列数组方针,求对角线元素和#define M 5void fun(int xx[][M], int n)//n行n列{ int i = 0; int sum = 0; for (i = ...

  9. pytest文档2-用例执行

    用例设计原则 1.文件名以test_******.py文件和*******_test.py 2.以test_****开头的函数 3.以Test***开头的类 4.以test_*****开头的方法 5. ...

  10. golang中的go get命令

    ### 下载指定版本 go get k8s.io/klog@v1.0.0 go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装. 这个命令在内部实际上分成了两 ...