为什么是Docker
进入21世纪,继互联网之后,云计算开始大放异彩。云计算是互联网发展后期的必然方向,反过来,云计算也进一步推动了互联网的发展。云计算模式最关键的突破就是资源使用方式的改变。
云计算是一种融合了多项计算机技术的、以数据和处理能力为中心的密集型计算模式,它的主要技术包括虚拟化、分布式资源管理、分布式并发编程模式、信息安全等。其中,虚拟化作为云计算的核心元素,其价值日益体现:一方面,集中部署 IT 资源并抽象化以实现多用户共享,极大程度地提高了资源的利用率,降低了使用成本;另一方面,缓解了复杂的软硬件适配问题。所以, 虚拟化技术是云计算中最关键、最核心的技术原动力。
在早期,主流的虚拟化技术是虚拟机,它实现了极高的隔离度和标准化, 但是这种基于硬件隔离的虚拟化方案也给宿主机资源带来了极大的压力。
为了解决虚拟机的种种问题,获得比虚拟机更快、更少资源的虚拟化方法, 就需要对资源进行比虚拟机更高级别的抽象。通过更细的粒度对资源进行分配和控制,是一种可行的思路。为此,Linux内核添加了新的技术,这便是众所周知的控制组(cgroup) 。通过这一技术来对服务进行运行时隔离,这种被隔离起来的运行时环境,被称为Linux容器(LXC)。
Docker是基于LXC容器技术的封装,Go语言开发实现。Docker与虚拟机的详细对比,可参见阮一峰老师的《Docker入门教程》,这里不再赘述。
在Docker生态环境的不断完善下,Docker技术的最佳实践场景也越来越多,除了基础云服务平台,在CaaS、CI、CD、DevOps、微服务架构等方面也吸引了越来越多的目光。
Docker是什么
Docker作为一种轻量级虚拟化技术,其本质是一个进程以及运行该进程所需要的依赖,而Docker内的所有进程是这个容器进程的子进程。在这种虚拟化模型下,通过资源隔离、资源控制等技术手段,来解决Docker在实现虚拟化目标过程中遇到的种种障碍。
Docker容器间的资源隔离,通过Linux内核的 namespace实现。这里的资源包括:网络空间(net)、文件系统空间(mnt)、用户空间(user)、进程空间(pid)、进程通信空间(ipc)和域名空间(uts)。这些空间的隔离需求都是虚拟化的基本需求,都很好理解,这里只简单讲一下域名空间。通过域名空间的隔离,每个Docker就可以拥有独立的主机名和域名,在网络上可以被视作一个独立的节点,而不再是宿主机上的一个进程。
对 Docker 而言, 一方面要实现各容器的良好隔离, 另一方面还需要对容器使用的资源进行限制和管理。
Docker 依靠 Linux 提供的 cgroup 技术来实现资源控制。cgroup 是由 Linux内核提供的一种对各进程组所使用的物理资源( 包括CPU、Memory、IO等) 进行记录、限制和隔离的技术。cgroup的实现本质上是给任务挂上钩子,当任务运行的过程中使用某种资源时,就会触发钩子上锁附带的子系统进行检测,根据资源类别的不同,使用对应的技术进行资源限制和优先级分配。
换个角度看,Docker也是一个执行环境,一个与宿主机共享内核但与系统中其他进程资源相隔离的执行环境,这就是Docker容器。
从上图官网给出Docker架构图可以看出,这个执行环境需要提供这几个基本要素:
- Docker client:Docker客户端;
- Docker deamon:Docker服务端,处理用户(Docker client)请求;
- Docker Registry:Docker镜像仓库。
Docker 中有两个重要概念, 一个是镜像( Image) , 另一个是容器( Container)。可以这么理解,镜像是容器的静态表现形式或物理存储对象,而容器是镜像的动态表现形态或内存存储对象。
之所以抽象出镜像这个概念,是为了解决LXC容器的可移植性问题,即无法通过标准化的镜像/模板实现虚拟容器的制、复制、重建。 因而 Docker 在 LXC 基础上进行了进一步封装,通过文件系统存储技术(如aufs、device mapper、overlayfs)实现镜像的分层、写时复制、联合挂载、内容寻找等关键技术特性,很好地解决了容器的快速移动和更新问题。
这里特别提一下为什么把分层作为镜像的重要特性。镜像中大部分文件都是相同的(如rootfs等),如果不分层,势必存在众多的文件冗余,造成镜像大小沉重。通过分层技术,实现在不同镜像之间共享镜像层,实现轻量级别的镜像配置,提高Docker镜像构建、存储和分发的效率,节省了用户的时间和存储空间。
回到最开始的问题:Docker是什么?这取决于看它的视角。从操作系统的视角来看,它是进程;从用户的角度来看,它是运行环境;从开发的角度来看,它是虚拟化技术。
Docker云是什么
Docker作为云计算虚拟化的一环,打开了云计算的大门。进入云计算的大门后,发现门后的新的生态系统是如此庞大。在分布式的生产使用中,容器相关的网络、存储、集群、高可用性等都是不得不面对的问题。从容器到容器云的进化应运而生。
容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。
Docker只是个单机下的容器管理工具,通过命令行进行手动管理。在企业使用场景中,容器有了跨主机(即分布式)的使用需求,而且可能容器数量庞大,拓扑关系复杂。手动操作方式的低效和不可移植性是个严重的应用障碍。Docker容器的编排和部署工具在这种背景下应运而生,Fig/Compose,Machine,Swarm,Fleet,Kubernetes都属于此类。
编排即依赖关系管理,部署则是在目标机器上按依赖关系进行动作。通过编排和部署工具,可以在一个新的环境上快速重现容器的配置和集群。
- Compose侧重于单机环境的Docker的编排部署,管理对象的基本单位是容器;
- Machine侧重于跨宿主机环境的部署管理,管理对象的基本单位是宿主机;
- Swarm侧重于集群环境的部署管理,管理对象的基本单位是具有相同标签属性的多台宿主机的集群;
- Fleet侧重于集群环境的编排部署,管理对象的基本单位是服务(全局服务单元);
- Kubernetes除了支持集群环境的编排、部署,还支持副本管理、调度管理、存储管理、网络管理、多租户管理等特性,管理对象的基本单位是容器组(pod);
可见它们对管理对象的抽象层次越来越高,对Docker云的运维能力也是越来越强。
(完)