乐趣区

Docker-前世今生

前言

记得是在二零一八年十月份,当时是因为在学校报名参加了一个叫什么全国大学生大数据技能竞赛的玩意儿,赛点设置在中国农业大学计算中心,比赛是搭建一个伪分布式 Hadoop 集群系统,按照搭建步骤完成度得分。

我相信学习过 Hadoop 平台的同学们都知道,传统的搭建教学方法是借助于三台虚拟机,每台虚拟机之间需要互相配置 ssh 免密登录、防火墙安全规则以及端口许可等步骤,为了无痛解决这些繁琐的安装问题,于是乎就想到了可以写个一键自动化安装的 Shell 脚本。

与此同时,我也在 Google 有什么办法让开发人员能在配置环境上减少更多的时间开销,在瞎几把捣鼓一番之后,终于了解到 Docker 的大名。在尝到了使用 Docker 拉取系统镜像极其轻量和便捷的甜头之后,就一直对容器技术保持相当高的关注度。

过去,我一直是以运维(Ops)的视角来对待 Docker,只关心怎么使用和操作层面上的东西,而对于它本身的底层原理、怎么实现、如何自己编写 Dockerfile 等并没有实践地去了解。因为今后想要从事服务端工程师 (Dev) 相关的工作,于是便开始了 Golang 和 Docker 的系统化学习。因此,所有的学习笔记我都会归档在博客里。

事不宜迟,我们先开始了解 Docker 的前世今生吧!这对于今后的 Docker 学习旅程将十分有帮助!

我所使用的学习资料:

  • 官方文档,Docker 源码
  • 《深入浅出 Docker》

落后的旧时代

要知道今天的互联网生态是由于亿万个业务构成成的,起初,业务是基于应用(Application)运转的;如果应用故障,那么业务也会故障,也就会进而导致企业的破产。

绝大部分的应用都是运行在服务器之上的。在因特网诞生之初,每个服务器只能运行一个应用。在那个时代,Windows 和 Linux 都没有相应的技术手段来保证一台服务器可以稳定而安全地运行多个应用。所以,经常会出现这样的一幕,一个公司为了扩大它的业务线,需要增加一个新的应用时,就必须要采购一台新的服务器。但在大部分情况下,没有人知道新增应用能在服务器上耗费多少的负载,即能够使用多少的性能,负责采购服务器的 IT 部门人员只能凭借经验去购买服务器。这会带来两个问题,第一,服务器性能不足,可能会导致公司的业务线崩溃,造成交易失败,损失商业价值;第二,服务器性能过剩,因为无法计算服务器负载性能,长期以往将会对公司的资产造成极大的浪费。

虚拟机的时代

为了解决上述问题,VMware 公司创造了划时代的虚拟机技术(VM),这种技术能够允许一台服务器上执行多个应用和服务,可以很好地解决旧时代所遗留下的问题。
但是,虚拟机也有很明显的缺点,它需要依赖于专用的操作系统(OS),而 OS 会占用宿主机额外的 CPU、内存、RAM 及存储空间,这些资源本该可以允许运行更多的应用 … 所以,在性能稍差一点的计算机上运行虚拟机软件,这绝对是一个天大的噩梦。同时,在某些情况下,OS 的运行需要依赖某些许可证才能运行,例如 Windowns 和 Mac,倘若将虚拟机技术应用于市场,技术许可的运营成本也是一笔十分巨大的开销。

容器时代

容器模型实际上跟虚拟机模型很相似,但它们唯一的而且是最根本的区别就在于,容器的运行不会独占宿主机的 OS 和资源。此外,利用容器部署系统镜像,不仅具有启动快和快速迁移的特性,还能节省大量花费在许可证和为 OS 打补丁的运维成本,因为倘若一个容器环境需要更新或者回退,只需要将当前容器销毁(一般是一个容器部署一个应用,销毁后不会破坏当前依赖),接着再从 Docker Hub 上拉取(pull)一个下来即可,这就是我们经常提到“开箱即用,out-of-the-box feature”的特性。

Linux 容器

我在博客上记录的所有关于容器技术的运行环境全都是基于 Linux 环境 之下,Windows 和 Mac 的心得暂时不会收录。但是也要了解,现代容器技术起源于 Linux,并且对 Windows 和 Mac 有着程度不一的支持。

我们需要了解的第一个重点是,对容器发展影响比较大的技术主要有 内核命名空间(Kernel Namespace)、控制组(Control Group)、联合文件系统(Union File System)、以及 Docker。当然,容器技术的发展也离不开基金会对上游开源项目的支持,如果没有它们的支持,也就不会有今天蓬勃发展的容器生态。

Docker 简介

前面铺垫了这么多,终于进入本篇的正题了。Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。

Docker 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立,其标志和吉祥物是一条蓝色的鲸鱼。Docker 公司起初是一家名为 dotCloud 的平台即服务(PaaS)提供商。在底层技术上,dotCloud 使用了 Linux 容器技术,后来公司内部自己开发了一套管理和编排的工具,之后被命名为“Docker”,于是,Docker 就是这么诞生了!

【注】:“Docker”一词来源于英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。

Docker 容器引擎

在今天,我们谈及 Docker 时,大多时候是指 Docker 引擎。Docker 引擎是用于运行和编排容器的基础设施工具。可以这么类比,ESXi 是虚拟机技术(VM)的核心管理程序,而 Docker 引擎时是运行容器的核心容器运行时。

Docker 引擎主要有两个版本,企业版(EE)和社区版(CE),我在博客所使用的 Docker 引擎版本为社区版。

  • 企业版(EE)会提供 12 个月的稳定技术支持。
  • 社区版(CE)会提供 4 个月的稳定技术支持。
  • 社区版还会通过 Edge 方式发布月度版。

Docker 开源项目

由于以 Docker 为代表的容器技术在计算机领域内应用很广,所以当今“Docker”一词也会用于指代那些开源的 Docker 项目,例如各种衍生版本。不过,Docker 项目在 2017 年于 Austin 举办的 DockerCon 上被正式命名为 Mody 项目(其 Logo 如图所示)。因为这次改名,Github 上的 docker/docker 库也被转移到 moby/moby。

开发语言

从 Github 仓库可以看到,多数项目及其工具都是基于 Golang 编写的,也称 Go 语言,这是谷歌推出一种新的系统级编程语言。使用 Go 语言的开发者,将会更容易地为该项目贡献代码。

开发容器生态

前面我们提到了,容器生态的发展离不开基金会的支持,其中就不得不提到开放容器计划(The Open Container Initative, OCI),这是一个旨在对容器基础架构中的组件进行标准化的管理委员会。

关于 OCI 的成立,其实还有段小插曲,在这里可以大概简述一下是何故?事情起源于,一个名为 CoreOS 的公司不喜欢 Docker 的某些行事方式,因此,它就创建了一个新的开源标准,称作“appc”,该标准涉及诸如镜像格式和容器运行时等方面,此外它还开发了一个名为“rkt”的实现。

CoreOS 公司和 Docker 公司分别主导的两个处于竞争状态的容器标准将容器生态陷入一种尴尬的境地,这使得容器生态陷入了分裂。考虑到这一点,相关的双方都使用的尽量成熟的方式来处理此事,共同成立了 OCI——一个旨在管理容器标准的委员会。

今天,OCI 已经发布了两份标准:镜像规范和运行时规范。OCI 在 Linux 基金会的支持下运作,Docker 和 CoreOS 都是其主要的贡献者。

退出移动版