发布时间:2025-02-26 人气:78次
Docker是一种容器技术,相信不少做开发的同学十分熟悉了,今天我们来通俗地理解它的前世今生。
故事背景
众所周知,计算机的资源,如CPU、内存、显卡、磁盘等是比较宝贵的,即便是科技如此发达的今天,我们常用的办公电脑或者专用的服务器,与10多年前相比,也没有发生质的变化。
由于硬件资源的限制,电脑可支持运行的程序数量也是有限的,在电脑操作系统的设计中,通常会多个程序共享这些资源。
但如果我们想独享一部分资源,而且运行时不想与其他应用程序相互干扰,要怎么办呢?
虚拟化
早在1979年,Unix的第七个版本引入了chroot机制,意味着支持虚拟化的操作系统诞生了。随后的10年里,intel在x86的指令集上支持了虚拟化的技术。
在上世纪80、90年代,做虚拟化的平台如雨后春笋般涌现,其中最为出名的就是VMware。
VMware实现了计算机的全虚拟化,即模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,这样就使得其它系统软件完全不做任何修改就可以在虚拟机中运行。
凭借此项技术,VMware一举稳坐虚拟化龙头老大的位置。当然,后面又出现了一个叫OpenStack的家伙。
逃离VM
既然虚拟化的技术已经如此成熟,而且能很好的解决资源的问题,为啥还要搞出一个容器技术呢?
要理解这个问题,我们需要先来看看虚拟机是如何工作的。
假设有一台性能强大的物理机,在这台物理上,通过虚拟化的软件创建了多个虚拟机,我们的子系统便运行在这些虚拟机之中。
比如,【虚拟机1】中运行了一个Windows系统,在该系统上运行了一个QQ客户端程序。在【虚拟机2】中运行了一个Linux系统,在该系统上运行了一个QQ的文件服务。这样,我们在一台物理机上运行了多个程序,而且互不影响。
一切看似美好,可是运行一段时间后,服务越来越多,我们发现每次拓展应用服务时,需要先创建和分配虚拟资源,再配置各种环境参数,而这都是一些重复且无意义的工作。
同时,启动这些数量庞大的虚拟机集群,也要花费较大的时间成本,而且管理这些虚拟机本身也需要占用较大的资源。虚拟机越多,占用资源就越多,启动也就越慢,性能就越低。
万事俱备
随着互联网的发展,云服务慢慢成为主流,致使服务器集群的规模也越来越大。
也就是在这样的背景下,2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。
不过在此之前,Linux系统已经具备了解决实现容器的核心技术—运行环境隔离技术。
2006年,Google推出Process Containers,用来对一组进程进行限制、记账、隔离资源(CPU、内存、磁盘 I/O、网络等)。由于技术更加成熟,Process Container 在 2006 年正式推出后,第二年就进入了 Linux 内核主干,并正式更名为 Cgroups。
2008 年,通过将 Cgroups 的资源管理能力和 Linux Namespace (命名空间)的视图隔离能力组合在一起,一项完整的容器技术 LXC (Linux Container)出现在了 Linux 内核中。
容器乍现
也就是说,Docker并没有进行真正的技术创新,而是一种应用上的创新。
容器不需要虚拟出整个操作系统,而是利用Linux内核的环境隔离技术,隔离出一个沙箱环境,我们的应用程序就运行在这样的一个个沙箱之中。
Docker真正核心的创新是容器镜像(docker image),一种新型的应用打包、分发和运行机制。容器镜像将应用运行环境,包括代码、依赖库、工具、资源文件和元信息等,打包成一种操作系统发行版无关的不可变更软件包。
容器镜像打包了整个容器运行依赖的环境,以避免依赖运行容器的服务器的操作系统,从而实现【build once,run anywhere】,一次构建,到处运行。
由于Docker更加轻盈小巧,所以它启动很快,几秒钟就能完成,同时它占用的空间很小,一台主机可以运行数十个容器,而且对硬件资源利用率远比虚拟机高。在管理方面,容器的编排技术也使得容器本身在高并发的应用中大放异彩。
差异对比
如何构建
值得注意的是,Docker本身并不是容器,而是构建容器的工具,正如它的名字描述的那样,码头工人。
Docker的基础架构如下图所示,其中核心的对象包括三个:Images(镜像)、Container(容器)、Hub(放置镜像的仓库)。
这里大家不必了解Docker的详细原理,只需要大致搞懂它的工作逻辑便可,有感兴趣的同学可以参考官方文档。
用类比来描述的话,比如建房子:
1. 工程师通过图纸将房子的架构、材料、建造细节等描述好,这个图纸就是Dockerfile;
2. 有了图纸后,工程师借助工具,也就是Docker的工具包,将房子一层层垒起来,垒起来的房子作为一个标准的样板房,也就是Image;
3. 工程师把样板房保存到库房中,这个库房就是Hub;
4. 当有人需要建造一个房子的时候,工程从仓库中找到相应的样板房,然后将这个样板房在本地建起来(计算机世界就是直接复制一个)变成一个真实的房子,这个房子就是运行的容器了,也就是Container。