1. 虚拟化Docker

虚拟化Docker

  • 1. 虚拟化概念
  • 2. 虚拟化技术
    • 2.1 概念
    • 2.2 分类
      • 技术角度
        • 1. 完全虚拟化技术
        • 2. 半虚拟化技术
      • 架构类型分类
        • 1. 寄居架构
        • 2. 裸金属架构
    • 2.3 容器技术历史
    • 2.4 Docker 容器虚拟机引擎
    • 2.5 Docker的由来
    • 2.6 Docker 生态圈
  • 3. Docker技术基础
    • 3.1 Docker与传统虚拟机对比
    • 3.2 传统的开发部署流程
    • 3.3 Docker的优势
    • 3.4 Docker的原理
        • namespace资源隔离
        • Docker总览
        • cgroups资源限制
        • 内核主线容器技术
        • Docker的镜像
    • 3.5 Docker相关的核心技术
        • 内核主线的容器技术
        • Namespace的类别
        • cgroup
        • 子系统介绍
      • 1. Linux容器虚拟技术(LXC)
      • 2. AUFS
    • 3.6 Docker的重要概念
      • 1.镜像(image)
      • 2. 容器(container)
      • 3. Docker Daemon
      • 4. 数据卷(Volumes)
      • 5. 链接(links)
      • 6. 仓库(Repository)
    • 3.7 Docker优化过程

1. 虚拟化概念

虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机.上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

2. 虚拟化技术

2.1 概念

容器虚拟化技术是什么?

以Linux进程的视角看

  • 进程运行的时候,周边的环境和资源有哪些?

    。Linux内核
    。文件系统
    。网络系统
    。PID、UID、IPC等资源
    。CPU、 内存、磁盘资源

  • 每个进程看到的周边环境都一样

  • 所有进程共享这些资源

2.2 分类

技术角度

1. 完全虚拟化技术

完全虚拟化技术又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(FulI Virtualization) 技术,它在虚拟机(VM)和硬件之间加了一个软件层——Hypervisor), 或者叫做虛拟机监控器(VMM

  • hypervisor 直接运行在物理硬件之上——KVM
  • hypervisor 运行在另一个操作系统中——QEMU和WINE

2. 半虚拟化技术

半虚拟化技术,也叫做准虚拟化技术。它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervi sor的工作负担变得非常的小,因此整体的性能也有很大的提高。

架构类型分类

1. 寄居架构

就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理。

  • 优点:简单,便于实现
  • 缺点:安装和运行应用程序依赖于主机操作系统对设备的支持
  • 举例:GSX Server, VMware Server,Workstation

2. 裸金属架构

就是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。

  • 优点:虚拟机不依赖于操作系统,可以支持多种操作系统,多种应用,更加灵活
  • 缺点:虚拟层内核开发难度较大
  • 举例: VMWare ESXI Server

Docker与传统虚拟机对比
1. 虚拟化Docker_第1张图片

2.3 容器技术历史

1. 虚拟化Docker_第2张图片

2.4 Docker 容器虚拟机引擎

  • 满足前述限制条件的进程组,叫做容器。

  • 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

2.5 Docker的由来

  1. 主要基于PAAS(Platfrom as a Service)平台为开发者提供服务
  2. 2013年10月 dotc I oud 公司改名为 Docker 股份有限公司

PAAS平台的范围和内容

1、确定产品定位和需求,确定首次迭代的范围。
2、制作界面原型。
3、技术选型,然后根据技术选型为每个开发者搭建开发环境和技术栈。例如:Java环境、Python环境、 Ruby环境、数据库、中间件等等。
4、构建基础技术框架和服务,包括日志、存储、消息、缓存、搜索、数据源、集群扩展等等。
5、模拟用户容量,构建测试环境。
PaaS平台的范畴
6、开始编写真正的业务代码,实现产品功能。
7、迭代开发/测试,生生不息,周而复始,直到头发掉为止......

老一代的PAAS平台的局限性

  • 主要提供应用的部署和托管
  • 针对应用开发者
  • 仅支持特定的 laaS 基础技术
  • 支持单种开发语言和框架
  • 支持特定的服务,比如自定义的数据存储APIs
  • 没有很好的解决常用中间件的部署问题
  • 难以解决应用和资源的隔离问题

2.6 Docker 生态圈

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镜像,以方便用户能够一键便捷创建容器。

3. Docker技术基础

  1. Docker是虚拟化的一种轻量级替代技术。Docker 的容器技术不依赖任何语言、框架或系统,可以将App变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行,隔离进程和资源。

  2. 简单的说就是,在Linux系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是docker最普遍的一个用法。

  3. Docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础.上的件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。

3.1 Docker与传统虚拟机对比

1. 虚拟化Docker_第3张图片

3.2 传统的开发部署流程

1. 虚拟化Docker_第4张图片
问题

  1. 资源利用效率低
  2. 单物理机多应用无法有效隔离( 进程空间,cpu资源,磁盘)
  3. 运维部署不便
  4. 测试、版本管理复杂
  5. 迁移成本高
  6. 传统虚拟机,空间占用大,启动慢,管理复杂

3.3 Docker的优势

  1. 秒级启动,秒级停止,空间资源占用极少(几M)
  2. 实现进程级别的隔离
  3. 可在普通服务器上建立.上百个Docker实例
  4. 加快开发测试部署的速度
  5. 简化版本管理

3.4 Docker的原理

Docker容器本质上是宿主机的进程。Docker 通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时拷贝机制(copy-on-write)实现了高效的文件操作。

namespace资源隔离

想要实现一个资源隔离的容器,在分布式的环境下进行通信和定位,容器必然要有独立的IP、端口、路由等,自然就联想到了网络的隔离。同时,容器还需要一个独立的主机名以便在网络中标识自己。有了网络,自然离不开通信,也就想到了进程间通信需要隔离。开发者可能也已经想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有进程号(PID),自然也需要与宿主机中的PID进行隔离。

1. 虚拟化Docker_第5张图片

Docker总览

1. 虚拟化Docker_第6张图片
创建一个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资源限制

强大的内核工具——cgroups。 它可以限制被 namespace 隔离起来的资源,还可以资源设置权重、计算使用量、操控任务(进程或线程)启停等。

内核主线容器技术

  • Namespace+Cgr oup

  • Namespace

    。程序运行环境的隔离
    。Cgroup基本原理:将内核中的全局变量改为per-namespace变量

  • 计算资源的QoS: CPU、内存、磁盘IO、网络IO

Docker的镜像

镜像是一个只读的Docker容器模板,含有启动的所需文件系统结构和内容,镜像是Docker容器的基础,这些文件内容组成静态的文件系统,即运行环境rootfs。

rootfs是Docker启动内部进程可见的文件系统,含有目录、配置文件及其工具

linux启动先挂载一个只读的rootfs,系统检验完整性后切换为读写模式,Docker也是先挂载rootfs,再利用联合挂载技术,在只读层rootfs上挂载一个读写层,这样读写层就在容器的最顶层,下面联合挂载可能有多个只读层。

3.5 Docker相关的核心技术

  • LXC(容器技术)
  • cgroups(资源限制技术)
  • AUFS(文件分层技术 )

内核主线的容器技术

  • Namespaces充当隔离的第一级。确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程。

  • ControlGroups是L XC的重要组成部分,具有资源核算与限制的关键功能。

  • UnionFS(文件系统)作为容器的构建块。为了支持Docker的轻量级以及速度快的特性,它创建层与用户。

Namespace的类别

  • UTS
  • MNT
  • IPC
  • USER
  • PID
  • NET

1. 虚拟化Docker_第7张图片

  • mnt namespace

    每个mnt ns有 自己的私有rootfs, 相对于host的根目录

  • net namespace
    提供独立的网络栈

namespace从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个container就可以对外展现出一个独立计算机的能力,并且不同conta iner从0S层面实现了隔离。然而不同namespace之间资源还是相互竞争的,仍然需要类似ul imit来管理每个container所能使用的资源。

cgroup

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等。

子系统介绍

  • blkio设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
  • cpu使用调度程序为cgroup任务提供cpu的访问。
  • cpu acct 产生cgroup任务的cpu资源报告。
  • cpu set如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
  • devices 允许或拒绝cgroup任务对设备的访问。
  • freezer 暂停和恢复cgroup任务。
  • memory 设置每个cgroup的内存限制以及产生内存资源报告。
  • net_ cIs标记每个网络包以供cgroup方便使用。
  • ns名称空间子系统。
  • perf_ event 增加了对每group的监测跟踪的能力。

1. Linux容器虚拟技术(LXC)

LXC是Linux conta iners的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgr oup限额功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。

cgroup

虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor.上的虚拟机那么强壮仍具有争议性。如果内核停止,那么所有的容器就会停止运行。

。 性能方面: LXC>>KVM>>XEN
。 内存利用率: LXC>>KVM>>XEN
。 隔离程度:XEN>>KVM>>LXC

与传统虚拟化技术相比

  • 与宿主机使用同一个内核,性能损耗小
  • 不需要指令级模拟
  • 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制
  • 避免了准虚拟化和系统调用替换中的复杂性
  • 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源(例如文件系统)共享

2. AUFS

什么是AUFS? AUFS是一个能透明覆盖- -或多个现有文件系统的层状文件系统。支持将不同目录挂载到同一一个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。

Docker一直在用AUF 作为容器的文件系统。当一个进程需要修改一个文件时,AUFS创建该文件的一个副本。AUFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制(copy on write)。

AUFS允许Docker把某些镜像作为容器的基础。例如,你可能有一一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AUFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。

使用AUFS的另一个好处是Docker的版本容器镜像能力。每个新版本都与之前的版本有简单差异的改动,有效地保持镜像文件最小化。但,这也意味着你总是要有一一个记录该容器从一个版本到另一个版本改动的审计跟踪。

AUFS好处

  • 节省空间,节省pagecache,体积小
  • 采用AUFS作为docker的conta iner的文件系统,能够提供如下好处:
    1. 节省存储空间-多个conta iner可以共享base image存储
    2. 快速部署-如果要部署多个conta iner, base image可 以避免多次拷贝
    3. 内存更省-因为多个conta iner共享base image, 以及OS的disk缓存机制,多个container中的进程命中缓存内容的几率大大增加。
    4. 升级更方便-相比于copy-on-write类型的FS,base-image也是可以挂载为可writeable的,可以通过更新base image而一次性更新其之上的container
    5. 允许在不更改base- image的同时修改其目录中的文件-所有写操作都发生在最上层的writeable层中,这样可以大大增加base image 能共享的文件内容。

以上5条,1-3条 可以通过copy-on- write的FS实现,4可以利用其他的union mount方式实现,5只有AUFS实现的很好。这也是为什么Docker-开始就建立在AUFS之.上。

1. 虚拟化Docker_第8张图片
AUFS是个中转器,支持联合多个格式的文件系统,共用 page cache

例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image, 再叠加包含apache及其相关依赖Iibrary的image,这些image由AUFS文件系统加载合并到统-路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer 用作记录对当前运行环境所作的修改。

有了层级化的Image做基础,理想中,不同的APP就可以尽可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等。

3.6 Docker的重要概念

1.镜像(image)

  • Docker的镜像类似虚拟机的快照,但是更轻量

  • 例如:一个镜像 可以包含一个完整的Linux操作系统环境,里面仅安装了Tomcat或用户需要的其它应用程序

  • 镜像可以用来创建容器

  • Docker Image是一 个极度精简版的Linux程序运行环境,比如vi这种基本的工具没有,官网的Java镜像包括的东西更少,除非是镜像叠加方式的,如Centos+Java7
    。Docker Image 是需要定制化Build的一个“安装包”,包括基础镜像+应用的二进制部署包
    。DockerImage内不建议有运行期需要修改的配置文件
    。Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。

2. 容器(container)

  • 等同于从快照中创建虚拟机

  • 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

  • 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

Docker Conta iner是Image的实例,共享内核

  • Docker Container里可以运行不同OS的Image,比如Ubuntu或者Centos。

  • Docker Conta iner不建议内部开启一个SSHD服务,1. 3版本后新增了Docker exec命令进入容器排查问题。

  • Docker Container没有IP地址,通常不会有服务端口暴露,是一个封闭的“盒子/沙箱”。

3. Docker Daemon

  • Docker Daemon 是创建和运行Container的Linux守护进程,也是Docker最主要的核心组件

  • Docker Daemon可以理解为Docker Container的Container

  • Daemon可以绑定本地端口并提供Rest API服务,用来远程访问和控制

1. 虚拟化Docker_第9张图片
容器端口映射

1. 虚拟化Docker_第10张图片

4. 数据卷(Volumes)

数据卷是一个可供一个或多个容器使用的特殊目录进程和数据的分离,实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器

  • 可用于数据持久化
  • 数据卷的使用,类似于Linux下对目录或文件进行mount。
  • 数据卷的共享,可以在多个容器之间共享数据卷

5. 链接(links)

  • 容器的连接(linking) 系统是除了端口映射外,另一种跟容器中应用交互的方式

  • 在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息

  • Docker在两个互联的容器之间创建了一-个安全隧道,而且不用映射它们的端口到宿主主机上。从而避免了暴露关键子系统(如数据库)端口到外部网络上。

三个基本组件

  • Docker Client是用户界面,它支持用户与Docker Daemon之间通信。
  • Docker Daemon运行于主机上,处理服务请求。
  • Docker Index 是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。

三个基本元素

  • Docker Conta iners负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
  • Docker Images是一个只读模板,用来运行Docker容器。
  • DockerFile是文件指令集,用来说明如何自动创建Docker镜像。

6. 仓库(Repository)

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下镜像

3.7 Docker优化过程

原先每个容器都需要一个操作系统,现在只需要一个操作系统
通过AUFS加个空白层(可写层)
动态应用,用镜像共享
应用太多,镜像太多,占用磁盘多,通过分层解决

你可能感兴趣的:(大数据)