- A+
第1章Docker——AFAP快速介绍
1.1什么是LXC
一种轻量级隔离及共享机制,用于实现容器与宿主机的资源共享。
LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
1、与宿主机使用同一个内核,性能损耗以及占用空间损耗小;
2、不需要指令级模拟;
3、不需要即时(Just-in-time)编译;
4、容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
5、避免了准虚拟化和系统调用替换中的复杂性;
相应的其短板在于:
1、实例隔离性低
2、系统冗余度低
3、实例间耦合度高
总结:Linux Container是一种轻量级的虚拟化的手段。我们在享受更轻量级的资源分配机制时,也必须承担相应的可靠性成本。
1.2什么是Docker
Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业)。该项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障的机制,在文件系统上,则使用了AUFS以及之后的OVERLAY。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不产生诸如虚拟机VM额外的操作系统开销,提高了资源利用率。
下面图比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复制本地主机的操作系统,而传统方式则是在硬件层面实现。
Docker vs VM
1.3Docker的工作模式
Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。
用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
而Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。
CLI交互模型
Docker的C/S模式
RemoteAPI交互模型
Docker的C/S模式-RemoteAPI
个人思考:docker容器需要实现隔离和资源分配,其所属实例必然依附于Docker Daemon乃至docker service,当虽然有隔离,但一旦出现问题,Docker Daemon出现异常需要重启时,可能会面临所有容器都被结束的情况,而依附于libvirt的kvm虚机进程则管理和运行分离,即便管理配置重启,与不至于出现尴尬的无法管理or全停应用的情况。对于规模较大,冗余较多(主要指设备数量)的架构,不失为一种选择。但规模较小时,我们还是尽量应该牺牲其他开销成本使用其他方案保证稳定性为上。
1.4Docker八中应用场景
docker的部署设想确实改变了传统的代码上线和部署模式。
图 Docker八中应用场景
1、简化配置,统一配置,通过镜像快速启动(Simplifying)
2、代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management)
3、开发效率,对开发人员,有了镜像,直接启动容器即可(Developer Productivity)
4、应用隔离,相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(Applsolation)
5、服务器整合,一台服务器跑多个docker容器,提高服务器的利用率(Server Consolidation)
6、调试能力,debug调试(Debugging Capabilties)
7、多租户,一个租户多个用户,类似于阿里公有云的一个project下多个用户(Multi-tenancy)
8、快速部署,不需要启动操作系统,实现秒级部署(Rapid Deplovment)
1.5Docker八种开发模式
1.共享基础容器
2.共享卷开发容器
3.开发工具容器
4.不同环境下测试容器
5.构建容器
6.安装容器
7.盒子中默认服务容器
8.基础设施/粘合剂容器
1.6Docker九个基本事实
1.容器不同于虚拟机
2.容器不如虚拟机来得成熟
3.容器可以在几分之一秒内启动
4.容器已在大规模环境证明了自身的价值
5.IT人员称容器为轻量级
6.容器引发了安全问题
7.Docker已成为容器的代名词,但它不是唯一的提供者
8.容器能节省IT人力,加快更新
9.容器仍面临一些没有解决的问题
1.7使用Docker理由
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式具有众多的优势。
首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资源的利用率很低,一台主机上可以同时运行数千个Docker容器。
至于为什么要使用Docker:
1、 技术储备
相对大公司这个非常重要,如果你们都在用,他们不用就落后了,等到完全成熟以后就跟不上了。
2、 无技术栈和技术债
没有任何Openstack或者saltstack,服务down了就down了,所有的服务都是松耦合。
3、跟上潮流(提升自我,装逼,最危险)
面试的时候大家都会Docker,你不会是不是落后了。
4、符合当前业务
虽然Docker很优秀,但是,大多数处在第二种状态,很少有符合自己的业务
1.8Docker改变了什么
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致性
面向架构:自动化扩容(微服务)
1.8.1Docker更快速的交付和部署
对于开发和人员来说,最希望的就是一次创建和配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全称可见,使团队中的其他成员更容易理解应用程序是如何创建和工作。Docker容器很轻很快!容器的启动时间是秒级的,大量第节约开发、测试、部署的时间。
1.8.2Docker更高效的虚拟化
Docker容器的运行不需要额外的Hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
1.8.3Docker更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
1.8.4Docker更简单的管理
使用Docker,只需要小小的修改,就可以替代往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
1.9Docker与虚拟化
类别 | Docker | OpenStack | 结论 |
部署难度 | 非常简单 | 组件多,部署复杂 | 因为平台是对已有的线上生产环境进行改造,必须选择侵入性较小的容器化技术 |
启动速度 | 秒级 | 分钟级 | 面对流量峰值,速度就是一切 |
执行性能 | 和物理系统几乎一致 | VM会占用一些资源 | 微博核心业务对服务SLA要求非常苛刻 |
镜像体积 | 镜像是MB级别 | 虚拟机镜像是GB级别 | 当集群大规模部署时,体积小就代表更大的并发调度量 |
管理效率 | 管理简单 | 组件相互依赖,管理复杂 | 生产系统集群可控性是核心竞争力 |
隔离性 | 隔离性高 | 彻底隔离 | |
可管理性能 | 单进程、不建议启动SSH | 完整的系统管理 | |
网络连接 | 比较弱 | 借助Neutron可以灵活组建各类网络架构 |
