当前位置: 首页 > article >正文

【Docker】:Docker容器使用

容器技术发展史
Jail 时代
容器不是一个新概念或者新技术,很早就有了,只是近几年遇到了云计算,整个技术
被彻底引爆了。
1979 年 贝尔实验室发明 chroot
chroot 系统调用是在 1979 年开发第 7 版 Unix期间引入的。贝尔实验室在 Unix V7 的
开发过程中,发现当一个系统软件编译和安装完成后,整个测试环境的变量就会发生
改变,下一次测试需要重新配置环境信息。
设计者们思考能否隔离出来一个独立的环境,来构建和搭建测试环境,所以发明了
chroot,可以把一个进程的文件系统隔离起来。
chroot 系统调用可以将进程及其子进程的根目录更改为文件系统中的新位置。隔离以
后,该进程无法访问到外面的文件,因此这个被隔离出来的新环境像监狱一样,被命
名为 Chroot Jail (监狱)。后续测试只需要把测试信息放到 Jail 中就可以完成测试了。
这一进步是进程隔离的开始:为每个进程隔离文件访问。所以chroot可以认为是容器
技术的鼻祖。
2000 年 FreeBSD 4.0 发行FreeBSD Jail
2000 年,当时一家小型共享环境托管提供商提出了 FreeBSD Jail,以实现其服务与其
客户服务之间的明确分离,以实现安全性和易于管理。每个Jail都是一个在主机上运
行的虚拟环境,有自己的文件、进程、用户和超级用户帐户,能够为每个系统分配一个
IP 地址。
FreeBSD Jail 不仅仅有chroot的文件系统隔离,并且扩充了独立的进程和网络空间。
2001 年 Linux VServer 发行
与 FreeBSD Jails 一样,Linux VServer是一种监狱机制,可以对计算机系统上的资源
(文件系统、网络地址、内存)进行分区。
2004 年 Solaris Containers 发行
2004 年, Solaris Containers 的第一个公开测试版发布,结合系统资源控制和区域进
行隔离,并添加了快照和克隆能力。
这个时期的进程隔离技术大多以Jail模式为核心,基本实现了进程相关资源的隔离操
作,没有更大的应用场景发展有限。

云时代
2006年,Google 101 计划提出云的概念,对当前的主流开发模式产生深远的影响。
也许以后我们会更多考虑如果出现比现在多1000倍, 10000倍的数据量的时候,我们
该如何处理?要想让”云”发挥潜能,与此相关的编程和操作就应该与使用互联网一样简
单。随后,亚马逊、IBM 等行业巨头也陆续宣布各自的“云”计划,宣告“云”技术时代的
来临。
云计算需要处理海量数据、超高并发、快速扩展等问题,此时不仅仅需要隔离还需要
能够对资源进行控制和调配。
2006 年 google推出Process Containers
Process Containers(由 Google 于 2006 年推出)旨在限制、统计和隔离一组进程的
资源使用(CPU、内存、磁盘 I/O、网络)。一年后它更名为“Control Groups
(cgroups)”,并最终合并到 Linux 内核 2.6.24。
2008 年 LXC推出
LXC(Linux 容器)是 Linux 容器管理器的第一个、最完整的实现。它是在 2008 年使
用 cgroups 和 Linux 命名空间实现的,它可以在单个 Linux 内核上运行,不需要任何
补丁。
同年谷歌推出GAE(Google App Engine),首次把开发平台当做一种服务来提供,采
用云计算技术,跨越多个服务器和数据中心来虚拟化应用程序。
同时Google在 GAE中使用了Borg (Kubernetes的前身)来对容器进行编排和调度。
LXC和Borg其实就相当于最早的docker和k8s.
2011 年 CloudFoundry 推出Warden
2011 年启动了 Warden,早期使用 LXC,后来替换为自己的实现,直接对Cgroups以
及Linux Namespace操作。开发了一个客户端-服务器模型来管理跨多个主机的容器
集合,并且可以管理 cgroups、命名空间和进程生命周期。
2013 年 LMCTFY启动
Let Me Contain That For You (LMCTFY) 于 2013 年作为 Google 容器堆栈的开源版本
启动,提供 Linux 应用程序容器。应用程序可以“容器感知”,创建和管理它们自己的子
容器。在谷歌开始和docker合作,后续转向了docker公司的libcontainer,LMCTFY
的于 2015 年停止。

Docker。Docker在初期与Warden类似,使用的也是LXC,之后才开始采用自己开发
的libcontainer 来替代 LXC,它是将应用程序及其依赖打包到几乎可以在任何服务器
上运行的容器的工具。与其他只做容器的项目不同的是,Docker引入了一整套管理容
器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰
的REST API、命令行等等。
Docker 为提供了一整套的解决方案,不仅解决了容器化问题,而且解决了分发问题,
很快被各大厂商选择变成了云基础设施,厂商围绕Docker也开始了生态建设。
云原生时代
Google &Docker 竞争
2013 年 CoreOS发布和Docker由合作终止
技术革命带来新的市场机遇,CoreOS也是其中的一员,在容器生态圈中贴有标签:
专为容器设计的操作系统CoreOS。作为互补,CoreOS+Docker曾经也是容器部署的
灵魂伴侣。CoreOS为Docker的推广和源码社区都做出了巨大的贡献。
Docker 生态扩张,与最开始是“一个简单的基础单元”不同,Docker也在通过开发或收
购逐步完善容器云平台的各种组件,准备打造自己的生态圈,而这与CoreOS的布局
有直接竞争关系。
2014 年6月 Google发布开源的容器编排引擎Kubernetes(K8S)
容器只是解决了容器化,分发问题,但是一个软件的网络问题、负载均衡问题、监控、
部署、更新、镜像管理、发布等很多问题并没有有效的解决。
Google 内部调度系统 Borg已经拥有10多年的使用容器经验,在2014年6月推出了
开源的K8S,可以支持对容器的编排和管理,完成生态的闭环。
同年7月,微软、Red Hat、IBM、Docker、CoreOS、 Mesosphere和Saltstack 等
公司,相继加入K8S。之后的一年内,VMware、HP、Intel等公司,也陆续加入。
2014 年12月 CoreOS发布开源容器引擎Rocket(rkt)
2014年底,CoreOS正式发布了CoreOS的开源容器引擎Rocket(简称rkt),和
Docker 正式分开发展。Google于2015年4月领投CoreOS 1200万美元,而
CoreOS也发布了Tectonic,成为首个支持企业版本kubernetes的公司。从此,容器
江湖分为两大阵营,Google派系和Docker派系。
2015 年 Docker推出容器集群编排组件Swarm

在 Docker 1.12 及更高版本中,Swarm 模式与 Docker 引擎集成,为 Docker 容器提供
原生集群管理功能。
两大派系的竞争愈演愈烈,行业标准的诉求越来越强烈。
2015 年 6月 Docker成立OCI
Docker 公司在容器运行因为高速迭代导致变更频繁,影响较大。
2015 年 6 月 22 日,由 Docker 公司牵头,CoreOS、Google、RedHat 等公司共同宣
布,Docker 公司将 Libcontainer 捐出,并改名为 RunC 项目,交由一个完全中立的基
金会管理,然后以 RunC 为依据,大家共同制定一套容器和镜像的标准和规范。
RUNC的本质就是可以不通过Docker Damon直接运行容器。
规范就是OCI,旨在“制定并维护容器镜像格式和容器运行时的正式规范(OCI
Specifications)”。其核心产出是 OCI Runtime Spec(容器运行时规范)、OCI Image
Spec(镜像格式规范)、OCI Distribution Spec(镜像分发规范)。所以 OCI 组织解决
的是容器的构建、分发和运行问题。
社区们期望通过标准来约束Docker公司的话语权,不过Docker公司并没有积极推动
OCI的发展,而且OCI也无法影响Docker的地位,因为Docker已经是事实的容器标
准。
Google 和RedHat等公司将方向调转到容器上面的平台层。
2015 年 7月 Google带头成立CNCF
Google 联合 Linux 基金会成立 CNCF (Cloud Native Computing Foundation)云原
生计算基金会。旨在构建云原生基础设施。K8S是第一个纳入进来的项目,像后续有
名的监控设施Prometheus,配置设施ETCD都加入进来。CNCF 组织解决的是应用
管理及容器编排问题。和OCI共同制定了一系列行业事实标准。
k8s 成为云原生事实标准
2016 年 发布CRI标准
Google 就和红帽主导了CRI标准,用于k8s和特定的容器运行时解耦。
CRI(Container Runtime Interface 容器运行时接口)本质上就是k8s定义的一组与容器
运行时进行交互的接口,所以只要实现了这套接口的容器运行时都可以对接k8s。
但是这个适合Docker还是事实标准,并 CRI并没有话语权,但是又必须支持Docker,
所以就有了dockershim,dockershim的本质其实就是k8s对接docker的一个CRI的实
现。
2016 年 Docker捐献containerd

containerd 作为运行时标准,Docker从Docker Engine种剥离出来,捐献给CNCF.这
个时候Google为了将containerd加入到cri标准中,又开发了cri-containerd,用来完
成k8s和容器之间的交互。
2016 年 CRI-O发布
CRI-O可以让开发者直接从Kubernetes来运行容器,这意味着Kubernetes可以不依
赖于传统的容器引擎(比如Docker),也能够管理容器化工作负载。容器此时也回归
到自己的位置,如何更好的封装云原生的程序。
在2016年,Docker公司宣布了一个震惊全部人的计划:放弃现有的Swarm项目,将
容器编排和集群管理功能所有内置到Docker项目中。
而Kubernetes的应对策略则是反其道而行之,开始在整个社区推动“民主化”架构,从
API 到容器运行时的每一层,Kubernetes项目都为开发者暴露出了能够扩展的插件机
制,鼓励用户经过代码的方式介入到Kubernetes项目的每个阶段。
在进入2017年之后,更多的厂商愿意把宝压在K8S上,投入到K8S相关生态的建设
中来。这两年包括阿里云、腾讯、百度等中国科技企业也陆续加入CNCF,全面拥抱
容器技术与云原生。
Swarm 的失败后, 社区版Docker 项目改名为 moby,将Docker引流到Docker的企业
版上去,螳臂挡车。
2017 年 containerd 确定作为标准CRI
2017 年各大厂商都开始拥抱 Kubernetes,亚马逊 AWS,Microsoft Azure,VMware,
有的甚至抛弃了自家的产品。
亚马逊网络服务(AWS)于八月份以白金会员(最高级别)加入了CNCF。
VMware都作为CNCF的白金会员注册.
Docker Inc.ocker 企业版框架中添加了本地Kubernetes支持。Docker自己的Swarm
技术也借鉴了k8s的技术进一步发展。
Kubernetes 已成了容器编排领域的绝对标准, Docker 已成容器事实的标准。
编排与容器的技术演进之路
核心问题:容器哪些技术过时了
DockerClient
此时K8s只是编排领域的一个选择,而Docker此时一家独大,所以K8s的客户端只
是作为Docker的客户端来调用Docker 引擎来完成服务。
在这里插入图片描述

RUNC&Shim
OCI催生runc,剥离Docker Engine的一家独大的情况,确保各个厂商都可以搭建自
己的容器平台。CRI标准确立了但是Docker并没有接入该标准。此时催生了临时技术
shim.

实际生产的集群采用的什么运行时组件?
以腾讯的TKE(腾讯商用K8S产品)为例,支持选择containerd和docker两种模式的
选择。
如何选择呢?
(1)Containerd 调用链更短,组件更少,更稳定,占用节点资源更少。建议选择
Containerd。
(2)以下情况还是要用docker
• 使用 docker build/push/save/load 等命令。
• 调用 docker API
• 需要 docker compose 或 docker swarm。
Docker 简介
什么是虚拟化、容器化
物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理
机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上
同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都
可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level
virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例
(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运
行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户
来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。
docker 是现今容器技术的事实标准。
案例
举个生活中的例子。
物理机如下,就像一个庄园,独立占用了一块土地,花园都是自己的,其他人无法共
享使用。
在这里插入图片描述
为什么要虚拟化、容器化?
我们从上面的历史发展来看,虚拟化和容器化的最主要目的就是资源隔离,随着资源
隔离的实现逐渐也带来了更大的收益。
• 资源利用率高
将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务,降低IT支出和
运维管理成本。
比如上图中我们的土地直接复用,使用这块土地的人多了,但是成本还是庄园那块地。
• 环境标准化
一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常
见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些
bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,
确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类
问题。
在这里插入图片描述
差异化环境提供
同时提供多套差异化的执行环境,限制环境使用资源。
比如我的服务一个以来Ubuntu 操作系统,一个服务依赖CentOS操作系统,但是没
有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
在这里插入图片描述
为避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建
虚拟执行环境。
比如我在容器里面执行rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序
使用。
容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运
行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时
间。大大的节约了开发、测试、部署的时间。
docker 不需要虚拟内核,所以启动可以更快,相当于windows的开机时间省去了。
维护和扩展容易
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得
应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,
Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接
在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成
本。比如docker hub提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可
以自己定制镜像分享给各个产品。
在这里插入图片描述
硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
操作系统层 :提供系统调用接口,管理硬件资源
程序库层:提供数据结构定义及函数调用接口
虚拟化常见类别
虚拟机
存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口,
将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样
的功能。比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台
电脑打开 Android 系统上的应用。
容器
存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口,
将函数库层以上的功能置于操作系统上。以 Docker 为例,其就是一个基于 Linux 操作
系统的 Namespace 和 Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。简单
来说,如果虚拟机是把整个操作系统封装隔离,从而实现跨平台应用的话,那么容器
则是把一个个应用单独封装隔离,从而实现跨平台应用。所以容器体积比虚拟机小很
多,理论上占用资源更少。容器化就是应用程序级别的虚拟化技术。容器提供了将应
用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容
器共享一个内核(操作系统),它安装在硬件上。
JVM之类的虚拟机
存在于函数库层和应用程序之间的虚拟化技术。Java 虚拟机同样具有跨平台特性,所
谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库
的,JVM 就是在应用层与函数库层之间建立一个抽象层,对下通过不同的版本适应不
同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调
用不同操作系统的函数库。
常见虚拟化实现
主机虚拟化(虚拟机)实现
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可
以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之
上,将虚拟化划分为Type1和Type2.
Type1类的Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间
的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主
机上单独工作,因此,Hypervisor也称为虚拟机管理器。)直接运行在硬件之上,没有
宿主机操作系统,Hypervisor直接控制硬件资源和客户机。典型框架为Xen、Vmware
ESX。
在这里插入图片描述
Type2类的Hypervisor运行在一个宿主机操作系统之上(Vmware Workstation)或者
系统里面,Hypervisor作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操
作系统上的一个进程。
容器虚拟化实现
容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过namespace进行各程
序的隔离,加上cgroups进行资源的控制,以此来进行虚拟化。
容器虚拟化基础之NameSpace
什么是Namespace(命名空间)
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进
程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的
资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程
的相关资源指定在同一个 namespace 中

Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的
进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前
namespace 里的进程,对其他 namespace 中的进程没有影响。
Linux 提供了多个 API 用来操作 namespace,它们是 clone()、setns() 和 unshare() 函
数,为了确定隔离的到底是哪项 namespace,在使用这些 API 时,通常需要指定一些
调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、
CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和
CLONE_NEWCGROUP。如果要同时隔离多个 namespace,可以使用 | (按位或)组合
这些参数。
举个例子
三年一班的小明和三年二班的小明,虽说他们名字是一样的,但是所在班级不一样,
那么,在全年级排行榜上面,即使出现两个名字一样的小明,也会通过各自的学号来
区分。对于学校来说,每个班级就相当于是一个命名空间,这个空间的名称是班级号。
班级号用于描述逻辑上的学生分组信息,至于什么学生分配到1班,什么学生分配到
2班,那就由学校层面来统一调度

在这里插入图片描述
在这里插入图片描述
以上命名空间在容器环境下的隔离效果:
UTS:每个容器能看到自己的hostname,拥有独立的主机名和域名。
3.8
IPC:同一个IPC namespace的进程之间能互相通讯,不同的IPC namespace之间
不能通信。
进程。
PID:每个PID namespace中的进程可以有其独立的PID,每个容器可以有其PID为
1的root
Network:每个容器用有其独立的网络设备,IP地址,IP路由表,/proc/net目录,端
口号。
Mount:每个容器能看到不同的文件系统层次结构。
User:每个container可以有不同的user和group id。
想想以下如果我们要隔离两个进程需要怎么办?
(1)首先容器进程与进程之间需要隔离,所以需要PID隔离
(2)首先容器A进程不能读取容器B进程通讯内容需要隔离信号量等,所以需要IPC
隔离
(3)首先容器A进程不能读取容器B进程的文件,所以需要Mount隔离
(4)首先容器A进程不能读取容器B进程的socket,所以需要网络隔离、主机隔离
(5)Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,
这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。
空间隔离实战
空间隔离实战
容器虚拟化基础之cgroups
1.
什么是cgroups
cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一
系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源
管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资
源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时
对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
2.
为什么使用cgroups
其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器

Docker 及k8s中的pod就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部
分的资源控制。
比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使
用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算
模块。
3.
cgroups 的用途
Resource limitation: 限制资源使用,例:内存使用上限/cpu的使用限制
Prioritization: 优先级控制,例:CPU利用/磁盘IO吞吐
Accounting: 一些审计或一些统计
Control: 挂起进程/恢复执行进程
4.
cgroups 可以控制的子系统

资源控制实战
资源控制实战
容器虚拟化基础之LXC
LXC是什么?
LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容
器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),
内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和
共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,
使得Linux用户可以容易的创建和管理系统或应用容器。
LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了
容器技术使用的一个方案
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,
其复杂程度其实并没有多大降低,因为我们必须要学会LXC的一组命令工具,且由于
内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性
也没有虚拟机那么强大。
后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版。

Docker 本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容
器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早
期的版本其核心就是LXC的二次封装发行版。
Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。
Docker 是基于Go语言实现的一个开源项目,它的主要目标是“Build,Ship and
Run Any APP,Anywhere”,即通过对组件的封装、分发、部署、运行等生命周期的
管理,使得用户的应用及其运行环境能够做到“一次封装,到处运行”。
早期Docker利用LXC做容器管理引擎,但是在创建容器时,不再使用模板去安装生
成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,
并整体打包成一个文件,image文件),镜像文件集中放在一个仓库中。当需要创建容
器时,Docker调用LXC的工具lxc-create,但不再通过lxc的模板去安装,而是连接
到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker极大的
简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker-run,
docker-stop 就可以启动停止一个容器了。
Docker 的引擎迭代
Docker 早期是基于LXC容器管理引擎实现,当后来成熟之后,Docker自建了一个容
器引擎叫libcontainer,后来CNCF的介入,Docker又研发了一个工业化标准的容器
引擎runC,目前所使用的新版Docker,所使用的容器引擎就是RunC。

在这里插入图片描述
在这里插入图片描述
docker 有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运
行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利
用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核,而不需要
Guest OS,节省了Guest OS占用的资源。
docker 不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作
系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个
虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个
docker 容器只需要几秒钟。
在这里插入图片描述
在这里插入图片描述
Docker 版本
Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是docker-ce。
lxc:上文中提到,lxc是最早的linux容器技术,早期版本的docker直接使用lxc来实
现容器的底层功能。虽然使用者相对较少,但lxc项目仍在持续开发演进中。
libcontainer:docker 从 0.9 版本开始自行开发了libcontainer模块来作为lxc的替代
品实现容器底层特性,并在1.10版本彻底去除了lxc。在1.11版本拆分出runc后,
libcontainer 也随之成为了 runc的核心功能模块,runc后续变成了容器标准。
moby:moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件moby,
事实上这个moby就是dockerd目前使用的开源项目名称,docker项目中的engine
(dockerd)仓库现在就是从moby仓库fork而来的,使用containerd作为运行时标
准。https://mobyproject.org/
docker-ce:docker 的开源版本,CE指Community Edition。docker-ce中的组件来
自于moby、containerd等其他项目。https://www.docker.com/pricing/
docker-ee:docker 的收费版本,EE指Enterprise Edition。其基础组件来源和
docker-ce 是一样的,但附加了一些其他的组件和功能。
https://www.docker.com/pricing/
Docker 官方网站
docker 官网
https://www.docker.com/
Docker 架构
官方架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。

Docker 仓库(Registry)
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub供了庞
大的镜像集合供使用。
• Docker daemon
Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护
进程。
• Docker 客户端(Client)
Docker 客户端通过命令行或者其他工具使用Docker API 与 Docker 的守护进程通信。
• Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
• Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板。
• Docker 容器(Container)
容器是独立运行的一个或一组应用。
生活案例
上面概念比较难以理解,我们列举个生活中的案例,以一家人去旅游入住酒店为例。


http://www.kler.cn/a/466512.html

相关文章:

  • 华为数通考试模拟真题(附带答案解析)题库领取
  • 《Rust权威指南》学习笔记(二)
  • 【CSS】 ---- CSS 实现图片背景清除的滑动效果三种方法
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
  • 探索 Android Instant Apps:InstantAppInfo 的深入解析与架构设计
  • RabbitMQ实现生产者消费者
  • 野火直播 5.9.5 | 频道丰富的电视直播软件,支持港澳台频道和快速换台
  • 【深度学习】Java DL4J基于 LSTM 构建新能源预测模型
  • vue学习第一阶段
  • MacBook_Xcode_Swift雨燕
  • 深度学习中的离群值
  • 27、使用StreamPark管理Flink作业中,关于对Flink客户端的conf进行占位符替换的修改
  • 将数组转换为laravel中的对象
  • ts中 type 和 interface 定义类型有什么区别?
  • 【Unity】【图形渲染】Unity Shader基础操作3:内置文件与包含文件的使用
  • 实时数仓与离线数仓的全面对比
  • 上升沿下降沿递增
  • 高等数学学习笔记 ☞ 函数的极限
  • 微信小程序滑动解锁、滑动验证
  • git 退出编辑模式
  • AI对嵌入式开发行业的影响
  • 家政上门小程序如何创建?家政服务怎么能少了小程序帮手
  • Unity 对Sprite或者UI使用模板测试扣洞
  • 安装并配置Ubuntu22.04桌面
  • 【Python系列】处理空请求体Body
  • 中间件自动化测试框架cmdlinker