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社群”。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
存储 监控 安全
简述Docker过去6个月的变化
本文讲的是简述Docker过去6个月的变化【编者的话】最近半年,围绕Docker的安全、存储、编排等发生了许多变化,这些变化一方面使得用户使用Docker更加方便,一方面也使得整个容器生态圈发生了大地震。
1370 0
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
258 93
|
18天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
58 23
|
18天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
261 15
|
3月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
319 78
|
2月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
187 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
3月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
3月前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
250 35
|
3月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
100 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
72 17