入门篇!虚拟化容器技术与Docker总体概述

一、容器技术概述

  • 在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上
  • 由于“客居”于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在 Ubuntu 服务中运行 Redhat Enterprise Linux,但无法再Ubuntu 服务器上运行 Microsoft Windows
  • 相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟容器所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险
  • 尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是“权限隔离监牢”(chroot jail):它创建一个隔离的目录环境来运行进程。如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器所创建的目录中,无法对宿主机进一步破坏
  • 最新的容器技术引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用这些新技术,容器不在仅仅是一个单纯的运行环境。在自己的权限类内,容器更像是一个完整的宿主机。对 Docker 来说,它得益于现代 Linux 特性,如控件组(control group)、命名空间(namespace)技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存
  • 容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器
  • 尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而 Docker 就是为了改变这一切而生的

二、Docker简介

  • Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(http://docker.com/,前dotCloud公司,PaaS市场中的老牌提供商)的团队编写,基于Apache 2.0开源授权协议发型
  • 那么Docker有什么特别之处呢?Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。而Docker的目标就是要提供以下这些东西

①提供一个简单、轻量的建模方式

  • Docker上手非常快,用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界
  • 随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也 可以运行更多的容器,使用户尽可能的充分利用系统资源

②职责的逻辑分离

  • 使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器

  • Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题

③快速、高效的开发生命周期

  • Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作

④鼓励使用面向服务的架构

  • Docker 还鼓励面向服务的体系结构和微服务架构

  • Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性

  • 备注:如果你愿意,当然也可以在一个容器内运行多个进程的引用程序

三、容器和虚拟机的区别

  • vm(虚拟机)与docker(容器)框架,直观上来讲vm多了⼀层guest OS,同时Hypervisor会对硬件资源进⾏虚拟化。docker直接使⽤硬件资源,所以资源利⽤率相对docker低也是⽐较容易理解的
  • 服务器虚拟化解决的核⼼问题是资源调配,⽽容器解决的核⼼问题是应⽤开发、测试和部署
  • 虚拟机技术:通过Hypervisor层抽象底层基础设施资源,提供相互隔离的虚拟机,通过统⼀配置、统⼀管 理,计算资源的可运维性,以及资源利⽤率都能够得到有效的提升。同时,虚拟机提供客户机操作系统, 客户机变化不会影响宿主机,能够提供可控的测试环境,更能够屏蔽底层硬件甚⾄基础软件的差异性,让 应⽤做到的⼴泛兼容。然⽽,再⽜逼的虚拟化技术,都不可避免地出现计算、IO、⽹络性能损失,毕竟多 了⼀层软件,毕竟要运⾏⼀个完整的客户机操作系统。
  • 容器技术:严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装 箱,能够把应⽤需要的运⾏环境、缓存环境、数据库环境等等封装起来,以最简洁的⽅式⽀持应⽤运⾏, 轻装上阵,当然是性能更佳。Docker镜像特性则让这种⽅式简单易⾏。当然,因为共享内核,容器隔离性 也没有虚拟机那么好。

四、Docker组件

  • Docker的核心组件为:
    • Docker客户端和服务器,也称为Docker引擎
    • Docker镜像
    • Registry
    • Docker容器

Docker客户端和服务器

  • Docker是一个客户端/服务器(C/S)架构的程序
  • Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker守护进程有时也称为Docker引擎
  • Docker提供了一个命令行工具docker以及一整套RESTful APIhttps://docs.docker.com/engine/api/)来与守护进程交互。用户可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。图1-1描绘了Docker的架构

Docker镜像

  • 镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分
  • 镜像是基于联合(Union)文件系统的一种层式的结构,由一系列指令一步一步构建出来。例如:
    • 添加一个文件
    • 执行一个命令
    • 打开一个端口
  • 也可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新

Registry

  • Docker用Registry来保存用户构建的镜像
  • Registry分为公共和私有两种
  • Docker公司运营的公共Registry叫作Docker Hub。用户可以在Docker Hub(http://hub.docker.com/)注册账号,分享并保存自己的镜像
  • 根据统计,Docker Hub上有超过10000注册用户构建和分享的镜像。需要Nginx Web服务器(http://hub.docker.com/search?q=nginx)的Docker镜像,或者Asterix开源PABX系统(https://hub.docker.com/search)的镜像,抑或是MySQL数据库(https://hub.docker.com/search?q=mysql)的镜像?这些镜像在Docker Hub上都有,而且具有多种版本
  • 用户也可以在Docker Hub上保存自己的私有镜像。例如,包含源代码或专利信息等需要保密的镜像,或者只在团队或组织内部可见的镜像
  • 用户甚至可以架设自己的私有Registry。具体方法会在后面会讨论。私有Registry可以受到防火墙的保护,将镜像保存在防火墙后面,以满足一些组织的特殊需求

Docker容器

  • Docker可以帮用户构建和部署容器,用户只需要把自己的应用程序或服务打包放进容器即可。我们刚刚提到,容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段
  • 总结起来,Docker容器就是:
    • 一个镜像格式
    • 一系列标准的操作
    • 一个执行环境
  • Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而Docker运输软件
  • 每个容器都包含一个软件镜像,也就是容器的“货物”,而且与真正的货物一样,容器里的软件镜像可以进行一些操作。例如,镜像可以被创建、启动、关闭、重启以及销毁
  • 和集装箱一样,Docker在执行上述操作时,并不关心容器中到底塞进了什么,它不管里面是Web服务器,还是数据库,或者是应用程序服务器什么的。所有容器都按照相同的方式将内容“装载”进去
  • Docker也不关心用户要把容器运到何方:用户可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到Amazon EC2主机的集群中去。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用
  • 使用Docker,可以快速构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续集成(continuous integration,CI)测试环境或者任意一种应用程序、服务或工具。可以在本地构建一个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序栈。可以说,Docker的应用场景相当广泛
  • 整体架构如下图所示:

  • 底层技术:
    • Namespaces:做网络隔离
    • Control groups:做资源限制,例如设置占用多少内存,CPU
    • Union file systems:image和container分层

五、能用Docker做什么

  • 那么,为什么要关注Docker或容器技术呢?前面已经简单地讨论了容器提供的隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本身就具有“标准性”的特征,非常适合为服务创建构建块
  • Docker的一些应用场景如下:
    • 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境
    • 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署中尤其实用
    • 用Docker创建隔离的环境来进行测试。例如,用Jenkins CI这样的持续集成工具启动一个用于测试的容器
    • Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是一开始就在生产环境部署、测试
    • 构建一个多用户的平台即服务(PaaS)基础设施
    • 为开发、测试提供一个轻量级的独立沙盒环境,或者将独立的沙盒环境用于技术教学,如Unix shell的使用、编程语言教学
    • 提供软件即服务(SaaS)应用程序
    • 高性能、超大规模的宿主机部署
  • 此处列出了一个基于和围绕Docker生态环境构建的早期项目列表,详情请查看:https://www.docker.com/blog/docker-projects-from-the-docker-community/

六、Docker与配置管理

  • 从Docker项目公布以来,已经有大量关于“哪些配置管理工具适用于Docker”的讨论,如Puppet、Chef。Docker包含一套镜像构建和镜像管理的解决方案。现代配置管理工具的原动力之一就是“黄金镜像”模型。然而,使用黄金镜像的结果就是充斥了大量、无管理状态的镜像:已部署或未部署的复杂镜像数量庞大,版本状态混乱不堪。随着镜像的使用,不确定性飞速增长,环境中的混乱程度急剧膨胀。镜像本身也变得越来越笨重。最终不得不手动修正镜像中不符合设计和难以管理的配置层,因为底层的镜像缺乏适当的灵活性
  • 与传统的镜像模型相比,Docker就显得轻量多了:镜像是分层的,可以对其进行迅速的迭代。数据表明,Docker的这些特性确实能够减轻许多传统镜像管理中的麻烦。现在还难以确定Docker是否可以完全取代配置管理工具,但是从幂等性和内省性来看,Docker确实能够获得非常好的效果。Docker本身还是需要在主机上进行安装、管理和部署的。而主机也需要被管理起来。这样,Docker容器需要编配、管理和部署,也经常需要与外部服务和工具进行通信,而这些恰恰是配置管理工具所擅长的
  • Docker一个显著的特点就是,对不同的宿主机、应用程序和服务,可能会表现出不同的特性与架构(或者确切地说,Docker本就是被设计成这样的):Docker可以是短生命周期的,但也可以用于恒定的环境,可以用一次即销毁,也可以提供持久的服务。这些行为并不会给Docker增加复杂性,也不会和配置管理工具的需求产生重合。基于这些行为,我们基本不需要担心管理状态的持久性,也不必太担心状态的复杂性,因为容器的生命周期往往比较短,而且重建容器状态的代价通常也比传统的状态修复要低
  • 然而,并非所有的基础设施都具备这样的“特性”。在未来的一段时间内,Docker这种理想化的工作负载可能会与传统的基础设备部署共存一段时间。长期运行的主机和物理设备上运行的主机在很多组织中仍具有不可替代的地位。由于多样化的管理需求,以及管理Docker自身的需求,在绝大多数组织中,Docker和配置管理工具可能都需要部署

七、Docker的技术组件

  • Docker可以运行于任何安装了现代Linux内核的x64主机上。推荐的内核版本是3.8或者更高。Docker的开销比较低,可以用于服务器、台式机或笔记本
  • 它包括以下几个部分:
    • 一个原生的Linux容器格式,Docker中称为libcontainer
    • Linxu内核的命名空间(namespace)(https://lwn.net/Articles/531114/),用于隔离文件系统、进程和网络
    • 文件系统隔离:每个容器都有自己的root文件系统
    • 进程隔离:每个容器都运行在自己的进程环境中
    • 网络隔离:容器间的虚拟网络接口和IP地址都是分开的
    • 资源隔离和分组:使用cgroups(http://en.wikipedia.org/wiki/Cgroups)(即control group,Linux的内核特性之一)将CPU和内存之类的资源独立分配给每个Docker容器
    • 写时复制http://en.wikipedia.org/wiki/Copy-on-write):文件系统都是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小
    • 日志:容器产生的STDOUT、STDERR和STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障排错。
    • 交互式shell:用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式的shell

八、Docker的资源


  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页