6年来,Docker的这些变化你都知道吗?

简介:

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平台中的组成部分:

dcd76483d03547813062d33505cee45a468600d4

Docker立于系统基础架构之上并为应用程序提供支撑。它由称为Containerd的行业标准容器运行时组件,称为Docker Swarm的本地编排工具,以及开源的Docker Community版本和提供商业管理服务的Docker Enterprise版组成。

二、与Docker相关的重要概念

Docker & LXC

Docker的第一个执行环境是LXC,但从版本0.9开始LXC被libcontainer取代。

Docker & Libcontainer

Libcontainer为Docker封装了Linux提供的基础功能,如Cgroups,Namespaces,NetLink和NetFilter等,如下图所示:

631ee6bf971ca6f4e8c863b2ee976208cf30a292

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各组件的关系如下图所示:

664592d947d82c4f61344ad3728ae3dbafa6f8fc

至此,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 Project

Moby项目开启了实现协作和生产的新篇章。它是一个开源项目,旨在推进软件的容器化。Moby项目提供了数十个乐高积木一样的组件以及将它们组装成定制的基于容器的系统的框架。

Docker生产模型像任何其他常见的单个开源项目一样开始:

df01f790b3015fb3953d4abf8e7046819e1df23f

进而将单个项目拆分为不同的开放组件:

289a35fdd7f22ad7ddf9b6c991f5cfc2d32c0d9e

然后进化到可以共享这些组件以及组件集合(Assembly)的模型:

18b8b3bc268e2152570c6afbbeafacc592f7f6d3

最终达到能够提供更多关于组件和通用组件集合的协作的模型:

c7635485a5d400acf8d1bc8f04064857f19d9d1f

下面我们就来介绍一些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体系中的作用:

eb9960767d5a95ece49b00517c6394be15fa90f5

Docker&Kubernetes

在Docker Swarm与Kubernetes的竞争中,显然是Kubernetes占据了优势。所以Docker紧急掉头,开始原生的支持与Kubernetes的集成。

这可是2017年容器界的一大新闻啊,至此,Docker用户和开发人员可以自由地选择使用Kubernetes或是Swarm执行容器的编排工作。我们可以认为Docker与Kubernetes联姻了:

7915b63a6a0a300d1d091dc4f55b249ac67967da

新的支持Kubernetes集成的Docker版本将允许用户把他们的Docker Compose应用程序部署为Kubernetes本地Pod和服务。Kubernetes是一款非常强大且逐渐被大众认可的本地编排工具:

e10b18caa8dd3874186b15bb1cedce7ac8de17bf

希望大家没有被文中众多的名称和概念搞糊涂,让我们以下图来结束本文,它展示了从2013年到2017年从Docker Hub拉取镜像次数的趋势:

8bbabc8dfbd1db6f48794803401f6b3b0d95f918

注:本文所有图片均来自互联网


原文发布时间为:2018-11-22

本文作者:sparkdev

本文来自云栖社区合作伙伴“DBAplus社群”,了解相关信息可以关注“DBAplus社群”。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 监控 安全
简述Docker过去6个月的变化
本文讲的是简述Docker过去6个月的变化【编者的话】最近半年,围绕Docker的安全、存储、编排等发生了许多变化,这些变化一方面使得用户使用Docker更加方便,一方面也使得整个容器生态圈发生了大地震。
1318 0
|
21天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Oracle 关系型数据库 数据库
|
1天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
7 0
|
10天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
12 0
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
15 0
|
10天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
19 0
|
18天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
23 1
|
21天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
45 1