Docker初识
技术背景
如果说主机时代比拼的是单个服务器的物理性能(如CPU主频和内存)的强弱,那么在云时代,最为看重的是凭借着虚拟化技术所构建的集群处理能力。
那么什么是虚拟化技术?
虚拟化技术是一个通用的概念,在不同领域有着不同的理解。维基百科的定义如下:
“在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术, 是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和资料存储。”
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统和应用,从而提高资源的利用率,并且降低成本、方便管理和容错容灾等好处。
容器虚拟化技术书与操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。而传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上直接实现了虚拟化,直接复用了本地的操作系统,因此更加的轻量级。
Docker是基于Go语言实现的开源容器项目。它最初的构想是要实现“Build, Ship and Run Any App, Anywhere", 即通过对应用的封装、分发、部署、运行生命周期进行管理,到达应用级别的“一次封装,到处运行”,这和Java的“write once, run anywhere",还是有本质的区别。一个是应用级别的,而一个是代码级别。
简单来讲,可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器运行着一个应用,不同的容器相互隔离。容器之间也可以通过网络进行相互通信。容器的创建和停止十分的迅速,几乎和创建和终止原生应用一致。另外,容器自身对系统资源的额外需求也十分有限,远远低于传统的虚拟机。
容器相对于宿主机来说,就是一个应用。但是对用户来说,可能是另一个虚拟化的主机。
Docker在正确的地点和正确的时间顺应了正确的趋势——如何正确的构建应用。通过容器化来打包应用、解耦应用和运行平台。这意味着在进行应用迁移的时候,只需要在新的服务器上启动需要的容器即可。因为原来的应用开发,我们需要在系统上部署应用所需要的应用环境,这些应用环境是直接运行在底层的操作系统上的。无法保证同一个应用在不同的环境中都行为一致,所以在迁移的过程中都需要进行重新的部署和调试。存在大量重复性工作。
重要概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
镜像
类似于虚拟机的镜像,可以理解是一个只读的模板。例如一个镜像中包含了一个基本的操作系统,里面仅安装了Apache应用,可以把它称之为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本控制和增量的文件系统,Docker提供了一套非常简单的机制来创建和更新镜像。
容器
类似以一个轻量级的沙箱。Docker利用容器来运行和隔离应用。容器从镜像创建应用运行的实例。它可以启动、停止、删除。而这些容器都是彼此隔离的、互不可见的。
可以把容器看做是一个简易的Linux系统环境以及运行在其中的应用程序打包而成的盒子。
镜像本身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
仓库
是Docker集中存放镜像文件的场所。还有一个概念是仓库的注册服务器(Registry),这是存放仓库的地方。仓库也分为公有和私有,目前最大的公有仓库是Docker Hub,每个公司可以创建自己的仓库。
Docker的优势
- 很快,启动和停止可以在秒级别实现
- 对系统资源要求少,启动N个容器不用分配N份资源。而是启动N个隔离的“很薄的”容器,并将应用放进容器即可,能获得接近原生的运行性能
- 类似Git的设计理念方便用户获取、分发和更新应用镜像、存储复用和增量更新
- 通过Dockfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程
- 安全隔离