虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机.上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器虚拟化技术是什么?
以Linux进程的视角看
进程运行的时候,周边的环境和资源有哪些?
。Linux内核
。文件系统
。网络系统
。PID、UID、IPC等资源
。CPU、 内存、磁盘资源
每个进程看到的周边环境都一样
所有进程共享这些资源
完全虚拟化技术又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(FulI Virtualization) 技术,它在虚拟机(VM)和硬件之间加了一个软件层——Hypervisor), 或者叫做虛拟机监控器(VMM
半虚拟化技术,也叫做准虚拟化技术。它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervi sor的工作负担变得非常的小,因此整体的性能也有很大的提高。
就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理。
就是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。
满足前述限制条件的进程组,叫做容器。
Process Container 的概念最早由google_ I程师2006年提出来➢容器虚拟机的完整解决方案-Docker
Dotc loud公司推出的开源项目
。 https: //www. docker. com/
。https: //github.com/dotcloud/docker
Github GO语言活跃度排名第一,在云计算方面热度持续升温
。https://blog.csdn.net/gg. 40764503
PAAS平台的范围和内容
1、确定产品定位和需求,确定首次迭代的范围。
2、制作界面原型。
3、技术选型,然后根据技术选型为每个开发者搭建开发环境和技术栈。例如:Java环境、Python环境、 Ruby环境、数据库、中间件等等。
4、构建基础技术框架和服务,包括日志、存储、消息、缓存、搜索、数据源、集群扩展等等。
5、模拟用户容量,构建测试环境。
PaaS平台的范畴
6、开始编写真正的业务代码,实现产品功能。
7、迭代开发/测试,生生不息,周而复始,直到头发掉为止......
老一代的PAAS平台的局限性
Docker收购了一系列创业公司,包括KiteMatic、KoaIity和SocketpIane。完成新一轮投资后,推出Docker Hub企业版。
红帽在新的RHEL 7版本中增添了支持Docker的功能,IBM公开拥抱Docker和容器,亚马逊推出了EC2容器服务,就连公认的竞争对手VMware也宣布支持Docker。
国内,不仅腾讯、阿里、百度、Uc loud、青云等云计算服务提供商已经将Docker用到实践,还有数家Docker初创企业在获得了天使投资后正在辛勤的开发,准备将产品尽快发布到市场上。
腾讯云计算公司对外宣布成为中国首家支持Docker Mach ine的云计算厂商,并将自身定位于Docker基础设施的服务商,迈出构建Docker“航运”基础设施的第一步。同时,在支持Docker Machine前提 下,腾讯云也推出了常用系统的标准版Docker镜像,以方便用户能够一键便捷创建容器。
Docker是虚拟化的一种轻量级替代技术。Docker 的容器技术不依赖任何语言、框架或系统,可以将App变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行,隔离进程和资源。
简单的说就是,在Linux系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是docker最普遍的一个用法。
Docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础.上的件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。
Docker容器本质上是宿主机的进程。Docker 通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时拷贝机制(copy-on-write)实现了高效的文件操作。
想要实现一个资源隔离的容器,在分布式的环境下进行通信和定位,容器必然要有独立的IP、端口、路由等,自然就联想到了网络的隔离。同时,容器还需要一个独立的主机名以便在网络中标识自己。有了网络,自然离不开通信,也就想到了进程间通信需要隔离。开发者可能也已经想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有进程号(PID),自然也需要与宿主机中的PID进行隔离。
创建一个Docker 容器,通过image managent的 distribution 和 registry 模块拉取镜像,通过镜像管理里面的 image、reference 和 layer 存储镜像的元数据;
镜像存储驱动 graphdriver 将镜像存储在文件系统、编辑或维护docker工作目录镜像层,最终对镜像的元数据的增删改查,屏蔽不同层调用的影响;
Docker容器创建网络,通过network模块调用 libnetwork 创建配置网络,libnetwork可以抽象出容器网络核心模型:沙盒、端点、网络,五种内置驱动br idge、host、 none、remote和 overlay ;
创建volume数据卷需调用vo lumedriver,实现数据卷并挂载,进行卷的增、删、改、查;
当限制容器资源或执行命令,eexecdriver通过
libcontainer 是对 cgroup 和 namespace 的二次封装并进行容器管理,具体就是图中6个namespace隔离和cgroup的资源限制;
Docker daemon是服务端用来响应Docker client 的请求。
强大的内核工具——cgroups。 它可以限制被 namespace 隔离起来的资源,还可以资源设置权重、计算使用量、操控任务(进程或线程)启停等。
Namespace+Cgr oup
Namespace
。程序运行环境的隔离
。Cgroup基本原理:将内核中的全局变量改为per-namespace变量
计算资源的QoS: CPU、内存、磁盘IO、网络IO
镜像是一个只读的Docker容器模板,含有启动的所需文件系统结构和内容,镜像是Docker容器的基础,这些文件内容组成静态的文件系统,即运行环境rootfs。
rootfs是Docker启动内部进程可见的文件系统,含有目录、配置文件及其工具
linux启动先挂载一个只读的rootfs,系统检验完整性后切换为读写模式,Docker也是先挂载rootfs,再利用联合挂载技术,在只读层rootfs上挂载一个读写层,这样读写层就在容器的最顶层,下面联合挂载可能有多个只读层。
Namespaces充当隔离的第一级。确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程。
ControlGroups是L XC的重要组成部分,具有资源核算与限制的关键功能。
UnionFS(文件系统)作为容器的构建块。为了支持Docker的轻量级以及速度快的特性,它创建层与用户。
mnt namespace
每个mnt ns有 自己的私有rootfs, 相对于host的根目录
net namespace
提供独立的网络栈
namespace从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个container就可以对外展现出一个独立计算机的能力,并且不同conta iner从0S层面实现了隔离。然而不同namespace之间资源还是相互竞争的,仍然需要类似ul imit来管理每个container所能使用的资源。
cgroup就是control ler group,在这个group中,有分配好的特定比例的 cpu 时间,IO时间,可用内存大小等。cgroups 是将任意进程进行分组化管理的Linux内核功能。最初由 google的工程师提出,后来被整合进Linux内核中。
cgroups 中的重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如 cpu 子系统是控制 cpu 时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点, 在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。
cgroups被Linux内核支持,有得天独厚的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源: cpu mem iops,iobandwide,net,device acess等。
LXC是Linux conta iners的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgr oup限额功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。
cgroup
虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor.上的虚拟机那么强壮仍具有争议性。如果内核停止,那么所有的容器就会停止运行。
。 性能方面: LXC>>KVM>>XEN
。 内存利用率: LXC>>KVM>>XEN
。 隔离程度:XEN>>KVM>>LXC
与传统虚拟化技术相比
什么是AUFS? AUFS是一个能透明覆盖- -或多个现有文件系统的层状文件系统。支持将不同目录挂载到同一一个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。
Docker一直在用AUF 作为容器的文件系统。当一个进程需要修改一个文件时,AUFS创建该文件的一个副本。AUFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制(copy on write)。
AUFS允许Docker把某些镜像作为容器的基础。例如,你可能有一一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AUFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。
使用AUFS的另一个好处是Docker的版本容器镜像能力。每个新版本都与之前的版本有简单差异的改动,有效地保持镜像文件最小化。但,这也意味着你总是要有一一个记录该容器从一个版本到另一个版本改动的审计跟踪。
AUFS好处
以上5条,1-3条 可以通过copy-on- write的FS实现,4可以利用其他的union mount方式实现,5只有AUFS实现的很好。这也是为什么Docker-开始就建立在AUFS之.上。
AUFS是个中转器,支持联合多个格式的文件系统,共用 page cache
例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image, 再叠加包含apache及其相关依赖Iibrary的image,这些image由AUFS文件系统加载合并到统-路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer 用作记录对当前运行环境所作的修改。
有了层级化的Image做基础,理想中,不同的APP就可以尽可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等。
Docker的镜像类似虚拟机的快照,但是更轻量
例如:一个镜像 可以包含一个完整的Linux操作系统环境,里面仅安装了Tomcat或用户需要的其它应用程序
镜像可以用来创建容器
Docker Image是一 个极度精简版的Linux程序运行环境,比如vi这种基本的工具没有,官网的Java镜像包括的东西更少,除非是镜像叠加方式的,如Centos+Java7
。Docker Image 是需要定制化Build的一个“安装包”,包括基础镜像+应用的二进制部署包
。DockerImage内不建议有运行期需要修改的配置文件
。Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。
等同于从快照中创建虚拟机
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker Conta iner是Image的实例,共享内核
Docker Container里可以运行不同OS的Image,比如Ubuntu或者Centos。
Docker Conta iner不建议内部开启一个SSHD服务,1. 3版本后新增了Docker exec命令进入容器排查问题。
Docker Container没有IP地址,通常不会有服务端口暴露,是一个封闭的“盒子/沙箱”。
Docker Daemon 是创建和运行Container的Linux守护进程,也是Docker最主要的核心组件
Docker Daemon可以理解为Docker Container的Container
Daemon可以绑定本地端口并提供Rest API服务,用来远程访问和控制
数据卷是一个可供一个或多个容器使用的特殊目录进程和数据的分离,实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器
容器的连接(linking) 系统是除了端口映射外,另一种跟容器中应用交互的方式
在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息
Docker在两个互联的容器之间创建了一-个安全隧道,而且不用映射它们的端口到宿主主机上。从而避免了暴露关键子系统(如数据库)端口到外部网络上。
三个基本组件
三个基本元素
Docker Registry/Hub
Docker围绕官方Registry (Docker Hub) 的生态圈是相当好用的地方。在Docker Hub 你可以很轻松下载到大量已经容器化好的应用镜像,即拉即用。这些镜像中,有些是Docker官方维护的,更多的是众多开发者自发上传分享的。而且你还可以在Docker Hub中 绑定你的代码托管系统(目前支持Github和Bitbucket)配置自动生成镜像功能,这样Docker Hub会 在你代码更新时自动生成对应的Docker镜像。
问题点:Docker Hub是dotC loud公司私有的,国内曾有公司试图提供镜像服务。
仓库是集中存放镜像文件的场所
仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签,仓库分为公开仓库(Public) 和私有仓库(Private)两种形式
push镜像到仓库,从仓库pull下镜像
原先每个容器都需要一个操作系统,现在只需要一个操作系统
通过AUFS加个空白层(可写层)
动态应用,用镜像共享
应用太多,镜像太多,占用磁盘多,通过分层解决