docker引擎架构

前言:最近在读《深入浅出Docker》这本书,发现里面有个章节讲解的比较深入,所以,基于书的内容进行了整理,希望能对docker架构有个比较深入的理解。

概述

docker引擎是用来运行和管理容器的核心软件,通常将其代指为docker或者docker平台,docker引擎由如下主要的构建组成:docker cli、docker daemon、containerd以及runc,共同负责容器的创建和运行。docker引擎的架构示意图如下:
在这里插入图片描述
docker daemon实现了docker api,对容器的操作由containerd完成,containerd需要指挥与OCI相兼容的容器运行时来创建容器,默认情况下,docker使用runc来作为其默认的容器运行时,containerd调用runc,并确保docker镜像以OCI bundle的格式传给runc。其中,

  1. OCI(开放容器计划)定义了两个容器相关的规范:
    • 镜像规范
    • 容器运行时规范

runc是OCI容器运行时标准的参考实现,runc实际上是一个轻量级的、针对libcontainer进行了包装的命令行交互工具。runc生来只有一个作用,创建容器。

关于libcontainer:LXC提供了对诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,是基于linux内核的容器化虚拟技术,docker公司开发了名为libcontainer的自研工具,用于替代LXC,libcontainer的目的是成为与平台无关的工具,可基于不同内核为Docker上层提供必要的容器交互功能。

  1. containerd 的主要任务是容器的生命周期的管理,containerd在linux和windows中以daemon的方式运行,在docker引擎技术栈中,containerd位于daemon和runc所在的OCI层之间,kubernetes也可以通过cri-containerd使用containerd。目前containerd被赋予了更多的功能,比如镜像管理。

  2. shim是实现无daemon的容器不可获取的工具,前面提到containerd指挥runc来创建容器,事实上,每次创建容器时都会fork一个新的runc实例,不过,一旦容器创建完毕,对应的runc进程就会退出,因此即使运行上百个容器,也无须保持上百个运行中的runc实例。一旦容器进程的父进程runc退出,相关联的containerd-shim进程就会成为容器的父进程,作为容器的父进程,shim的部分职责如下:

    • 保持所有的STDIN和STDOUT流是开启状态,从而当daemon重启的时候,容器不会因为管道的关闭而终止。

    • 将容器的退出状态反馈给daemon。

示例-启动新容器

docker container run --name ctrl -it alpine:latest sh

当docker命令行执行上述命令时,docker客户端会将其转换为合适的api格式,并发送到正确的API端点。API是在daemon种实现的,一旦daemon接受了创建新容器的命令,它会向containerd发出调用(daemon使用一种CRUD风格的API,通过gRPC与containerd进行通信)。containerd不负责创建容器,将docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器。然后runc与操作系统内核接口通信,基于所有必要的工具(Namespace、CGroup等)来创建容器,容器进程作为runc的子进程进行启动,启动完毕后,runc将会退出。整个过程如下图:
在这里插入图片描述
以上内容基于参考书的内容进行整理而成,如有什么问题,欢迎批评指正
参考:
[1]《深入浅出Docker 》奈吉尔.波尔顿(Nigel Poulton)著 李瑞丰 刘康 译 人民邮电出版社

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker 是一个开源的容器化平台,可以帮助开发人员和系统管理员更高效地构建、部署和运行应用程序。它的技术架构主要包括以下几个组件: 1. Docker Engine:Docker 引擎Docker 的核心组件,负责管理容器的生命周期、创建和运行容器、以及与宿主机交互等。它包括三个主要的子组件:Docker Daemon、Docker Client 和 Containerd。 2. Docker Daemon:Docker Daemon 是在宿主机上运行的后台服务,负责监控 Docker API 请求,并管理容器的创建、启动、停止、删除等操作。 3. Docker Client:Docker Client 是与 Docker Daemon 交互的命令行工具或 API 接口,开发人员可以使用它来与 Docker 容器进行交互,例如创建、启动、停止和删除容器等。 4. Containerd:Containerd 是一个独立的容器运行时工具,负责管理容器和镜像的生命周期。Docker 引擎使用 Containerd 来创建和运行容器,并提供了一组 API 接口供其他组件调用。 5. Docker Registry:Docker Registry 是用于存储和分发 Docker 镜像的中心仓库。它可以是 Docker 官方提供的公共仓库(如 Docker Hub),也可以是私有的镜像仓库(如搭建在本地的私有 Registry)。 6. Docker Image:Docker Image 是用来构建容器的模板,包含了运行一个应用程序所需的所有文件和配置。Docker Image 可以通过 Dockerfile 来定义,然后使用 Docker Build 命令进行构建。镜像可以通过 Docker Registry 进行分享和分发。 7. Docker Container:Docker Container 是由 Docker Image 创建的运行实例,它是一个独立的、可执行的环境,可以运行在 Docker Engine 上。每个容器都是相互隔离的,拥有自己的文件系统、进程空间和网络配置等。 8. Docker Compose:Docker Compose 是一个用于定义和管理多个容器组成的应用服务的工具。通过编写一个 Compose 文件,可以一次性启动、停止、删除多个相关联的容器,并统一管理它们的配置。 9. Docker Swarm:Docker Swarm 是 Docker 官方提供的原生容器编排和集群管理工具,可以将多个 Docker 主机组成一个集群,并统一管理和调度容器的部署、扩展和更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值