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容器与容器云》

最新文章

  1. IO口
  2. Linux命令速查手册,超详细Linux命令教程
  3. jQuery/Javascript 事件停止冒泡
  4. ELK-Python(一)
  5. HttpClient设置代理,超时,以及得到cookies
  6. navicat导入mysql数据库sql时报错
  7. 通过自定义注解反射生成SQL语句
  8. Visual Studio Tips: How to change project namespace
  9. 深度解析:Android在Mms设置页面更改短信中心号码流程
  10. Oracle的用户,权限以及角色
  11. 巨人大哥谈Web应用中的Session(session详解)
  12. 已操作文件的方式,新建一个用户alex
  13. webpack 单独打包指定JS文件(CopyWebpackPlugin)
  14. HDU 4344-Mark the Rope-大数素因子分解
  15. Vue数组操作不刷新视图问题的解决
  16. struts2 优缺点
  17. citus 多租户应用开发(来自官方文档)
  18. iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
  19. logstash部署及基本语法(二)
  20. arcgis mpk 打包地图 (数据管理)

热门文章

  1. Python_string.Template的使用
  2. Samba服务器搭建与配置
  3. HDU 1106 (1.3.5) 排序 (C语言描述)
  4. Java包装类和处理对象
  5. 《剑指offer》面试题31. 栈的压入、弹出序列
  6. 【reverse】逆向6 JCC
  7. 浅谈 Java 多线程(一) --- JMM
  8. 判断jquery类库是否加载,如未加载则加载。
  9. 春节将至,喜庆的烟花安排上(js实现烟花)
  10. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息