什么是Docker?
上周二,陈工收到领导的工作指示,需要他把.net开发的网站和php开发的网站安装在一个服务器上。
由于二者依赖的软件不一样,产生了很多意料之外的冲突,他花费了大量时间和精力进行调试,影响了项目的交付时间。
我们来看看,陈工是怎么做的。
他在服务器上建立不同的虚拟机,把这两个网站放在不同的虚拟机上运作。
这种操作有错吗?没有。但是呢,虚拟机方式安装费时,启动较慢,同时占用空间比较大,资源利用率低,而且使用的VMWare还有成本。
其实,本质上来讲,我们需要做的就是把.net开发的网站和php开发的网站进行“隔离”处理。
面对同样的情况,邓工使用的 Docker 应用容器技术就没有这些缺点。
他把.net开发的网站和php开发的网站分别装进两个“集装箱”,使二者之间相互不干扰,做到“隔离”的同时,占用空间更小,启动更快,对资源的利用率更高,不仅如此,Docker 是开源技术,无需费用就可使用。
什么是Docker
Docker 的思想就类似于“集装箱”的理念,集装箱能解决什么问题?
第一:集装箱把零散的、不易搬运的大量物品封装成一个整体,提供一种通用的货物封装标准,便于运输。
第二:无论集装箱里是水果、玩具还是蔬菜,使用这样的容器封装措施,集装箱之间不会相互影响,发生冲突。
这样趋于统一的标准化设计,极大的提高了物流的运输效率。
为什么说 Docker 的思想就类似于“集装箱”的理念?Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,就类似于“集装箱”,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,就像集装箱之间不会相互影响,同时还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
但 Docker 本身并不是容器,它是创建容器的工具,是一个开源的应用容器引擎。
正因为上述优点,容器技术颇受开发者的欢迎。
Docker 技术的三大核心概念
一:镜像(Image)
二:仓库(Repository)
三:容器(Container)
简单举个例子:
我是一个开发商,打造了一个电影主题酒店,从设计到建成,花费大量时间精力,总算是把酒店盖完了,生意也很不错。
但是,不久之后,周围开始大搞建设,导致客人越来越少,几乎倒闭。我想,要是有办法把这个酒店直接搬到更好的地段就好了。
这时候,突然有人给我说,他可以帮我把这个酒店复制一份,做成“镜像”,放到我的背包里,让我背着包走到中心地段,直接把“镜像”拿出来往地上一放,客人就可以直接拎包入住了。
这多好啊,省了我多少事儿,节约了多少成本啊!
在这个例子里,放在包里的“镜像”,就是 Docker 镜像。我的背包,就是 Docker 仓库。我在中心地段“变魔法”拿出来重新开张的酒店,就是 Docker 容器。
其实 Docker 拥有一个巨大的镜像仓库。设想一下,A先生建了一个欧式酒店,生成了镜像,B先生建了一个温泉酒店,也生成了镜像,这些镜像都在一个公共仓库里,大家可以交换使用。那么我就可以根据市场需求安排酒店风格,产生更大的收益。当然,Docker Registry 会对这个镜像仓库进行管理,保证镜像的合法性。
Docker的优点
经过前面的介绍,相信大家对 Docker 已经有了大致的了解,下面来总结性介绍一下它的优点:
1、更快速的交付和部署:Docker 在整个开发周期都可以辅助你实现快速交付。
2、高效的部署和扩容:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
3、更高的资源利用率:Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
4、更简单的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
参考虚拟化技术与Docker_虫虫的专栏-CSDN博客_docker虚拟化技术
1. 虚拟化技术
1.1 什么是虚拟化
在计算机技术中,虚拟化(Virtualization)是一种资源管理技术。它是将计算机的各种实体资源,如:服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用更好的方式来利用这些资源。
虚拟化的目的是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理和容错容灾等好处。
1.2 虚拟化技术分类
从实现形式来分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。
硬件虚拟化
硬件虚拟化就是硬件物理平台本身提供了对特殊指令的截获和重定向的支持。支持虚拟化的硬件,也是一些基于硬件实现软件虚拟化技术的关键。在基于硬件实现软件虚拟化的技术中,在硬件是实现虚拟化的基础,硬件(主要是CPU)会为虚拟化软件提供支持,从而实现硬件资源的虚拟化。
支持虚拟化的硬件有:
Intel-VT
-(Intel Virtualization Technology),Intel公司为解决纯软件虚拟化解决方案在可靠性、安全性和性能上的不足而引进的技术。它可以让一个CPU工作起来像多个CPU在并行运行,从而使得在一部电脑内同时运行多个操作系统成为可能AMD-V
-(AMD Virtualization),是AMD公司的虚拟化技术。它是对x86处理器系统架构的一组硬件扩展和硬件辅助虚拟化技术,可以简化纯软件的虚拟化解决方案,改进VMM(虚拟机监视器)的设计,更充分地利用硬件资源,提高服务器和数据中心的虚拟化效率
软件虚拟化
软件虚拟化就是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持,如:QEMU;而有些软件虚拟化技术,则依赖硬件支持,如:VMware、KVM。
对软件虚拟化进行细分,又可以分为以下几类:
-
完全虚拟化:(Full Virtualization)虚拟机模拟完整的底层硬件环境和特权指令的执行过程,使客户机操作系统可以独立运行。支持完全虚拟化的软件有:Parallels Workstation、VirtualBox、Virtual Iron、Oracle VM、Virtual PC、Virtual Server、Hyper-V、VMware Workstation、QEMU等
-
硬件辅助虚拟化:(Hardware-assisted Virtualization)是指通过硬件辅助支持模拟运行环境,使客户机操作系统可以独立运行,实现完全虚拟化的功能。支持硬件辅助虚拟化的软件有:Linux KVM、VMware Workstation、VMware Fusion、Virtual PC、Xen、VirtualBox、Parallels Workstation等
-
部分虚拟化:(Partial Virtualization)只针对部分硬件资源进行虚拟化,虚拟机模拟部分底层硬件环境,特别是地址空间。这样的环境支持资源共享和线程独立,但是不允许建立独立的客户机操作系统。
-
平行虚拟化:(Para-Virtualization)虚拟机不需要模拟硬件,而是将部分硬件接口以软件的形式提供给客户机操作系统。如:早期的Xen。
-
操作系统层虚拟化:(OS-level virtualization)这种技术将操作系统内核虚拟化,可以允许使用者空间软件实例被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)、虚拟引擎(Virtualization engine)、虚拟专用服务器(virtual private servers)。每个容器的进程是独立的,对于使用者来说,就像是在使用自己的专用服务器。
Docker容器技术就是属于操作系统层虚拟化的范畴。
1.3 几种虚拟化技术
虚拟化是通过软件的方式模拟实体服务器,其初衷是为了解决“一种应用占用一台服务器”模式所带来的服务器数量剧增的问题,从而降低数据中心复杂度,简化管理难度。在虚拟化的发展过程中,出现过以下主要虚拟化技术或产品:
-
Xen
- 由剑桥大学开发的,一款开源的虚拟机监视器。采用ICA协议,它通过一种叫做准虚拟化的技术来获取高性能,甚至在一些与传统虚拟技术极度不友好的架构上(如:x86),Xen也有极佳的表现。Xen属于半虚拟化的技术,所以其性能损失非常小。Xen没有指令翻译,其或者使用使能理解和翻译虚拟操作系统发出的未修改指令的CPU(即:完全虚拟化);或者修改操作系统,使它发出的指令最优化,便于在虚拟化环境中执行(即:准虚拟化)。 -
KVM
-KVM
是一个Linux kernel模块,可以使用modprobe
来加载KVM
,加载后还需要通过其他工具创建虚拟机。KVM
是一个全虚拟化的解决方案,但需要CPU支持虚拟化功能。相比Xen
来说,KVM
可以更加方便的整合进Linux内核,但它还需要其它虚拟化软件(如:QEMU
)才能实现虚拟化功能。 -
LXC
- 即:Linux Container
,Linux容器,是一种轻量级的虚拟化的手段。它可以提供轻量级的虚拟化,以隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器会有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。 -
OpenVZ
- 是SWsoft公司开发的开源软件,是该公司Virtuozzo
软件的基础产品,是基于Linux平台的操作系统级服务器虚拟化解决方案。通过OpenVZ
,可以在单个物理服务器上创建多个相互隔离的虚拟专用服务器(VPS)并以最大的效率共享硬件和管理资源。其上运行虚拟服务器被称为VPS
(Virtual Private Serve),每个VPS的运行环境和独立服务器完全一致。OpenVZ
基于Linux系统内核及作业系统提供操作系统级虚拟化,在虚拟化过程中资源消耗非常小,官方宣称约1-2%。 -
Hyper-V
- 是微软件推出的一种虚拟化技术,可以采用半虚拟化或全虚拟的方式创建虚拟机。虽然它可以创建Windows或Linux操作系统,但其本身只能运行在Windows系统下,使用范围较为有限。 -
Oracle VM
- Oracle推出的服务器虚拟化软件,基于开源的Xen
技术,包括Oracle VM Server
和Oracle VM Manager
两部分。 -
VMWare
- 是一家非常出名虚拟化软件公司,其产品涵盖服务器、桌面等各种虚拟化领域,如:VMware Workstation
- 是一款桌面虚拟机软件,可以在一台实体机器上模拟完整的网络环境,并可运行多个Windows、DOS、Linux或Mac系统,是非常好的开发、测试、部署解决方案。从技术角度来说,VMware Workstation
是一款完全虚拟化产品,可借助硬件辅助在不修改用户操作系统的情况下完整虚拟化操作系统。VMware ESX Server
- 是一款适用于任何系统环境的企业级的虚拟机软件,可以认为是VMware Server
的升级版。相比VMware Workstation
来说,其功能更加强大,可以用于构建高伸缩和高可靠企业级服务器,并可实现远程管理、高级资源管理控制等高级功能。
2. Docker虚拟化
2.1 什么是Docker
Docker
是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到安装了任何 Linux 发行版本的机器上。Docker
基于LXC
来实现类似VM的功能,可以在更有限的硬件资源上提供给用户更多的计算资源。与同VM等虚拟化的方式不同,LXC
不属于全虚拟化、部分虚拟化或半虚拟化中的任何一个分类,而是一个操作系统级虚拟化。
Docker
是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
Docker
借助Linux的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。从而降低每个容器的系统开销,并实现降低容器复杂度、启动快、资源占用小等特征。
2.2 Docker
的构成
2.2.1 Docker
架构
Docker
使用客户端-服务器 (C/S) 架构模式 使用远程API来管理和创建Docker容器。Docker 容器(Container)通过 Docker 镜像(Image)来创建,二者之间的关系类似于面向对象编程中的对象与类。
其中,Docker
客户端用于向Docker
服务器或守护进程
发送请求。而服务器或守护进程会接受来自客户的请求(创建、运行、分发容器),并在处理完请求后返回响应结果。Docker
提供了一个命令行工具docker
,及一整套RESTful API
。客户端和服务端既可以运行在一个机器上,也可通过 socket
或者RESTful API
来进行通信。
2.2.2 Docker
核心组件
Docker Image
(镜像)、Registry
(仓库)、Docker Container
(容器)是Docker
中包含几个核心组件(核心概念),这几个组件介绍如下:
Docker Image
- 镜像
镜像用于构建Docker
容器,是构成Docker
的基础。它类似于虚拟机中的镜像,但它非常小,可以将它理解为容器的源代码。是一种层式结构的增量文件系统,由一系列命令一步步组成。
与传统虚拟机中的镜像相比,Docker
镜像是分层的,也更为轻量。你可以对其进行快速跌代,通过版本管理及增量的文件系统,Docker
提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经现有的应用镜像,再通过简单的命令就可以直接使用。
Registry
- 仓库
Registry
是Docker
用于存放镜像文件仓库,仓库分为开放(Public)和私有(Private),其设计理念非常类似于代码仓库Git
。
Docker Hub是Docker公司运营的Registry
,也是最大的Docker
仓库,用户可以在上面注册帐号分享并保存自己的镜像。除Docker Hub
外,还有很多第三方镜像仓库。如果不希望自己的镜像被其它人看到,你甚至可以架设自己的私有仓库,以增强安全性或满足一些特殊需求。
注意:也可以将Repository
认为是Docker
仓库,实际上二者区分并不严格。
Docker Container
- 容器
容器是用于运行镜像的沙箱环境,它是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除。而这些容器都是相互隔离、互不可见的。我们可以理解为:镜像是Docker
生命周期的打包和构建阶段,而容器Docker
的启动和执行阶段。
Docker
借签了集装箱的设计概念,不同的是集装箱运送的货物,而Docker
运送的是软件。和集装箱一样,我们并不需要关心里面装的是什么,只需要将应用按标准的形式装进去,然后上传到Registry
,在需要使用它的服务器下载部署即可。Docker
容器可以非常方便的替换,且各个容器都有良好的通用性,易于分发和叠加。
2.3 Docker
的适用范围
正如前所述,Docker
为容器提供了标准的隔离性,而各个容器本身就是一个标准的系统环境。因些,Docker
非常适合构建服务块,以下是Docker
的一些应用场景:
- 方便应用的自动化打包与部署 - 加速本地开发和构建流程,使其更加高效和轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松的提交到测试环境,并最终进入生产环境。
- 创建轻量、私密的PAAS环境
- 部署和扩展Web应用、数据库与后台服务 - 可以让独立服务在不同环境中得到相同的执行结果
- 连续的集成/部署、测试自动化 - 开发者可以在本地构建运行或测试环境,而不是直接在生产环境中部署、测试。
Docker
也并不是万能的,其设计目的也并不是要成为KVM
等的替代品。不可避免的,Docker
也会有一些局限性,如:
- 基于Linux内核,所以只能运行于Linux环境中,且只能64位主机上
- 基于
LXC
实现的容器,而LXC
是基于Linux内核中的cgroup
。因此,Docker
容器使用的权限、物理资源等也受限于LXC
参考「Docker」 - 虚拟化 & 容器 - 知乎
一、虚拟化技术
虚拟化技术是一种将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。
计算机资源:CPU(运算控制资源)、内存硬盘(数据存储资源)、网卡(网络传输资源)。
在1960年代,IBM就用虚拟化来描述一套能够抽象硬件资源的实验性系统。当时没有统一标准,需要适配各种代码、平台,虚拟化技术用来适配不同平台的物理机器;随着技术发展,虚拟化可以更好的应用在计算机资源管理领域。
通过虚拟化技术来管理计算机资源的方式,不但对计算机资源的控制变得更加灵活,也大幅提高了计算机资源的使用率。
例如,有一台运行nginx的机器,由于nginx对系统资源的消耗并不高,95%以上的系统资源处于闲置状态。通过虚拟化技术运行其他进程,充分利用闲置资源。不再需要为其他进程单独部署机器从而节约成本。
操作系统能够运行多个进程,但是前提是进程不产生冲突,比如端口、文件、库版本等;通过虚拟化技术,可以达到资源隔离,将不同的进程隔离在不同的虚拟环境。
二、虚拟化分类
A、分类I:硬件虚拟化 && 软件虚拟化
硬件虚拟化,物理硬件本身提供虚拟化的支持。例如,CPU能够自身模拟裂变,让程序或者操作系统认为存在多个CPU,进而能够同时运行多个程序或者操作系统,以及VT-X、EPT等。
软件虚拟化,通过软件的方式来实现虚拟化中关键的指令转换部分。例如,各种编程语言的虚拟机环境,JVM。
B、分类II:主机级虚拟化(虚拟整个硬件平台) && 容器级虚拟化
拿到安装设置好的虚拟机就类似裸物理机一样使用操作系统,可以和宿主机操作系统不同。
主机级TYPE-I:层级关系-宿主机硬件-->Hypervisor虚拟机管理器-->虚拟机操作系统-->虚拟机应用软件;代表-xen,vmware esx/esxi。
主机级TYPE-II:层级关系-宿主机硬件-->宿主机操作系统-->VMManager-->虚拟机操作系统-->虚拟机应用软件;代表-vmware workstation,vbox。
C、其他分类(分类太多,概念也有重叠,就不一一列举):
- 平台虚拟化:在操作系统和硬件平台间搭建虚拟化设施,使得整个操作系统都运行在虚拟后的环境中。
- 应用程序虚拟化:在操作系统和应用程序间实现虚拟化,只让应用程序运行在虚拟化环境中。
- 内存虚拟化:将不相邻的内存区,甚至硬盘空间虚拟成统一连续的内存地址,即我们常说的虚拟内存。
- 桌面虚拟化:让本地桌面程序利用远程计算机资源运行,达到控制远程计算机的目的。
- ....
三、虚拟机
虚拟机监视器 ( Virtual Machine Monitor ) 用来隔离操作系统与硬件或者应用程序和操作系统,以此达到虚拟化的目的,虚拟机监视器常常被称为Hypervisor。
常见的Hypervisor,VMware Workstation、Xen,JVM、HHVM等。
四、容器技术
容器技术是一种全新意义上的虚拟化技术,按分类或者实现方式分类,属于操作系统虚拟化的范畴,也就是在由操作系统提供虚拟化的支持,操作系统提供接口,能够让应用程序间可以互不干扰的独立运行,并且能够对其在运行中所使用的资源进行管理。由于应用程序的运行被隔离在了一个独立的运行环境之中,这个独立的运行环境就像一个容器,包含住应用程序。
不过目前来说容器技术还没有一个严格的定义,实现方式也各有不同。
五、虚拟机 & 容器
由于没有了虚拟操作系统和虚拟机监视器这两个层次,大幅减少了应用程序运行带来的额外消耗。更准确的来说,所有在容器中的应用程序其实完全运行在了宿主操作系统中,与其他真实运行在其中的应用程序在指令运行层面是完全没有任何区别的。因为无需指令转换,所以运行效率高,但应用程序必须遵循硬件平台的指令规则。
容器技术在性能上超越虚拟机等其他实现,并且运行在容器中的应用程序,在运行效率上与真实运行在物理平台上的应用程序不相上下。
A、容器的发展
容器概念始于1979年提出的UNIX chroot,它是一个UNIX操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。
2000年的时候FreeBSD开发了一个类似于chroot的容器技术Jails,是最早期,也是功能最多的容器技术。Jails英译过来是监狱的意思,这个监狱(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。
2007年Google实现了Control Groups,并加入到Linux内核中,为后期容器的资源配额提供了技术保障。
2008年基于CGroups和Linux Namespace推出了第一个最为完善的Linux容器LXC。
B、容器Runtime
Runtime是容器真正运行的地方。Runtime需要跟操作系统内核紧密协作,为容器提供运行环境。
lxc、runC和rkt是目前主流的三种容器Runtime。
- lxc(Linux Container):Linux上老牌的容器Runtime,Docker最初也是用lxc作为Runtime。
- runC:Docker自己开发的容器Runtime,符合OCI规范,也是现在Docker的默认Runtime。(Libcontainer-->runC)
- rkt:CoreOS开发的容器Runtime,符合OCI规范,因而能够运行Docker的容器。