本文是阅读《深入浅出Docker》的相关学习笔记

起初简单的以为Docker和容器是一种东西,后来才发现Docker是实现了Linux容器技术(LXC,可以提供轻量级的虚拟化)的一种实现

LXC技术使用Linux 内核和内核功能(Cgroups 和Namespaces)来分隔进程,以便各进程相互独立运行

于是好像有了一个定义:容器是一个相互隔离的和资源受限制的进程

当启动Docker时,会通过Namespaces和Cgropus来创建一个资源隔离的环境,然后将打包的应用程序和关联的文件复制到 Namespace 内的文件系统中

Docker引擎

Docker 引擎是用来运行和管理容器的核心软件

基于OCI标准,采用的模块化结构

主要结构:客户端、守护进程(docker daemon)、containerd和runc

他们共同负责容器的创建和运行

早期的Docker引擎结构由Docker daemon和LXC组成

Docker daemon负责创建容器和运行容器,功能都耦合在一块了

而LXC技术,使用其提供的Namespace和Cgroup来启动容器

为了摆脱LXC的依赖,解决跨平台和核心功能依赖外部工具的问题

Docker公司开发了名为Libcontainer的自研工具,用于替代LXC。Libcontainer的目标是成为与平台无关的工具,可基于不同内核为Docker上层提供必要的容器交互功能

后续Docker公司对Docker daemon进行了重构,将容器执行、容器运行是等功能做成小组件的方式

伴随着重构的进行,Docker公司也在推进着OCI标准(容器开放标准)即规范容器运行时标准(runtime-spec)和容器镜像标准(image-spec)

OCI容器标准

  1. OCI规范了什么?

    规范了容器镜像标准和容器运行时标准,两者通过一个文件系统包(filesystem bundle)来连接

  2. filesystem bundle有什么作用?

    将镜像解包成bundle,bundle包含了一个config.json配置文件和一个根文件夹,Docker引擎会识别这个bundle来运行容器

    config.json的结构包含公共部分和平台适配部分

    公共部分包含了版本信息、rootfs等等,平台部分则是对系统底层的适配,比如Linux的配置是cgroup和namespaces,Windows则是hypervisor

    可以看到Docker是怎么实现跨平台的

  3. 镜像规范规范了什么?

    规定了镜像的构建系统需要输出的内容和格式,并且可以被解包成bundle

    主要包含了以下几种

    1. 文件系统:一个镜像由多个层叠加组成,文件系统负责维护这些层的变更集
    2. manifest:记录层和配置文件的定位信息
    3. 配置文件:记录镜像运行时相关的参数和根目录的变更
    4. image index:记录不同平台的manifests配置

    下边是实例



    关于镜像的组成下文会继续探索

  4. 容器规范规范了什么?什么是容器运行时(runtime)?

    容器规范标准了容器的配置、运行环境和生命周期

    配置文件就是通过解包镜像获得的config.json,并通过这个文件获取支持的平台和创建容器需要的字段

    容器运行时负责运行容器的所有部分,但是实际上并不止运行程序本身;容器运行时负责:通过读取bundle里的配置文件,来准备容器所需要得环境和资源,然后创建容器并且管理他的生命周期

    容器运行时有多种实现,但大多都包含lower-levelhigher-level,需要注意的是,lower-level和higher-level得职责不同,解决不同的问题

    lower-level需要提供容器所需要得资源(如namesapece和cgroup)

    higher-level负责传输和管理镜像,解包镜像并将命令传递给low-level,hight-level还对外提供Api

    runc和containerd就是从docker中分离出来的low-level和hight-level

容器运行时

官方词汇解释

镜像规范

运行时规范

镜像

镜像只会包含必要的应用和服务以及所需要的依赖,以保持较小的体积

镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象

当拉取镜像的时候,可以看到这和镜像需要哪些层,结构如下图

也可以使用docker image inspect 镜像 -f "{{.RootFS}}" 命令来查看镜像里的分层,可以看到分层都是使用了sha256来散列过的

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层

当添加一个补丁,会继续增加新的分层,因为分层式只读的,不过上层的修改会覆盖下层的

镜像的层会共享,当拉取镜像的时候,Docker可以识别出要拉取的镜像中,哪几层已经在本地存在

启动流程

可以看出Docker将创建和管理容器的逻辑都从Docker daemon中移除,意味着容器运行时与Docker daemon是解耦的,有时称之为“无守护进程的容器(daemonlesscontainer)”,如此,对Docker daemon的维护和升级工作不会影响到运行中的容器

Docker daemon收到请求后会将命令传递给Containerd,Containerd会把镜像解包,将bundle传递给runc,注意到runc之上还有一个shim

shim的作用是允许runc创建完容器后退出,避免每一个容器都创建一个runc,此时会创建一个shim进程,再由shim来调用runc来创建容器、

当runc创建完容器退出后,shim就会成为容器进程的父进程


参考

https://www.qikqiak.com/post/containerd-usage/

https://www.cnblogs.com/michael9/p/13039700.html

https://iximiuz.com/en/posts/container-learning-path/

https://www.modb.pro/db/145438

https://www.waynerv.com/posts/container-fundamentals-learn-container-with-oci-spec/

https://iximiuz.com/en/posts/container-learning-path/

Docker组成原理的更多相关文章

  1. Docker个人理解总结

    最新在学习Docker,记录下自己对Docker的理解. 一.Docker是什么? 1. Docker是一个能够把开发的应用程序自动部署到容器的开源引擎. 2.Docker使用Google公司推出的G ...

  2. 说透 Docker:虚拟化

    本章内容将讲解 Docker 虚拟化.虚拟化本质.namespace.cgroups. Docker 虚拟化 关于Docker 本小节将介绍 Docker 虚拟化的一些特点. Docker 是一个开放 ...

  3. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  4. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  5. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  6. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  7. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  8. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  9. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

随机推荐

  1. Java学习day22

    今天跟着视频学习了JScroll面板,图片按钮以及单多选框 这是一个图片按钮程序 很多网站还有软件的图标兼容按钮的功能,如果只有button是无法实现该功能的这时候就需要使用到图标按钮 文本框没有办法 ...

  2. babel 的介绍及其配置

    vue/cli -- babel Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其 ...

  3. 数据库基础知识详解五:MySQL中的索引和其两种引擎、主从复制以及关系型/非关系型数据库

    1.MySQL中的索引 在MySQL,索引是由B+树实现的,B+是一种与B树十分类似的数据结构. 形如下面这种: 其结构特点: (1)有n课子树的结点中含有n个关键码. (2)非根节点子节点数: ce ...

  4. spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解

    整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...

  5. [题解][YZOJ50104] 密码 | 简单计数

    同步发表于 Mina! 题目大意 对于满足以下要求的长度为 \(n\) 的序列进行计数: 序列的值域为 \([1,k]\); 对于序列的任意位置 \(p\in[1,n]\),可以找到至少一个 \(i\ ...

  6. Vue.js 3.x 中跨层级组件如何传递数据?

    provide/inject 基本用法 在 Vue.js 中,跨层级组件如果想要传递数据,我们可以直接使用 props 来将祖先组件的数据传递给子孙组件: 注:上图来自 Vue.js 官网:Prop ...

  7. Response.Write中文乱码问题

    接手别人的一个ASP项目,功能是页面按钮下载Excel导出数据. 每次导出某一天的数据会出现excel中文乱码,其他天又没问题,因为数据量比较大,所以没有逐条去检查. 找了一些资料 https://w ...

  8. OpenStack平台镜像优化

    在使用打快照方式制作镜像后,镜像的大小会变得非常大,比如一个基础的CentOS镜像大小为400M左右,但是使用打快照方式制作的镜像大小会有1个G左右,具体的大小还要根据安装的东西来实际情况实际分析. ...

  9. python之函数的进阶

    1.名称空间: 定义:用来存放名字的(变量,函数名,类名,引入的模块名) 分类: 内置名称空间:python解释器提供好的一些内置内容 全局名称空间:py文件中自己写的变量 局部名称空间:执行函数时会 ...

  10. 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载

    一.录制分类 在音视频会议.在线教育等系统中,录制是一个特别重要的功能 录制一般分为服务端录制和客户端录制 服务端录制:优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢 ...