前言
在了解Docker之前我们需要了解一下容器是什么和容器的发展历史,这有助于我们后续深入的理解容器的含义和Docker是什么。
什么是虚拟化
虚拟化(Virtualization)是一种在实际硬件之上的抽象层中运行多个虚拟的计算机系统实例的过程。最常见的是,它指的是在一个计算机系统上同时运行多个操作系统。对于在虚拟机上运行的应用程序,它们看起来好像在自己的专用机器上,其中操作系统、库和其他程序对于虚拟化系统是唯一的,并与所在的宿主机操作系统无关。
虚拟化技术可以将计算机的各种资源,例如:网络资源、存储资源、CPU资源和内存资源等进行抽象和隔离,打破物理机实体结构不能切割隔离的障碍,以便最大化的利用实体机的资源。
常见的虚拟化技术包括软件虚拟化、硬件虚拟化、桌面虚拟化、网络虚拟化等,虚拟机是我们之前最常见的一种虚拟化技术。我们今天介绍的容器也是虚拟化技术的一种。
什么是容器
容器是软件的可执行单元,它采用通用方式封装了应用程序代码及其库和依赖项,因此可以随时随地运行容器(无论是在桌面、传统 IT 还是云端)。
为此,容器利用操作系统 (OS) 虚拟化形式,这里会利用操作系统的功能(在 Linux 内核中,即名称空间和 cgroups 原语)来隔离进程,并控制这些进程有权访问的 CPU、内存和磁盘的数量。
容器小巧轻便、速度快且可移植;与虚拟机不同,容器不需要在每个实例中都包含访客操作系统,只需利用主机操作系统的功能和资源即可。
容器VS虚拟机
可通过查看容器与传统虚拟机 (VM) 的不同之处来更全面地了解容器。 在传统的虚拟化(无论是在本地还是在云端)中是使用管理程序来虚拟化物理硬件。 每个虚拟机都包含一个访客操作系统、操作系统运行所需硬件的一个虚拟副本以及一个应用及其关联的库和依赖项。
容器不是要虚拟化底层硬件,而是要虚拟化操作系统(通常是 Linux),因此每个单独的容器只包含应用程序及其库和依赖项。 由于缺少访客操作系统,容器才如此轻量,因此速度快且可移植。
容器的优势?
尤其是与虚拟机相比,容器的主要优势在于它提供了一个抽象层,这使得容器小巧轻便且可移植。
- 轻量级:容器会共享机器操作系统内核,由于无需在每个应用程序中包含完整的操作系统实例,因此容器文件较小且易于访问资源。 尤其是与虚拟机相比,容器可谓小巧轻便,这意味着容器可以快速启动并更好地支持横向扩展的云原生应用程序。
- 可移植且与平台无关:容器会携带其所有依赖项,这意味着软件一旦编写完毕就可以运行,而无需在笔记本电脑、云和本地计算环境中对其进行重新配置。
- 支持现代开发和架构:由于兼具部署可移植性/跨平台一致性以及小巧轻便的特点,因此容器非常适用于现代开发和应用程序模式(例如 DevOps、无服务器和微服务),这些模式已构建为小增量的常规代码部署。
- 提高利用率: 与虚拟机一样,容器也可以让开发人员和运营商提高物理计算机的 CPU 和内存利用率。 容器比虚拟机更胜一筹的是,由于它们支持微服务架构,所以可以更精细地部署和扩展应用程序组件,这取代了以往因为单个组件难以处理负载而必须扩展整个应用程序的做法。
容器也是自动化和 DevOps 管道的理想选择,包括持续集成和持续部署(CI/CD) 实施。
容器优势详情可见IBM调查报告
容器技术发展简史
20世纪70年代前
容器技术基于Unix-Like操作系统,Unix/Linux操作系统的发展衍生了后续容器化技术,有兴趣的读者可以了解一下Unix操作系统的发展史。
1979:Unix V7
在 1979 年 Unix V7 的开发过程中,引入了chroot系统调用,将进程及其子进程的根目录更改为文件系统中的新位置。这一进步是进程隔离的开始:为每个进程隔离文件访问,容器技术出现基本雏形。Chroot 于 1982 年被添加到BSD。
2000: FreeBSD Jails
Jails直译是监狱的意思,监狱是一个一个隔离房间。引申含义就是隔离。
2000 年,一家小型共享环境托管服务提供商提出了 FreeBSD Jails,以实现其服务与客户服务之间的明确分离,以确保安全性和易于管理。FreeBSD Jails 允许管理员将FreeBSD计算机系统划分为几个独立的、更小的系统-称为“jails”-能够为每个系统和配置分配一个 IP 地址。
2001: Linux VServer
与 FreeBSD Jails 一样,Linux VServer是一种监狱机制,可以对计算机系统上的资源(文件系统、网络地址、内存)进行分区,是不是有点namespace的意思了?这种操作系统虚拟化于 2001 年推出,是通过修补 Linux 内核来实现的。实验性补丁仍然可用,但最后一个稳定补丁是在 2006 年发布的。
2004:Solaris 容器
2004 年,Solaris Containers的第一个公共测试版发布,它结合了系统资源控制和区域提供的边界分离,能够利用 ZFS 的快照和克隆等功能。
2004年2月同Solaris10版本对外发布,Sun公司在2009年被并购后落入了Oracle公司,Solaris11之后叫Solaris zones。Solaris zones是一种操作系统层面的轻量级虚拟化技术。
2005: Open VZ (Open Virtuzzo)
这是一种适用于 Linux 的操作系统级虚拟化技术,它使用修补过的 Linux 内核进行虚拟化、隔离、资源管理和检查点设置。该代码并未作为官方 Linux 内核的一部分发布。
2006: Process Containers
Process Containers(由 Google 于 2006 年推出)旨在限制、统计和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络)。一年后更名为“控制组(cgroups)”,并最终合并到 Linux 内核 2.6.24。cgroups也是Docker容器依赖的底层技术。
2008: LXC(Linux Containers)
LXC 是 Linux 容器管理器的第一个、最完整的实现。它是在 2008 年使用 cgroups 和 Linux 命名空间实现的,它可以在单个 Linux 内核上工作,不需要任何补丁。
Linux namespace解决了容器的资源隔离,cgroups解决了进程资源控制
2011: Warden
CloudFoundry 于 2011 年启动 Warden,在早期阶段使用 LXC,后来用自己的实现替换它。Warden可以隔离任何操作系统上的环境,作为守护进程运行并为容器管理提供 API。它开发了一个客户端-服务器模型来管理跨多个主机的容器集合,而 Warden 包括一个用于管理 cgroup、命名空间和进程生命周期的服务。Warden基于LXC并且使用客户端服务端模式,和Docker的架构已经有相似之处。
2013: LMCTFY
Let Me Contain That For You (LMCTFY) 于 2013 年作为 Google 容器堆栈的开源版本启动,提供 Linux 应用程序容器。应用程序可以“感知容器”,创建和管理它们自己的子容器。在 Google 开始向 libcontainer(现在是Open Container Foundation的一部分)贡献核心 LMCTFY 概念后,LMCTFY 中的积极部署于 2015 年停止。熟悉docker的同学看到这,是不是已经有Docker的影子了?
libcontainer 是Docker 架构中一个使用Go 语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的系统调用。正是由于libcontainer 的存在, Docker 可以直接调用libcontainer ,而最终操作容器的
namespaces 、cgroups 、apparmor 、网络设备以及防火墙规则等。这一系列操作的完成都不需要依赖LXC 或者其他包
2013: Docker
当Docker在 2013 年出现时,容器迅速流行起来。Docker 和容器使用的增长齐头并进并非巧合。
正如 Warden 所做的那样,Docker 在最初阶段也使用了 LXC,后来用自己的库 libcontainer 替换了该容器管理器。但毫无疑问,Docker 通过为容器管理提供完整的生态系统而脱颖而出。
容器技术经过30年的发展,终于在2013年面试并迅速脱颖而出广受欢迎。
2014:Rkt
Rkt诞生于2014年11月末,是一种与Docker类似的容器引擎,由CoreOS公司主导,得到了Redhat、Google、Vmware等公司的支持,更加专注于解决安全、兼容、执行效率等方面的问题。随着Docker在容器行业变得逐渐强大,Docker也越来越臃肿,CoreOS公司希望有一个更加开放和中立的容器标准,因此推出了自己的容器计划,就这样,CoreOS公司成为了Docker公司的容器引擎竞争对手。
2016:容器安全的重要性
随着基于容器的应用程序的广泛采用,系统变得更加复杂,风险增加,容器安全变得迫在眉睫。像dirty COW这样的漏洞加速了这个进程。这导致软件开发生命周期中的安全性发生了转变,使其成为容器应用程序开发(也称为 DevSecOps)每个阶段的关键部分。目标是在不缩短上市时间的情况下从头开始构建安全容器。
2017:Pouch
2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于Apache 2.0协议的容器技术Pouch。Pouch Container是阿里巴巴集团创建的一个开源项目,旨在促进集装箱技术的发展。Pouch Container的愿景是改善容器生态系统并促进容器标准OCI(开放容器计划),从而使容器技术成为云时代应用程序开发的基础。Pouch是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率。
2017:kata-containers
2017年12月,音速神童在KubeCon上对外发布了Kata Containers安全容器项目,是一个开放源代码社区,致力于通过轻量级虚拟机来构建安全的容器运行时,这些虚拟机的感觉和性能类似于容器,但是使用硬件虚拟化技术作为第二防御层,可以提供更强的工作负载隔离,并且还支持多个虚拟机管理程序,包括QEMU,NEMU和Firecracker,并与其他容器化项目集成。
2017:容器工具成熟
已经开发了数百种工具来简化容器管理。虽然这些类型的工具已经存在多年,但 2017 年是其中许多人获得成功的一年。看看 Kubernetes;自 2016 年被云原生计算基金会 (CNCF) 采用以来,VMWare、Azure、AWS甚至Docker都宣布在其基础设施之上提供支持。
虽然市场仍在增长,但一些工具已经开始定义容器社区中的某些功能。Ceph和REX-Ray为容器存储设定了标准,而Flannel则跨数据中心连接数百万个容器。在CI/CD中,Jenkins正在彻底改变我们构建和部署应用程序的方式。
2018:podman
Podman是一个无守护进程的容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无根模式运行。简而言之:alias docker = podman。
2018年2月,PodMan的v0.2版本发布。Podman(POD管理器)是一种基于Apache-2.0 License开源工具,用于管理容器和镜像,安装在这些容器中的体积以及由容器组制成的容器。Podman基于libpod,libpod是一个用于容器生命周期管理的库,该库也包含在其中。libpod库提供用于管理容器,pod,容器映像和卷的API。
CNCF 采用 rkt 和 Containerd
容器生态系统是独一无二的,因为它由社区范围内的努力和对开源项目的承诺提供支持。Docker 在 2017 年将Containerd项目捐赠给 CNCF 就是这一概念的象征,以及 CNCF大约在同一时间采用rkt (发音为“rocket”)容器运行时。这导致了项目之间更大的协作,为用户提供了更多选择,以及一个以改进容器生态系统为中心的社区。
Kubernetes
2017 年,开源项目在成为更成熟的技术方面取得了长足的进步。Kubernetes支持越来越复杂的应用程序类别——使企业能够过渡到混合云和微服务。在哥本哈根的 DockerCon 上,Docker 宣布他们将支持 Kubernetes 容器编排器,Azure 和 AWS 与AKS(Azure Kubernetes 服务)和EKS(一种与专有 ECS 竞争的Kubernetes 服务)保持一致。它也是 CNCF 采用的第一个项目,并拥有越来越多的第三方系统集成服务提供商。
文章参考:
什么是容器?
Containers vs. Virtual Machines (VMs): What’s the Difference?
A Brief History of Containers: From the 1970s Till Now
Dirty COW Vulnerability: Impact on Containers
Linux容器(Container)发展史
评论区