docker的体系结构

一,docker的体系结构:docker使用c/s架构,docker  daemon作为server端接受client的请求,并处理(创建、运行、分发容器)它们可以同时运行在一个机器上,也可以通过socket或者RESTful  API通信。

注:docker daemon :一般在宿主主机后台运行。

        docker client以系统命令的形式存在,用户用docker命令来跟docker  daemon来产生交互。

二,Docker守护进程(Docker  daemon)

docker守护进程运行在一台主机上。用户并不直接和守护进程产生交互,而是通过docker客户端间接通信。

docker客户端(Docker  client):实际上就是docker的二进制程序,是用户和docker交互的一种方式。它用来接收用户指令并且和docker的守护进程进行通信。

三,docker三大核心:docker镜像——docker images、docker仓库——docker  repository 和docker容器——docker containers 。要想理解docker的生命周期,就必须彻底理解和掌握这三个核心概念

1,docker镜像是docker容器运行时的只读模板。docker镜像可以用来创建docker容器,每一个镜像都是由一系列的层(layers)组成的。docker使用UnionFS(联合文件系统)来将这些层联合到单独的镜像当中。UnionFS允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成了一个单独连贯的文件系统。正是因为这些层的存在,所以docker才会显得如此轻量。

例如:centos镜像当中安装了nginx。此时,就变成了“nginx镜像”。此时,docker镜像的层级关系就体现出来了。它的底层是一个centos操作系统镜像,上面叠加了一个nginx层。这样就完成了nginx镜像的构建,此时centos操作系统镜像被称为nginx镜像的父镜像。

镜像是用来创建docker容器的基础。

2,docker仓库

docker仓库类似于代码仓库,它是docker集中存放镜像文件的场所。

docker仓库和仓库注册服务器(registry)并不相同。仓库注册服务器是用来存放仓库的地方,里面存放着多个仓库,而在每个仓库当中集中存放这某一类镜像,它们通过不同的标签(tag)来进行区分。

例如:存放nginx操作系统镜像的仓库被称为nginx仓库。在nginx仓库里面可能包括多个不同版本的镜像,这就需要标签以此区分

docker仓库分为公开仓库(public)和私有仓库(private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub。其中存放了大量的镜像提供用户下载。

docker私有仓库:当用户不希望公开分享自己的镜像文件,可以创建一个只有自己可以访问的私有仓库。创建后,用户自己可以通过push命令来将它上传到指定的公有或者私有仓库里边。等自身需要时,在从仓库pull下来就可以使用了。

3,docker容器:docker容器是用来运行应用,一个docker容器包含了所有的某个应用运行所需要的环境。每一个docker容器都是从docker镜像创建的,通过镜像创建的运行实例,docker容器可以运行、开始、停止、移动和删除等操作。每一个docker容器都是独立安全的应用平台,相互隔离,互不影响。

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

注意:镜像是只读文件,容器在启动的时候创建一层可写层便作为最上层。

四:docker容器和虚拟机的差异

docker推崇“一个容器一个进程”(单进程)。如果,要在一个容器当中运行多个进程,唯一的情况及时处于调试目的。容器是用来运行应用的而非一台机器更不同与虚拟机,如果把容器当做虚拟机,那么它将会失去很多灵活性。因为,docker提供了用于分离应用与数据的工具。目的是为了更加快捷更新运行中的代码/系统,而不影响数据。

五:docker底层技术

docker底层的2核心技术分别是Namespaces和Control  groups

Namespaces用来隔离各个容器

(1)pid namespace

不同用户进程通过pid namespace隔离的,不同的namespace中可以有相同的pid。所以,有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace

(2)net namespace

pid namespace可以隔离进程,但是网络端口依然存在共享端口。而网络隔离则是通过net namespace实现的,每个net  namespace有独立的network  devices,IP,addresses, IP routing tables, /proc/net目录。这样每个container的网络就能隔离开。docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge:docker0连接在一起。

(3)ipc namespace

container(容器)中进程交互仍然采用Linux常见的进程间交互方法(interprocess  communication 进程间通信--IPC)包括常见的信号量、消息队列和共享内存。container的进程间交互实际上还是host上具有相同pid namespace中的进程间交互。

(4)mnt namespace

类似于chroot,将一个进程放到一个特定的目录中执行。mnt  namespace允许不同namespace的进程看到文件结构的不同,这样就可以使每个namespace中的进程所看到的文件目录被隔离开。在container中所看到的文件系统就是一个完整的Linux系统,有/etc、 /lib等。通过chroot实现

(5)uts namespace

UTS(‘UNIX   Time-sharing System")namespace允许每个container拥有独立的hostname和domain name(网络名称)使其在网络上可以被视作为一个独立的节点而非Host上的一个进程

(6)user namespace

每个container可以有不同的user和group id。也可以说container内部用container内部的用户来执行程序而不是Host主机上的用户

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

六:cgroups(Control  groups )实现了对资源的配额和度量

cgroups(Control Groups)最初叫Process Container 作用就是把一个进程放在一个组里面统一加以控制。官方定义:cgroups 是Linux内核提供的一种机制,这种机制可以根据特定的行为把一系列任务极其子任务整合(或分隔)到按资源划分等级的不同组内;从而为系统资源管理提供一个统一的框架。

cgroups可以限制,记录,隔离进程组所使用的物理资源(包括:CPU memory  和IO 等)为容器实现虚拟化提供了基本保证,同时也是构建Docker等一系列虚拟化管理工具的基石。

cgroups的主要目的是为不同用户层面的资源管理,提供一个统一化的接口。从单个进程的资源控制到操作系统层面的虚拟化。

cgroups的功能:

1,资源限制(Resource  Limitation): cgroups可以对进程组使用的资源总额进行限制,如设定应用运行时使用内存的上限为100m,一旦超出这个配额就会发出00m(out  of   memory)

2,优先级分配(Prioritization):通过分配CPU时间片数量及硬盘IO带宽大小,实际上相当于控制进程运行的优先级

3,资源统计(Accounting):cgroups可以统计系统的资源使用量。如CPU使用的时长短,内存用量等等,这个功能非常使用于计费

4,进程控制(Control)cgroups可以对进程组执行挂起和恢复等操作。

转载于:https://www.cnblogs.com/mayaohui/p/11395390.html

你可能感兴趣的:(运维,操作系统)