“民工哥技术之路”
每天10点为你分享不一样的干货
作者:sparkdev
Docker和容器技术的发展可谓日新月异,本文试图以全局视角来梳理一下Docker目前的生态圈。
Docker自发布以来发生了很多的变化,有些方面的变化还非常大。对于技术爱好者来说,我们喜欢酷毙新的功能,喜欢旧功能的改善。但对生产环境中的使用者来说,他们其实不太喜欢这种频繁的变化。不管怎样,我们都有必要理清Docker生态系统中的众多概念和它们之间的关系,以及Docker诞生至今(2018年)的里程碑事件。
虽然Docker把容器技术推向了巅峰,但容器技术却不是从Docker诞生的。实际上,容器技术连新技术都算不上,因为它的诞生和使用确实有些年头了。下面的一串名称可能有的你都没有听说过,但它们的确都是容器技术的应用:
Chroot Jail
FreeBSD Jails
Linux VServer
Solaris Containers
OpenVZ
Process Containers
LXC
Warden
LMCTFY
Docker
RKT
Chroot Jail
就是我们常见的Chroot命令的用法。它在1979年的时候就出现了,被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。
The FreeBSD Jail
Freebsd Jail实现了操作系统级别的虚拟化,它是操作系统级别虚拟化技术的先驱之一。
Linux VServer
使用添加到Linux内核的系统级别的虚拟化功能实现的专用虚拟服务器。
Solaris Containers
它也是操作系统级别的虚拟化技术,专为X86和SPARC系统设计。Solaris容器是系统资源控制和通过 "区域" 提供边界隔离的组合。
OpenVZ
OpenVZ是一种Linux中操作系统级别的虚拟化技术。它允许创建多个安全隔离的Linux容器,即VPS。
Process Containers
Process容器由Google的工程师开发,一般被称为Cgroups。
LXC
LXC又叫Linux容器,这也是一种操作系统级别的虚拟化技术,允许使用单个Linux内核在宿主机上运行多个独立的系统。
Warden
在最初阶段,Warden使用LXC作为容器运行时。如今已被CloudFoundy取代。
LMCTFY
LMCTY是Let me contain that for you的缩写。它是Google的容器技术栈的开源版本。Google的工程师一直在与Docker的libertainer团队合作,并将libertainer的核心概念进行抽象并移植到此项目中。该项目的进展不明,估计会被libcontainer取代。
Docker
Docker是一个可以将应用程序及其依赖打包到几乎可以在任何服务器上运行的容器的工具。
RKT
RKT是Rocket的缩写,它是一个专注于安全和开放标准的应用程序容器引擎。正如我们所看到的,Docker并不是第一个容器化技术,但它的确是最知名的一个。Docker诞生于2013年,并获得了快速的发展,下图展示了当前Docker平台中的组成部分:
Docker立于系统基础架构之上并为应用程序提供支撑。它由称为Containerd的行业标准容器运行时组件,称为Docker Swarm的本地编排工具,以及开源的Docker Community版本和提供商业管理服务的Docker Enterprise版组成。
Docker & LXC
Docker的第一个执行环境是LXC,但从版本0.9开始LXC被libcontainer取代。
Docker & Libcontainer
Libcontainer为Docker封装了Linux提供的基础功能,如Cgroups,Namespaces,NetLink和NetFilter等,如下图所示:
2015-Docker & RunC
2015年,Docker发布了RunC,一个轻量级的跨平台的容器运行时。这基本上就是一个命令行小工具,可以直接利用libcontainer运行容器,而无需通过Docker Engine。RunC的目标是使标准容器在任何地方都可用。
Docker & OCI
OCI(The Open Containers Initiative)是一个轻量级的开放式管理架构,由Docker,CoreOS和容器行业的其他领导厂商于2015年建立。它维护一些项目,如RunC,还有容器运行时规范和镜像规范。OCI的目的是围绕容器行业制定标准,比如使用Docker创建的容器可以在任何其他容器引擎上运行。
2016-Docker & Containerd
2016年,Docker分拆了Containerd,并将其捐赠给了社区。将这个组件分解为一个单独的项目,使得Docker将容器的管理功能移出Docker的核心引擎并移入一个单独的守护进程(即Containerd)。
Docker Components
分拆完Containerd后,Docker各组件的关系如下图所示:
至此,Docker从一个单一的软件演变成了一套相互独立的组件和项目。
Docker如何运行一个容器?
Docker引擎创建容器映像;
将容器映像传递给Containerd;
Containerd调用Containerd-Shim;
Containerd-Shim使用RunC来运行容器;
Containerd-Shim允许运行时(本例中为 RunC)在启动容器后退出;
该模型带来的最大好处是在升级Docker引擎时不会中断容器的运行。
2017-容器成为主流
2017年是容器成为主流技术的一年,这就是为什么Docker在Linux之外支持众多平台(比如Docker for Mac、Docker for Windows、Docker for AWS、GCP等)的原因。
当容器技术被大众接受后,Docker公司意识到需要新的生产模型,这就是为什么它开始Moby项目。
Moby项目开启了实现协作和生产的新篇章。它是一个开源项目,旨在推进软件的容器化。Moby项目提供了数十个乐高积木一样的组件以及将它们组装成定制的基于容器的系统的框架。
Docker生产模型像任何其他常见的单个开源项目一样开始:
进而将单个项目拆分为不同的开放组件:
然后进化到可以共享这些组件以及组件集合(Assembly)的模型:
最终达到能够提供更多关于组件和通用组件集合的协作的模型:
下面我们就来介绍一些Moby项目中的组件。
Containerd
Containerd是Docker基于行业标准创建的核心容器运行时,它可以用作Linux和Windows的守护进程,并管理整个容器生命周期。
Linuxkit
Linuxkit是Moby项目中的另一个组件,它是为容器构建安全、跨平台、精简系统的工具。目前已经支持的本地Hypervisor有Hyper-V和VMware。支持的云平台有AWS、Azure等。
Infrakit
Infrakit也是Moby项目的一部分。它是创建和管理声明式、不可变和自我修复基础架构的工具包。Infrakit旨在自动化基础架构的设置和管理,以支持分布式系统和更高级别的容器编排系统。
Infrakit对于像Docker Swarm和Kubernetes这样的编排工具或跨越AWS等公共云创建自动缩放群集的用例很有用。
Libnetwork
Libnetwork是用Go语言实现的容器网络管理项目。它的目标是定义一个容器网络模型(CNM),并为应用程序提供一致的编程接口以及网络抽象。这样就可以满足容器网络的“可组合”需求。
Docker & Docker Swarm
Docker Swarm是一个在Docker引擎中构建的编排工具,从Docker1.12开始它就作为一个独立的工具被原生包含在Docker Engine中。我们可以使用Docker Cli通过Docker Swarm创建群集,并部署和管理应用程序和服务。下图描述了Docker Swarm在Docker体系中的作用:
Docker&Kubernetes
在Docker Swarm与Kubernetes的竞争中,显然是Kubernetes占据了优势。所以Docker紧急掉头,开始原生的支持与Kubernetes的集成。
这可是2017年容器界的一大新闻啊,至此,Docker用户和开发人员可以自由地选择使用Kubernetes或是Swarm执行容器的编排工作。我们可以认为Docker与Kubernetes联姻了:
新的支持Kubernetes集成的Docker版本将允许用户把他们的Docker Compose应用程序部署为Kubernetes本地Pod和服务。Kubernetes是一款非常强大且逐渐被大众认可的本地编排工具:
希望大家没有被文中众多的名称和概念搞糊涂,让我们以下图来结束本文,它展示了从2013年到2017年从Docker Hub拉取镜像次数的趋势:
<An Overall View On Docker Ecosystem — Containers , Moby, Swarm, Linuxkit, containerd, Kubernetes>
关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。