介 绍docker
容器,以及Docker和Kubernetes之类的容器技术已经日益成为许多开发人员工具包中常见的工具。容器化的核心目标是提供一种更好的方式,以可预测和便于管理的方式在不一样的环境中建立、打包以及部署软件。编程
在本文中,咱们将一窥什么是容器,它与其余虚拟化技术有何不一样以及它在部署和运维的过程当中有哪些优点。若是您只是想迅速了解有关容器的核心概念,您能够直接滑到倒数第二部分【容器专用术语】查看。安全
什么是容器?服务器
容器是一种操做系统虚拟化技术,用于打包应用程序及其依赖项,并在隔离环境中运行它们。在不一样类型的基础架构中,容器以一种标准的方式,提供了轻量级打包和部署应用程序的方法。网络
容器的这些特性使其对开发和运维人员极具吸引力。由于容器能够在任意支持容器的主机上运行一致,因此开发人员能够直接在本地测试相同的软件,稍后就能够方便地部署到完整的生产环境中。同时,Container Format能够确保应用程序的依赖项被放到镜像中,简化了手动操做的部分和发布流程。由于运行容器的主机和平台是通用的,因此能够标准化管理基于容器系统的基础架构。架构
容器从容器镜像中建立,其中包含了系统、应用程序和容器环境。容器镜像和建立特定容器模板同样,同一镜像可用于生成任意数量的运行中的容器。这与类和实例在面向对象编程中的工做方式相似:一个单独的类能够用于建立任何数量的实例,一个单独的容器镜像也能够用于建立任何数量的容器。这类比喻也适用于继承方面,由于容器镜像能够做为其余自定义容器镜像的父级。用户能够从外部资源下载预先构建的容器,也能够根据须要构建自定义镜像。运维
什么是Docker?分布式
虽然Linux容器是一种可以以不一样方式实现和管理的通用技术,但Docker是目前为止运行构建和容器最多见的方式。它包含了一系列的工具,能够容许用户建立容器镜像,从外部镜像仓库推送或者拉取镜像,还能在不一样的环境中运行和管理容器。能够这么说,容器在Linux上迅速流行主要归功于Docker在2013年发布以后所作的努力。微服务
docker命令行工具扮演了多种角色。它能够充当容器工做负载的流程管理器来运行和管理容器。此外,它还能够经过阅读和执行Dockerfile或者拍摄运行中的容器快照来建立新的容器镜像。这一命令还能够和Docker Hub(一种容器镜像仓库)交互,来拉取新的容器镜像或者推送本地镜像以保存或者发布它们。工具
虽然在Linux上Docker只提供了众多实现方式中的一种,但它让容器世界更容易进入,而且具有最经常使用的解决方案。尽管已经为容器开发了开放标准以确保互通性,但大多数与容器相关的平台和工具都将Docker做为测试和发布软件时的主要参照。对于既定环境,Docker可能并不老是最高性能的解决方案,但它多是最受欢迎的测试选项之一。实际上,对于容器而言,虽然在Linux上有许多其余的替代方案,但你们一般都会首先学习Docker,这并不是毫无理由,由于Docker无处不在而且在容器生态系统中对术语、标准以及工具都拥有影响力。
容器如何工做?
了解容器的工做原理对于讨论其与虚拟机的区别大有裨益。
虚拟机vs容器
虚拟机,或称VMs,是一种硬件虚拟技术,它可让您彻底虚拟化硬件或计算机资源。一个单独的访客操做系统管理虚拟机与运行在主机系统的OS彻底分开。在主机系统上,一个名为hypervisor的软件负责启动、中止和管理虚拟机。因为虚拟机做为彻底不一样的计算机运行,在正常运行条件下不会影响主机系统或其余虚拟机,所以虚拟机具有极大的隔离性和安全性。然而,它们也存在不足。例如,虚拟化整个计算机须要VM使用大量的资源。此外,因为虚拟机在单独的访客操做系统上运行,所以虚拟机的配置和启动时间可能至关慢。同时,由于虚拟机做为一个独立的机器运行,因此管理员一般须要采用相似基础架构的管理工具和流程来更新和运行各个环境。
总而言之,虚拟机容许您将计算机的资源细分为较小的单个计算机,但最终结果与管理一组物理计算机没有显著差别。计算机规模扩大,每一个主机的责任可能变得更加集中,但您使用的工具,策略和流程以及系统的功能可能不会有明显的变化。
与虚拟化整个计算机相比,容器则采用不一样的方式——直接虚拟化操做系统。它做为由主机操做系统内核管理的专用进程运行,但具备受限且严格操做的系统进程、资源和环境视图。容器存在于共享系统上,而且像它们在彻底控制的计算机上运行同样。
与其将容器视为像虚拟机同样的完整计算机,倒不如说更常见的管理容器与应用程序更为类似。例如,虽然您能够将SSH服务器绑定到容器中,但这不是推荐的模式。相反,调试一般经过日志记录界面执行,经过滚动新镜像来应用更新,而且再也不强调服务管理以支持管理整个容器。
这些特性意味着容器占据着位于虚拟机的强隔离性和传统流程的本地管理之间的空间。容器提供区域化和以流程为中心的虚拟化,可在限制,灵活性和速度之间实现良好平衡。
Linux cgroups和命名空间
Linux控制组或cgroups是一种内核功能,容许将进程及其资源做为一个单元进行分组、隔离和管理。cgroups和流程一块儿绑定,而且决定资源的访问权限以及提供管理和监控它们行为的机制。它们遵循分层系统,容许子进程继承其父进程的条件并可能采用进一步的限制。cgroups将进程做为一个组,并将所需的功能与其绑定在一块儿,并限制它们能够访问的资源。
另外一个容器所依赖的内核功能是Linux命名空间。命名空间限制了什么进程能够看到余下的系统。运行在命名空间内部的进程没法获取任何命名空间外运行的进程。因为命名空间定义了与系统其他部分分离的独特上下文,所以命名空间的进程树须要反映该上下文。在命名空间内部,主进程变为PID1(process ID1),传统上为OS的init系统保留PID。在命名空间内构建严格操做的虚拟进程树让在容器内运行的进程表现得像在正常的、不受限制的环境中操做同样。
容器化的优点
上文中咱们已经讨论了一些可以使得容器成为可能的技术,那么如今咱们来看一看它们最重要的特性有什么。
轻量级虚拟化
与使用虚拟机的硬件虚拟化相比,容器显得更为轻便。首先,容器使用主机系统的内核并在该操做系统中做为分区进程运行,而不是虚拟化全部硬件资源并在该环境中运行彻底独立的操做系统。
其次,从主机的角度出发,容器像其余进程同样运行,这意味着它们能够迅速启动和中止而且可使用受限制的资源。此外,容器不只能够查看和访问主机的进程空间和资源子集,并且还可以在大多数状况下,能够表现得像一个彻底独立的操做系统。
容器镜像自己也能够很是小。最小的镜像可以使依赖于拉取最新镜像的工做流不会出现显著延迟。这是许多容错,自我修复的分布式系统的要求。
环境隔离
经过使用cgroups以及命名空间等Linux内核功能,容器能够与主机环境彼此隔离。这提供了必定程度的功能限制,以防止容器环境互相干扰。
虽然不够强大,不足以被视为彻底安全沙箱,但这种隔离确实具备优点。因为主机和每一个容器将软件保存在单独的文件系统中,所以更容易避免依赖性和库冲突。网络环境能够分离,所以容器内的应用程序能够绑定到其本机端口,而无需担忧主机系统中或其余容器中的软件会产生冲突。而后,管理员能够根据须要选择如何将容器的网络映射到主机网络中。
标准化打包格式和运行时目标
容器最引人注目的其中一个优点是它能够统一和简化打包和部署软件的流程。容器镜像可让您绑定应用程序和全部的运行时需求到可跨多个基础架构部署的单个单元中。
在容器内部,开发人员能够安装和使用其应用程序所需的任一库,而无需担忧干扰主机系统库。当镜像建立时,依赖项是版本锁定的。容器运行时能够充当一个标准、稳定的部署平台,所以开发人员无需了解容器在哪一个特定的机器上运行。只要容器运行时可操做且有足够的系统资源可用,容器就会像在开发环境中那样运行。
一样的,从运维的角度来看,容器化使部署环境的需求标准化了。管理员能够专一于维护充当容器平台的通用主机,并分配这些计算机能够访问的资源池,而不是基于应用程序的语言、运行时和依赖项来配置和维护特定的环境。绑定容器中的全部特定应用程序特性会在应用程序的关注点与平台的关注点之间建立天然边界。
可扩展性
容器的既定范式可让您以一种相对简单的机制来扩展您的应用程序。轻量级镜像、快速的启动时间、建立测试以及部署“黄金镜像”以及标准化的运行时环境这些特性使得构建高度扩展的系统成为可能。
一个可扩展性的系统是高度依赖于应用程序架构和容器镜像自己是如何构建的。与容器范例配合良好的设计将会充分发挥容器格式的优点,以实现速度、可用性和可管理性的良好平衡。面向服务的架构,特别是微服务,在容器化环境中很是流行,由于将应用程序分解为具备集中目的的离散组件使得开发,扩展和更新更加简单。
容器专用术语
在咱们结束以前,让咱们回顾一下咱们在本文中介绍的一些关键术语,以及您在继续学习时可能遇到的一些新术语。
总 结
容器并不是魔弹,但它们的确具有一些优于在裸机上运行软件或使用其余虚拟化技术的优点。经过提供轻量级、功能性隔离和开发丰富的工具生态系统来帮助管理复杂性,为容器在开发期间和整个运维生命周期中提供了极大的灵活性和可控性。