🐳 Docker 概述¶
约 2614 个字 1 张图片 预计阅读时间 13 分钟
什么是容器?¶
容器从根本上改变了人们开发、发布以及运行软件的方式。软件开发者可以在本地构建软件,因为他们知道软件能够在任何主机环境下运行,无论是IT部门的机房、用户的笔记本电脑,还是云端集群,而且运行时并无差异。运维工程师只需专注于维护网络和资源,保证正常运行时间,减少了花在配置环境及解决系统依赖关系上的时间。
容器是对应用程序及其依赖关系的封装。乍一看容器只是个轻量级的虚拟机,它和虚拟机一样拥有一个被隔离的操作系统实例,用来运行应用程序。
但容器拥有一些优点,使它能实现一些传统虚拟机很难实现甚至无法实现的用例:
- 容器能与主机的操作系统共享资源,因而它的效率高出一个数量级。启动和停止容器均只需一瞬间。相比在主机上直接运行程序,容器的性能损耗非常低,甚至是零损耗。
- 容器具有可移植性,这极有可能彻底解决由于运行环境的些许改变而导致的问题,甚至有可能彻底终止开发者的抱怨:"可是程序在我的计算机上能正常工作!"
- 容器是轻量的,这意味着开发者能同时运行数十个容器,并能模拟分布式系统在真实运行环境下的情况。运维工程师在一台主机上能运行的容器数量,远远超过仅使用虚拟机时。
- 对于最终用户及开发者而言,容器的优势不仅仅体现在云端部署。用户可以下载并执行复杂的应用程序,而无需花费大量时间在配置和安装的问题上,也无需担心对系统本身的改动。另一方面,应用程序的开发者不用再操心用户环境的差异,以及依赖关系是否满足。
更重要的是,虚拟机和容器的根本目标不尽相同。虚拟机的目的是要完整地模拟另一个环境,而容器的目的则是使应用程序能够移植,并把所有依赖关系包含进去。
容器与虚拟机的比较¶
虽然容器和虚拟机乍一看很相似,但它们之间有着重大的差异:
传统虚拟机:
- 需要虚拟机管理程序(hypervisor)来创建及运行虚拟机
- 控制访问底层操作系统及硬件的权限
- 每个虚拟机需要一个完整的操作系统、用来运行的应用程序以及所需的程序库
- 资源占用大,性能损耗较高
容器:
- 主机的内核与容器共享,容器只能运行与主机一样的内核
- 多个容器可以共享相同的程序库,只需一份,不用复制
- 容器引擎负责启动及停止容器
- 容器中执行的进程与主机自身的进程是等价的,因此没有类似虚拟机管理程序执行所带来的损耗
- 轻量级,启动快速,资源占用小
虚拟机与容器都可以把主机上的应用程序隔离开来。虚拟技术中的虚拟机管理程序能带来更高一级的隔离性能,是已被公认且千锤百炼的技术。容器技术相对较新,很多公司在取得充分可靠的运行记录前,无法完全信任容器的隔离性能。因此,不难发现有些系统同时采用这两种技术,将容器运行在虚拟机内,这样就能鱼与熊掌兼得。
Docker 与容器¶
容器并不是新概念。几十年来,UNIX系统一直以chroot命令来提供简单的文件系统隔离。自1998年起,FreeBSD有了jail命令,它把chroot的沙盒机制扩展至进程。2001年左右,Solaris Zones提供了一个相对完整的容器化技术,但它只能用于Solaris操作系统。同样在2001年,Parallels公司推出用于Linux的商业容器技术,名为Virtuozzo,并于2005年把核心技术开源,称其为OpenVZ。然后,谷歌开始为Linux内核开发CGroups机制,并开始将它的基础设施容器化。2008年,Linux容器(LinuxContainers,LXC)项目启动,它把CGroups、内核命名空间以及chroot等技术融合,提供了一套完整的容器方案。最后, Docker于2013年补充了当时容器化技术的不足,将容器技术带入主流。
Docker利用现有的Linux容器技术,以不同方式将其封装及扩展——主要是通过提供可移植的镜像,以及一个用户友好的接口——来创建一套完整的容器创建及发布方案。Docker平台拥有两个不同部分:
- Docker引擎:负责创建与运行容器的引擎
- Docker Hub:用来发布容器的云服务
Docker引擎提供了一个快速且便捷的接口用来运行容器。在此之前,使用如LXC等技术运行容器需要相当多的专业知识以及手动操作。Docker Hub提供大量的公共容器镜像以供下载,方便用户快速上手,并且避免了重复劳动。
由于Docker引擎是开源的,这使得Docker社区日益壮大,并能借助大家的帮助来修正问题及改进。Docker的迅速崛起,使它成为事实上的业界标准,由此业界不得不为容器运行环境及格式发展出一套独立于任何组织的正式标准。2015年,开放容器促进会(Open Container Initiative,OCI)终于成立,它是一个由Docker、微软、CoreOS以及多个重要团体组成的管理架构,目标就是要发展出这一标准。
Docker 的优势¶
1. 应用于更快速的交付和部署¶
- 虚拟机:通过大量的帮助文档,安装程序
- Docker:打包镜像发布测试,一键运行
2. 更便捷的升级和扩缩容¶
通过使用Docker,部署应用如同搭积木一样。
3. 更简单的系统运维¶
使用容器化后开发和测试环境是 高度一致 的。
4. 更高效的计算资源利用¶
Docker是内核级别的虚拟化:可以在 同一物理机上运行多个容器,让服务器的性能发挥到极致。
Docker 的历史¶
2008年,Solomon Hykes为了建立一个与编程语言无关的平台即服务(Platform-as-a-Service,PaaS)产品,创立了dotCloud公司。2013年3月,dotCloud将其核心组件Docker开源。
Docker早期版本只是在简单封装LXC以及联合文件系统(union filesystem)之上多加了点东西,但往后无论是发展还是被接受的速度都快得惊人。6个月内Docker就在GitHub上获得了6700多颗星,以及175名非公司员工的贡献者。这导致dotCloud把公司名称改为Docker,并将公司的商业模式重新定位。
0.1版本发布15个月后,Docker 1.0于2014年6月发布。Docker 1.0代表着稳定性与可靠性的飞跃——它声称已经"生产就绪",虽然在这之前就已经有一些公司(如Spotify和百度)正式投入使用。同时,Docker推出了一个名为Docker Hub的公共容器仓库,这标志着Docker从一个单纯的容器引擎开始转变为一个完整的平台。
微服务和单一架构¶
微服务是容器最主要的用例,也是容器技术兴起的最大推动力。
微服务 是一种软件系统开发和构成形式,由小而独立的组件组成,这些组件通过网络互相连接沟通。
单一架构(monolith) 软件开发模式,只有一个庞大的程序,一般由C++或Java实现。
当需要扩展一个单一架构的软件时,纵向扩展(scale up)往往是唯一选择,也就是说,需要把机器升级,增加内存和使用更强大的CPU,才能应付更多的负载。相反,微服务则设计成横向扩展(scale out),为了满足增长的需求,只需部署多台机器摊分负载即可。微服务架构还可以针对系统中的瓶颈,只扩展某个特定服务所需的资源。但对于单一架构而言,要么扩展所有东西,要么不扩展,而这会造成资源浪费。
容器与生俱来的轻量级特性及速度,意味着它尤其适合用于微服务架构。与虚拟机相比,容器的体积小很多,并且能快速部署,这使得微服务架构能使用最少的资源,又能迅速应对需求的变化。
Docker 为软件开发带来的变化¶
容器技术的兴起很大一部分是由开发者所驱动的,也是他们首次使用了能真正发挥容器潜力的工具。对实施快速迭代开发模式的开发者来说,Docker容器能迅速启动至关重要,因为他们可以很快看到代码变更后的结果。容器能保障的可移植性及隔离特性,使得开发与运维部门之间更容易协作,因为开发者知道他们的代码在不同环境下都能工作,而运维部门只需专注于容器的托管及服务编排,而无需担心任何关于代码的事。
Docker为软件开发带来了翻天覆地的变化。假如没有Docker,在很长一段时间内容器将仍是一种鲜为人知的技术。