Docker介绍
【Docker起源】
从 2000 年开始,各家类 Unix 操作系统厂商开始陆续推出容器相关的项目,2008 年 Google 的 Cgroups 贡献给 Linux kernel 2.6.24 后创造了 LXC( Linux Containers),实现了多个独立的 Linux 环境(容器)可运行在同一个内核。对于一个完整独立运行环境来说,需要包含三个关键:环境隔离、资源控制和文件系统。在 LXC 中则分别通过 Namespace、Cgroups、rootfs 来实现相应的能力。
Namespace:
环境隔离。LXC 将内核全局资源封装,每个 Namespace 都有一份独立的资源,使得不同的进程在各自 Namespace 内对同一种资源的使用互不干扰,不会影响其他 Namespace 下的资源,实现了进程隔离。
Cgroups:
资源控制。LXC 通过 Cgroups 对资源进行控制,限制和隔离一组进程对系统资源的使用。在 Cgroups 出现之前 OS 只能对一个进程做资源限制,而 Cgroups 可以对进程进行任意分组,如何分组由用户自定义,借此实现对于一个 Namespace 的资源调度管理。
Rootfs:
文件系统。rootfs 挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统。rootfs 包含一个操作系统所涉及的文件、配置和目录,在 Linux 操作系统内核启动时,内核会先挂载一个只读的 rootfs,当系统检测其完整性之后,决定是否将其切换到读写模式。
在通过 LXC 构建容器后,一台宿主机能够实现多个相互隔离应用的运行。同时,共享内核使得每个容器又很轻量,解决了运行大量隔离应用时虚拟机资源消耗过重的弊端。然而,LXC 虽解决了应用隔离的问题,但却只是轻量的容器技术,没有解决各平台软件交付标准不统一的问题,如不同的软件交付工具、应用运行规范不统一、环境依赖复杂等带来的配置开销。这些问题使容器技术的推广依然比较有限,直到 Docker 的出现。
传统部署、虚拟化部署和容器化部署区别
传统部署时代
早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果,其他应用程序的性能将下降。解决方案是在不同的物理服务器上运行每个应用程序。但这并没有随着资源利用不足而扩展,并且组织维护许多物理服务器的成本很高。
虚拟化部署时代
作为解决方案,引入了虚拟化。它允许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化允许在VM之间隔离应用程序,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由访问。虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。借助虚拟化,您可以将一组物理资源呈现为一组一次性虚拟机。每个VM都是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代
容器类似于VM,但是它们具有轻松的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻质的。与VM相似,容器具有自己的文件系统,CPU,内存,进程空间等。由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
【Docker特点】
敏捷的应用程序创建和部署:
与使用VM映像相比,容器映像创建的简便性和效率更高
持续开发,集成和部署:
通过快速轻松的回滚(由于图像不可更改),提供可靠且频繁的容器映像构建和部署
开发和运营的关注点分离:
在构建/发布时而不是在部署时创建应用程序容器映像,从而将应用程序与基础架构分离
可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他信号
跨开发,测试和生产的环境一致性:在便携式计算机上与在云中相同地运行
云和操作系统分发的可移植性:
可在Ubuntu,RHEL,CoreOS,本地,主要公共云以及其他任何地方运行
以应用程序为中心的管理:
提高抽象级别,从在虚拟硬件上运行操作系统到使用逻辑资源在操作系统上运行应用程序
松散耦合,分布式,弹性,解放的微服务:
应用程序被分解成较小的独立部分,并且可以动态部署和管理–而不是在一台大型单机上运行的整体堆栈
资源隔离:
可预测的应用程序性能
资源利用:
高效率和高密度
PS:docker没有有状态服务的说法。容器存储层的生命周期和容器一样,一旦容器消亡,存储层也一并消亡,所以原生的容器是无状态的,所以说Docker不适合有状态的应用如MySQL等。这也就是为什么之后编排系统会引入有状态服务和持久化存储以支持有状态服务