《Docker进阶与实战》——1.4节概念澄清

1.4 概念澄清
本书的附录A是关于Docker常见问题的解答,但对于Docker基本概念方面的问题,希望读者可以在阅读完本章后就有清晰的认识,所以本节会针对与Docker概念息息相关的几个常见问题进行说明。
1.4.1 Docker在LXC基础上做了什么工作
首先我们需要明确LXC的概念,但这常常有不同的认识。LXC目前代表两种含义:
LXC用户态工具(https://github.com/lxc/lxc)。
Linux Container,即内核容器技术的简称。
这里通常指第二种,即Docker在内核容器技术的基础上做了什么工作。简单地说,Docker在内核容器技术(Cgroup和Namespace)的基础上,提供了一个更高层的控制工具,该工具包含以下特性。
跨主机部署。Docker定义了镜像格式,该格式会将应用程序和其所依赖的文件打包到同一个镜像文件中,从而使其在转移到任何运行Docker的机器中时都可以运行,并能够保证在任何机器中该应用程序执行的环境都是一样的。LXC实现了“进程沙盒”,这一重要特性是跨主机部署的前提条件,但是只有这一点远远不够,比如,在一个特定的LXC配置下执行应用程序,将该应用程序打包并拷贝到另一个LXC环境下,程序很有可能无法正常执行,因为该程序的执行依赖于该机器的特定配置,包括网络、存储、发行版等。而Docker则将上述相关配置进行抽象并与应用程序一同打包,所以可以保证在不同硬件、不同配置的机器上Docker容器中运行的程序和其所依赖的环境及配置是一致的。
以应用为中心。Docker为简化应用程序的部署过程做了很多优化,这一目的在Docker的API、用户接口、设计哲学和用户文档中都有体现,其Dockerfile机制大大简化和规范了应用的部署方法。
自动构建。Docker提供了一套能够从源码自动构建镜像的工具。该工具可以灵活地使用make、maven、chef、puppet、salt、debian包、RPM和源码包等形式,将应用程序的依赖、构建工具和安装包进行打包处理,而且当前机器的配置不会影响镜像的构建过程。
版本管理。Docker提供了类似于Git的版本管理功能,支持追踪镜像版本、检验版本更新、提交新的版本改动和回退版本等功能。镜像的版本信息中包括制作方式和制作者信息,因此可以从生产环境中回溯到上游开发人员。Docker同样实现了镜像的增量上传下载功能,用户可以通过获取新旧版本之间新增的镜像层来更新镜像版本,而不必下载完整镜像,类似Git中的pull命令。
组件重用。任何容器都可以用作生成另一个组件的基础镜像。这一过程可以手动执行,也可以写入自动化构建的脚本。例如,可以创建一个包含Python开发环境的镜像,并将其作为基础镜像部署其他使用Python环境进行开发的应用程序。
共享。Docker用户可以访问公共的镜像Registry,并向其中上传有用的镜像。Registry中同样包含由Docker公司维护的一些官方标准镜像。Docker Registry本身也是开源的,所以任何人都可以部署自己的Registry来存储并共享私有镜像。
工具生态链。Docker定义了一系列API来定制容器的创建和部署过程并实现自动化。有很多工具能够与Docker集成并扩展Docker的能力,包括类PaaS部署工具(Dokku、Deis和Flynn)、多节点编排工具(Maestro、Salt、Mesos、OpenStack nova)、管理面板(Docker-ui、OpenStack Horizon、Shipyard)、配置管理工具(Chef、Puppet)、持续集成工具(Jenkins、Strider、Travis)等。Docker正在建立以容器为基础的工具集标准。
1.4.2 Docker容器和虚拟机之间有什么不同
容器与虚拟机是互补的。虚拟机是用来进行硬件资源划分的完美解决方案,它利用了硬件虚拟化技术,例如VT-x、AMD-V或者privilege level(权限等级)会同时通过一个hypervisor层来实现对资源的彻底隔离;而容器则是操作系统级别的虚拟化,利用的是内核的Cgroup和Namespace特性,此功能完全通过软件来实现,仅仅是进程本身就可以与其他进程隔离开,不需要任何辅助。
Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此容器更加轻量级,消耗的资源也更少。而虚拟机会独占分配给自己的资源,几乎不存在资源共享,各个虚拟机实例之间近乎完全隔离,因此虚拟机更加重量级,也会消耗更多的资源。我们可以很轻松地在一台普通的Linux机器上运行100个或者更多的Docker容器,而且不会占用太多系统资源(如果容器中没有执行运算任务或I/O操作);而在单台机器上不可能创建100台虚拟机,因为每一个虚拟机实例都会占用一个完整的操作系统所需要的所有资源。另外,Docker容器启动很快,通常是秒级甚至是毫秒级启动。而虚拟机的启动虽然会快于物理机器,但是启动时间也是在数秒至数十秒的量级。
因此,可以根据需求的不同选择相应的隔离方式。如果需要资源完全隔离并且不考虑资源消耗,可以选择使用虚拟机;而若是想隔离进程并且需要运行大量进程实例,则应该选择Docker容器。

时间: 2024-08-04 09:47:09

《Docker进阶与实战》——1.4节概念澄清的相关文章

《Docker进阶与实战》——导读

目 录 序 前 言 第1章 Docker简介1.1 引言1.2 功能和组件1.3 安装和使用1.4 概念澄清1.5 本章小结第2章 关于容器技术2.1 容器技术的前世今生2.2 一分钟理解容器2.3 Cgroup介绍2.4 Namespace介绍2.5 容器造就Docker2.6 本章小结第3章 理解Docker镜像3.1 Docker image概念介绍3.2 使用Docker image3.3 Docker image的组织结构3.4 Docker image扩展知识3.5 本章小结第4章

《Docker进阶与实战》——3.1节Docker image概念介绍

3.1 Docker image概念介绍简单地说,Docker image是用来启动容器的只读模板,是容器启动所需要的rootfs,类似于虚拟机所使用的镜像.首先需要通过一定的规则和方法表示Docker image,如图3-1所示. 图3-1是典型的Docker镜像的表示方法,可以看到其被"/"分为了三个部分,其中每部分都可以类比Github中的概念.下面按照从左到右的顺序介绍这几个部分以及相关的一些重要概念.Remote docker hub:集中存储镜像的Web服务器地址.该部分的

《Docker进阶与实战》——1.3节安装和使用

1.3 安装和使用1.3.1 Docker的安装 Docker的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上.对于体系架构,除了Docker一开始就支持的x86-64,其他体系架构的支持则一直在不断地完善和推进中,用户在安装前需要到Docker官方网站查看最新的支持情况.对于内核,目前官方的建议是3.10以上的版本,除了内核版本以外,Docker对于内核支持的功能,即内核的配置选项也有一定的要求(比如必须开启Cgroup和Namespace相关选项,以及其他的网络和存储驱动等).如

《Docker进阶与实战》——2.2节一分钟理解容器

2.2 一分钟理解容器2.2.1 容器的组成 上文已多次提及,容器的核心技术是Cgroup + Namespace,但光有这两个抽象的技术概念是无法组成一个完整的容器的.在2.1.2节也提到过最早的容器概念就包括了对文件目录视图的抽象隔离,而所有的这一切,都需要有工具来驱动,需要有一个工具来提供用户可操作的接口,来创建一个容器.所以笔者认为,对于Linux容器的最小组成,可以由以下公式来表示: 容器 = cgroup + namespace + rootfs + 容器引擎(用户态工具) 其中各项

《Docker进阶与实战》——2.1节容器技术的前世今生

2.1 容器技术的前世今生2.1.1 关于容器技术 容器技术,又称为容器虚拟化,从字面上看它首先是一种虚拟化技术.在如今的技术浪潮下,虚拟化技术层出不穷,包括硬件虚拟化.半虚拟化.操作系统虚拟化等.本书不会对虚拟化技术展开介绍,只需要知道容器虚拟化是一种操作系统虚拟化,是属于轻量级的虚拟化技术即可.又因为在实现原理上,每一种虚拟化技术之间都有较大的差别,所以即使没有虚拟化的技术背景,也是可以单独来学习容器虚拟化的. 容器技术之所以受欢迎,一个重要的原因是它已经集成到了Linux内核中,已经被当作

《Docker进阶与实战》——3.2节使用Docker image

3.2 使用Docker image Docker内嵌了一系列命令制作.管理.上传和下载镜像.可以调用REST API给Docker daemon发送相关命令,也可以使用client端提供的CLI命令完成操作.本书的第7章会详细阐述Docker REST API的细节,本节则主要根据功能对涉及image的命令进行说明.下面就从Docker image的生命周期角度说明Docker image的相关使用方法. 3.2.1 列出本机的镜像 下面的命令可以列出本地存储中镜像,也可以查看这些镜像的基本信

《Docker进阶与实战》——3.4节Docker image扩展知识

3.4 Docker image扩展知识 Cgroup和Namespace等容器相关技术已经存在很久,在VPS.PaaS等领域也有很广泛的应用,但是直到Docker的出现才真正把这些技术带入到大众的视野.同样,Docker的出现才让我们发现原来可以这样管理镜像,可以这样糅合老技术以适应新的需求.Docker引入联合挂载技术(Union mount)使镜像分层成为可能:而Git式的管理方式,使基础镜像的重用成为可能.现在就了解一下相关的技术吧. 3.4.1 联合挂载 联合文件系统这种思想由来已久,

《Docker进阶与实战》——3.3节Docker image的组织结构

3.3 Docker image的组织结构上节讲到Docker image是用来启动容器的只读模板,提供容器启动所需要的rootfs,那么Docker是怎么组织这些数据的呢? 3.3.1 数据的内容Docker image包含着数据及必要的元数据.数据由一层层的image layer组成,元数据则是一些JSON文件,用来描述数据(image layer)之间的关系以及容器的一些配置信息.下面使用overlay存储驱动对Docker image的组织结构进行分析,首先需要启动Docker daem

《Docker进阶与实战》——2.3节Cgroup介绍

2.3 Cgroup介绍2.3.1 Cgroup是什么 Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU.内存.block I/O和网络带宽.Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性. 从实现的角度来看,Cgroup实现了一个通用的进程分组的框架,而不同资源的具体管理则是由各个Cgroup子系统实现的.截止到内核4.1版本,Cgroup