01 docker容器技术基础入门

  本章内容:docker

    一、container是什么?centos

    二、LXC技术介绍安全

    三、namespaces-名称空间,实现资源隔离网络

    四、容器的资源分配--Cgroup,实现资源分配运维

    五、LXC与dockerstcp

-------------------------------------------------------------------函数

  基于虚拟化基础知识,咱们这一节开始介绍docker技术的相关内容:docker技术能够理解为咱们所学习的虚拟化基础知识的一个延申;工具

 

一、container是什么?性能

容器是一种基础工具;泛指任何能够用于容纳其余物品的工具,能够部分或彻底封闭,被用于容纳、存储、运输物品;物体能够被放置在容器中,而容器则能够保护内容物;
人类使用容器的历史至少有十万年,甚至可能有数百万年的历史
容器类型:
  瓶、罐、箱、篮、桶、袋、瓮、碗、柜、鞘
 

二、LXC技术介绍学习

  在了解LXC以前,咱们先回顾下主机虚拟化技术:主机虚拟化分为两类:

    type-I、type-II(有VMM管理平台) 

  不论是哪一类,咱们都须要经过虚拟技术实现一个系统平台,目的就是为了在这个系统平台上去运行对应的应用进程(例如httpd),来提供服务;

  因此,为了运行一个应用进程,咱们不得不在其下面去跑一个内核系统,来支持这个进程的正常运行,若是咱们能够跳过这个运行的内核,从而直接去运行一个虚拟机的应用进程,这样岂不是更加节约资源。因此,这样,就出现了咱们的容器技术--LXC(LinuX container);

 

  LXC技术的目的:抽调虚拟的内核层;直接去虚拟进程,提供系统硬件设备的资源利用率!

  这样的话,就带来对应的问题:若是你想运行两个一样的服务,这样,如何在LXC环境下区分这两个同样的进程呢?以下图:

 

三、namespaces-名称空间,实现资源隔离

  咱们知道,Linux的底层内核依靠的是C语言进行开发的,而C语言中有个函数模块namespace就是专门用来进行资源隔离--从内核处开始,进行资源隔离;也能够说是,避免资源冲突;

  它是Linux kernel内核默认的功能之一;

  隔离的资源以下:

    一、独立的主机名和域名--UTS

    二、须要有本身的独立的挂载数--Mount

    三、IPC隔离,实现进行间通信--信号、消息队列和共享存储的隔离

    四、全部的进程都属于init进程--每一个独立空间的init进程要独立隔离

    五、为每个空间微赚一个root用户,对于本身空间而言,是root用户,而对于其余空间而言是普通用户;

    六、虚拟本身的专用网卡,或者tcp/ip协议栈,网络隔离;

 

  容器技术须要知足以上隔离条件,才能真正实现;因此,namespaces技术是容器技术的基础,以下图:

  【内核开始默认支持6种namespaces的最先的内核版本】

 

  此时,咱们就能够基于内核抽调资源,同时使用namespaces技术进行资源隔离,而这种技术,咱们就叫作容器技术

   容器技术为了调用这些namespaces资源,namespaces提供了相应的API接口,例如:

    clone()  建立新进程。根据系统调用参数来判断哪一种类型的namespace被建立,并且它们的子进程也会被包含到namespace中

    unshare()  将进程移出某个namespace

    setns()  将进程加入到namesp中

 

四、容器的资源分配--Cgroup,实现资源分配

  有了资源隔离,咱们就要实现资源分配;内核提供资源分配技术--Control Groups(Cgroups技术)

    Cgroups实现资源分配包括:

      blkiq:块设备IO

      CPU:CPU

      cpuacct:CPU资源使用报告

      cpuset:多处理器平台上的CPU集合

      devices:设备访问

      freezer:挂起或恢复任务

      memory:内存用量及报告

      perf_event:对cgroup中的任务进行统一性能测试

      net_cls:CGroup中的任务建立的数据报文的类标识符

    Cgroup对应的功能参数:

  针对于不一样的组,咱们使用CGroup技术进行不一样的资源分配;(不是大锅饭,而是精细的进行资源分配,知足每一个容器的资源利用)

  

五、LXC与dockers

  最先的容器技术来自于BSD的jail技术,目的就是为了实现进程隔离,使得一个进程被攻陷后不会影响到其余进程,这是出于安全的目录;

  而Linux将该技术移植到本身的系统之上,叫作vserver(功能相似于chroot),建立一个本身的更目录,区分与当前的目录系统;

  咱们知道,为了使用Linux的内核资源,namespaces提供了相应的API接口(clone(),unshare(),setns(),);这样就是咱们的容器技术;

  真正的容器技术--LXCdocker等,则是为namespaces、cgroup封装了一个更好管理的接口;

 

  LXC

    这个技术就是最先的容器技术;它方便了容器的管理,例如:

    lxc-create 能够用来建立虚拟的用户空间;  template  能够用来建立模板【模板能够选择应用建立在那些不一样的发型版系统上】

    而后,咱们须要找到一个目录空间,将这个目录制定为该用户空间的根目录,应用则运行在这个所谓的“根目录”下,这就是所谓的容器技术;

    lxc技术对于容器技术的发张功不可没,可是它有着与生俱来的缺点--没法实现大规模部署;

    因而,出现了docker技术;

  docker

    为了解决lxc对于批量化管理容器的缺陷,咱们对lxc进行二次封装,这样获得的管理工具就是咱们的docker了;

     docker的工做原理:

      docker环境下,咱们将一个系统所须要的全部的文件集中打包,这就是一个镜像文件,咱们将这个镜像放在仓库中,而这个镜像文件能够不是系统,并且能够是具体的服务文件,好比NGINX服务文件;

      而后将这个镜像文件从“仓库”中下载到本地,运行run命令,这样就能够启动这个仓库(相似于运行了一个命令);

      系统在基于一些列的机制对docker启动的容器进行资源份分配;这种环境下,咱们运行的docker进程就是一个进程;且多个容器就是多个隔离进程,相互之间不会影响;

 

  如上图:各类进程的运行,运行在本身的独立的容器之中,容器之间相互独立,相互隔离!这样大大增强了进程之间的安全性,且docker下进程所须要的资源,都由docker环境来提供;

 

  批量建立容器:分层构建、灵活挂载的方式来建立容器;

    例如,底层提供一个centos,上层运行进程便可。多个进程能够共享一个centos底层便可;而后将服务挂在到两个目录下,就是两个容器!且,挂在的文件是只读文件;而后再在本地目录添加一层,去知足该容器须要修改文件的需求;

    这样迁移又会有困难;因此在真正使用的时候,真正数据并不保存于本地,而是存放于后面的共享存储中;

    以下图:

    另一个问题则是,若是关联进程启动顺序如何肯定?

    例如:nmp NGINX MySQL PHP进程运行顺序如何来决定启动?这就涉及到容器的编排问题;常见的解决方案以下:

      machine + swarm + compose 来进行系统编排;

      mesos + marathon 方案;

      kubernetes --> k8s;

    以上工具都是用来进行容器进程编排的工具;

 

  容器技术的缺点:

    一、无论怎么说,系统启动容器,比直接启动进程是消耗了更多的资源空间;

    二、调试工具;自己一个系统下运行多个进程,这些进程使用一套调试工具便可。可是如今进程之间相互隔离,则每一个容器都须要提供一套调试工具;

    三、调试进程得进入到容器中进行调试,相对于本来只须要在系统下调试,相对而言更加困难!

 

总结:

  容器给运维带来了极大的不便,可是给开发带来了极大的便利,它真正让代码实现了一次编写多环境运行,它极大的节约了软件开发的成本;

  这也是当今社会容器技术如此火的缘由;

相关文章
相关标签/搜索