Docker系列(一):Docker介绍

Docker的定义:

       Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。       --摘自《百度百科》

       实际上,虽然介绍docker的书籍有很多,但鲜有给docker一个明确的定义,因为它很难概括成一个概念,而应该更多的被阐述它的特性和技术范畴。综合一些网上的观点,Docker就是虚拟化的一种轻量级替代技术。这种技术不依赖任何语言、框架或系统,可以将App变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行。

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


Docker核心技术:

        Namespace是一种Linux内核技术,用来实现资源的隔离。资源,就是进程运行期间所看到的、使用的、依赖的周边环境,资源有不同的种类,最典型的就是文件系统、网络系统、进程PID、IPC资源等等。

        Namespaces命名空间:

               PID    进程隔离

               NET   管理网络接口

               IPC    管理跨进程通信的访问 InterProcess Communication

               MNT  管理挂载点

               UTS   隔离内核和版本标识 Unix Timesharing System

        对于用户态进程,通过Linux提供的系统调用来使用Namespace,这些系统调用包括:

               clone()      创建进程的时候,将其限制在某个Namespace中

               unshare()  使一个进程脱离某个Namespace

               setns()       使一个进程加入到某个Namespace

        

         CGroup最早叫做Process Container,由Google工程师在2006年提出,后在2007年更名为Control Groups,并被整合进Linux 2.6.24版内核。它用来对一组进程进行资源控制,包括如下功能:

         资源限制(Resource Limitation):对进程组使用的资源总额进行限制

         优先级控制(Prioritization):通过为进程组分配CPU时间片数量从而控制了进程运行的优先级

         资源统计(Accounting):统计系统的资源使用量,如CPU使用时长、内存用量等等

         进程控制(Control):对进程组执行挂起、恢复等操作    

         CGroup包括如下概念:

                任务(Task):一个Task就是Linux系统中的一个进程

                控制组(Control Group):资源控制的最小单位;资源限制、优先级控制等等都定义在控制组上。一个任务可以加入某个控制组,也可以从一个控制组迁移到其他控制组。

                层级(Hierarchy):多个控制组形成树状的层次结构,叫做层级。

                子系统(Subsystem):一个子系统就是一种类型的资源控制器。子系统必须附加到一个层级上才能起作用。

                       cpu:控制task对cpu的使用

                       cpuacct:生成task对cpu资源使用情况的报告

                       cpuset:为task分配独立的cpu

                       blkio:为块设备设定输入/输出限制

                       devices:开启或关闭task对设备的访问

                       freezer:挂起或恢复task

                       memory:设定task对内存使用量的限定,并且自动生成这些task对内存资源使用情况的报告

                       perfevent:使得task可以进行统一的性能测试

                       net_cls:通过使用等级识别符(classid)标记网络数据包,从而允许Linux流量控制程序识别从具体cgroup中生成的数据包。


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

          Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时, AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制( copy on write ) 。AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。

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


Docker相关的基本概念:

       Image:镜像,容器(Container)时一个动态的概念,而镜像时一个相对静止的概念。镜像其实就是容器中的文件系统,也可以说是一个极度精简的Linux程序运行环境。

       Container:容器,从根本形态上而言,容器(Container)其实就是运行在操作系统上的一个进程,只不过加入了对资源的隔离和限制。Docker Container是Image的实例化对象,共享操作系统内核。

       Daemon:

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

            Docker Daemon 可以理解为Docker Container的Container

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

       Registry:docker镜像仓库,当docker请求使用一个未在当前系统中的Image时,docker会从镜像仓库中寻找并将其下载到系统中,这个docker获取Image的地方就是Registry。默认情况下,registry是指的docker官方的仓库,也就是Docker Hub Registry (https://hub.docker.com  )。需要注意的是,Docker Hub是dotCloud公司私有的,目前国内只有一个DaoCloud提供代理缓存服务。当然,docker也提供了搭建私有Registry的方法,这个会在后续篇章中说明。


Docker的三大基础组件:

       仓库Repository

       镜像Image

       容器Container

       这三者之间的关系为:首先,docker Repository提供各种各样已经打包好的docker应用,也就是镜像Image;其次,用户可以在Repository中搜索自己需要的镜像Image,下载到本地;最后,用户使用下载好的Image创建docker Container。


Docker容器的能力:

      文件系统隔离:每个容器都有自己的root文件系统

      进程隔离:每个容器都运行在自己的进程环境中

      网络隔离:容器间的虚拟网络接口和IP地址都是分开的

      资源隔离和分组: 使用cgroups将CPU和内存之类的资源独立分配给每个Docker容器


Docker的使用场景:

      1、使用Docker容器开发、测试、部署服务

      2、创建隔离的运行环境

      3、搭建测试环境

      4、构建多用户的平台即服务(PaaS)基础设施

      5、提供软件即服务(SaaS)应用程序

      6、高性能、超大规模的宿主机部署

猜你喜欢

转载自blog.51cto.com/jerry12356/2313274