- 容器简介 在计算世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化( hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统 内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。 由于“客居”于操作系统,容器只能运行与底层宿主机相同或相似的操作系统,这看起来并不是非常灵活。例如,可以在Ubuntu服务器中运行RedHat Enterprise Linux,但却无法在Ubuntu服务器上运行Microsoft Windows。
相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟机所虚拟的是一个完整的操作系统,这无疑增大了攻击范 围,而且还要考虑管理程序层潜在的暴露风险。 尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流 行。最常见的一个例子就是“权限隔离监牢”( chrootjail),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢中正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权 限不足被困在容器创建的目录中,无法对宿主机进行进一步的破坏。
最新的容器技术引入了OpenVZ、Solaris Zones以及Linux容器(如lxc)。使用这些新技术,容器不再仅仅是一个单纯的运行环境。在自己的权限范围内,容器更像是一个完整的宿主机。对 Docker来说,它得益于现代Linux内核特性,如控件组(control group)、命名空间( namespace)技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友 好地共存。 容器经常被认为是精益技术,因为容器需要的开销有限。和传统的虚拟化以及半虚拟化( paravirtualization)相比,容器运行不需要模拟层(emulation layer)和管理层(hypervisorlayer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更 多的容器。
尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而Docker就是为改变这一切而生。
- Docker简介
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(www. docker.com,前dotCloud公司,PaaS市场中的老牌提供商)的团队编写,基于Apache2.0开源授权协议发行。
Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效 地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker极其简沽,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和 二进制文件最小限的宿主机。而Docker的目标就是要提供以下这些东西。
- 提供一个简单,轻量的建模方式
Docker上手非常快,用户只需要几分钟,就可以把自己的程序“Docker化”(Dockerize)。Docker依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到了“随心所至,代码即改”的境界。随后,就可以创建容器来运行应用程序了。大 多数Docker容器只需不到1秒钟即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使 用户可以尽可能充分地利用系统资源。
- 职责的逻辑分离
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种“开发时一切都正常,肯定是运维的问题”的风险。
- 快速高效地开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。
- 鼓励使用面向服务的构架
Docker还鼓励面向服务的架构和微服务架构①。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在 这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省 性。
- 提供一个简单,轻量的建模方式
- 使用Docker组件
- Docker客户端和服务器
Docker是一个客户一服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所 有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTful API①。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守 护进程。
- Docker镜像
镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合( Union)文件系统的一种层式的结构,由一系列指令一步一步构建出来。例如:
- 添加一个文件
- 执行一个命令
- 打开一个端口
也可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、.存储和更新。我们将会学习如何使用已有的镜像,同时也会尝试构建我们自己的镜像。
- Registry
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营的公共Registry叫做 Docker Hub。用户可以在Docker Hub①注册账号②,分享并保存自己的镜像。根据最新统计,Docker Hub上有超过10 000注册用户构建和分享的镜像。需要Nginx Web服务器的Docker镜像,或者Asterix开源PABX系统的镜像,抑或是MySQL数据库的镜像?这些镜像在Docker Hub上都有,而且具有多种版本。你也可以在Docker Hub上保存自己的私有镜像。例如,包含源代码或专利信息等需要保密的镜像,或者只在团队或组织内部可见的镜像。你甚至可以架设自己的私有 Registry,私有Registry可以受到防火墙的保护,将镜像保存在防火墙后面,以满足一些组织的特殊需求。
- Docker容器
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或服务打包放进容器即可。容器使基于镜像启动起来的,容器中可以运行一个或多个进 程。我们可以认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。总结起来,Docker容器就是
- 一个镜像格式
- 一系列标准的操作
- 一个执行环境
使用Docker,我们可以快速构架一个应用程序服务器,一个消息总线,一套实用工具,一个持续集成测试环境或者任意一种应用程序,服务或者工具。我们可以在本地构架一个完整的测试环境,也可以为生产或者快速开发复制一套复杂的应用程序栈。
- Docker客户端和服务器
- Docker功能
- 加速本地开发和构建流程,使其更加高效,更加轻量化。
- 能够让独立服务或应用程序在不同的环境中,得到相同的运行结构。
- 使用Docker创建隔离的环境来进行测试。
- Docker可以让开发者先在本机上构建一个复杂的程序或者构架来进行测试,而不是一开始就在生产服务器部署,测试。
- 构建一个多用户平台即服务(PaaS)基础设施。
- 为开发,测试提供一个轻量级的独立沙盒环境,或者将独立的沙河环境用于技术教学,如Unix shell使用,编程语言教学。
- 提供软件即服务(SaaS)应用程序,如Memcached即服务。
- 高性能,超大规模的宿主机部署。
- Docker配置管理
从Docker项目公布以来,已经有大量关于“哪些配置管理工具适用于Docker”的讨论,如Puppet、Chef,Docker包含一套镜像 构建和镜像管理的解决方案。现代配置管理工具的原动力之一就是“黄金镜像”模型。然而,使用黄金镜像的结果就是充斥了大量、无管理状态的镜像:己部署或未 部署的复杂镜像数量庞大,版本状态混乱不堪。随着镜像的使用,不确定性飞速增长,环境中的混乱程度急剧膨胀。镜像本身也变得越来越笨重。最终不得不手动修 正镜像中不符合设计和难以管理的配置层,因为底层的镜像缺乏适当的灵活性。
与传统的镜像模型相比,Docker就显得轻量多了:镜像是分层的,你可以对其进行迅速的迭代。数据表明,Docker的这些特性确实能够减轻许多 传统镜像管理中的麻烦。现在还难以确定Docker是否可以完全取代配置管理工具,但是从幂等性和内省性来看,Docker确实能够获得非常好的效果。 Docker本身还是需要在主机上进行安装、管理和部署的。而主机也需要被管理起来。这样,Docker容器需要编配、管理和部署,也经常需要与外部服务 和工具进行通信,而这些恰恰是配置管理工具所擅长的。
Docker -个显著的特点就是,对不同的宿主机、应用程序和服务,可能会表现出不同的特性与架构(或者确切地说,Docker本就是被设计成这样的):Docker 可以是短生命周期的,但也可以用于恒定的环境,可以用一次即销毁,也可以提供持久的服务。这些行为并不会给Docker增加复杂性,也不会和配置管理工具 的需求产生重合。基于这些行为,我们基本不需要担心管理状态的持久性,也不必太担心状态的复杂性,因为容器的生命周期往往比较短,而且重建容器状态的代价 通常也比传统的状态修复要低。
然而,并非所有的基础设施都具备这样的“特性”。在未来的一段时间内,Docker这种理想化的工作负载可能会与传统的基础设备部署共存一段时间。 长期运行的主机和物理设备上运行的主机在很多组织中仍具有不可替代的地位。由于多样化的管理需求,以及管理Docker自身的需求,在绝大多数组织 中,Docker和配置管理工具可能都需要部署。
- Docker的技术组件
Docker可以运行在任何现代linux内核的64位主机上。Docker开销比较低,可以用于服务器,台式机或者笔记本。它包括以下几个部分。
- 一个原生的linux容器格式,Docker中称为libcontainer,或者很流行的容器平台lxc。libcontainer格式目前是Docker容器的默认格式。
- linux内核的命令空间(namespace),用于隔离文件系统,进程和网络。
- 文件系统隔离:每个容器都有自己的root文件系统
- 进程隔离:每个容器都运行在自己的进程环境中
- 网络隔离:容器之间的虚拟网络接口和ip地址都是分开的。
- 资源隔离和分组:使用cgroups(即control group)将cpu和内存之类的资源独立分配给每个Docker容器
- 写时复制:文件系统都是通过写时复制创建的,这就意味着文件系统是分层的,快速的,而且占用的磁盘空间更小。
- 日志:容器产生的STDOUT,STDERR和STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障拍错。
- 交互式shell:用户可以创建一个tty终端,将其链接到STDUIN,为容器提供一个交互式shell。
分类: Docker
0 条评论