docker系列(一)之虚拟技术介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao__zhen/article/details/88343875

虚拟机技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。
虚拟机 (VM) 是一个物理硬件层抽象,它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。同时能为应用提供一个更加隔离的环境,不会因为应用程序的漏洞给宿主机造成任何威胁。
虚拟机的缺点:
1、资源占用多 2、冗余步骤多 3、启动慢
在这里插入图片描述

容器技术

由于前面虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。

Linux容器不是模拟于个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的 所有资源打包到一个隔离的容器中。多个容器可以在同一台机器上运行,和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。共享操作系统内核,但各自作为独立的进程在用户空间中运行 。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

与虚拟机相比, 容器占用的空间较少,瞬间就能完成启动,运行速度非常快。同时容器可以帮我们把开发环境及应用整个打包带走,打包好的容器可以在任何的环境下运行,这样就可以解决开发与运维环境不一致的问题了.同时容器可以运行在很多主流的操作系统上,具有很好的兼容性。

  1. 容器技术的原理
    容器技术是一种概念,它主要利用namespace实现容器之间的资源隔离,用cgoup实现对容器的资源限制,在实现形式上则有了docker和garden两种容器技术,有单个容器时无法满足企业需求的,后续从而出现了服务编排引擎框架,主要是Kerbernete和swarm。现在主要使用的容器技术就是docker,容器集群框架用的较多的是Kubernetes。
  2. 容器技术内容详解
  • Namespace
    Namespace就类似于java的命名空间。
    在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、网络资源等等)合理分配给各个用户所在的进程!
    在这里插入图片描述
    Linux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的,而是属于某个特定的Namespace。每个namespace下的资源对于其他namespace下的资源都是透明,不可见的。因此在操作系统层面上看,就会出现多个相同pid的进程。系统中可以同时存在两个进程号为0,1,2的进程,由于属于不同的namespace,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己namespace下的资源,例如使用ps 命令只能列出自己namespace下的进程。这样每个namespace看上去就像一个单独的Linux系统。
    在这里插入图片描述
    如上图所示,命名空间建立系统的不同视图, 对于每一个命名空间,从用户看起来,应该像一台单独的Linux计算机一样,有自己的init进程(PID为0),其他进程的PID依次递增,A和B空间都有PID为0的init进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器与子容器之间是隔离的。
  • Cgroup
    Cgroup即Controll groups其含义是controll system resource for process groups.
    Docker 容器使用 linux namespace 来隔离其运行环境,使得容器中的进程看起来就像一个独立环境中运行一样。但是,光有运行环境隔离还不够,因为这些进程还是可以不受限制地使用系统资源,比如网络、磁盘、CPU以及内存 等。关于其目的,一方面,是为了防止它占用了太多的资源而影响到其它进程;另一方面,在系统资源耗尽的时候,linux 内核会触发 OOM,这会让一些被杀掉的进程成了无辜的替死鬼。因此,为了让容器中的进程更加可控,Docker 使用 Linux cgroups 来限制容器中的进程允许使用的系统资源。所以就出现了Cgroup来对资源进行管控。

    Linux Cgroup 可为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。可以监控管理员配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置 cgroup。所以,可以将 controll groups 理解为 controller (system resource) (for) (process)groups,也就是是说它以一组进程为目标进行系统资源分配和控制。它主要提供了如下功能:1)限制资源使用,比如内存使用上限以及文件系统的缓存限制。2)优先级控制,比如:CPU利用和磁盘IO吞吐。3) 一些审计或一些统计,主要目的是为了计费.4) 挂起进程,恢复执行进程。使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。

比较Docker和传统虚拟化方式的不同之处:

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

猜你喜欢

转载自blog.csdn.net/zhao__zhen/article/details/88343875