、Docker Platform(Docker平台)


    Docker提供了一个开发、打包、运行APP的平台,把APP和底层infrastructure隔离开来。

Docker的架构和底层技术_java

2、Docker Engine(Docker引擎)


后台进程(dockerd)

    Docker并非单体应用,它由多个组件构成。介绍Docker守护进程(daemon)与Docker命令行(CLI)。事实上,当我们在谈论安装或使用Docker时,所指的其实就是Docker守护进程与命令行。

    通俗的讲:用于管理容器的守护进程,叫dockerd,docker是可以分为服务端和客户端的。即有host和client,dockerd可以理解为docker的引擎,来直接控制docker 的daemon的行为的。


REST API Server

    Docker守护进程提供了REST API。许多工具(Docker命令行,Docker Compose等)都可以通过REST API与Docker守护进程进行交互,例如创建容器,构建镜像等。

    docker remote api 是docker自带的一个rest api 管理。不同的API版本参考官方文档:https://docs.docker.com/develop/sdk/


CLI接口(docker)

    docker的客户端或者说是命令行工具。Docker命令行(docker CLI)是与Docker守护进程进行交互的主要工具。

Docker的架构和底层技术_java_02

[root@docker ~]# docker versionClient: Version:           18.09.6 API version:       1.39 Go version:        go1.10.8 Git commit:        481bc77156 Built:             Sat May  4 02:34:58 2019 OS/Arch:           linux/amd64 Experimental:      falseServer: Docker Engine - Community Engine:  Version:          18.09.6  API version:      1.39 (minimum version 1.12)  Go version:       go1.10.8  Git commit:       481bc77  Built:            Sat May  4 02:02:43 2019  OS/Arch:          linux/amd64  Experimental:     false[root@docker ~]#


3、Docker Architecture(Docker架构)


Docker的架构和底层技术_java_03

4、Docker底层技术支持


Namespaces:做隔离pid,net,ipc,mnt,uts

    在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、通信资源、网络资源等等)合理分配给各个用户所在的进程?Linux中提出了namespace机制,这是一种轻量级的虚拟化形式。再次之前,Linux中很多资源是全局管理的,例如,系统中所有进程,都是通过PID来标识的,就像每个学生的学号一样,在整个学校范围内,肯定是唯一标识这个学生的。用户的ID管理,各个用户通过全局为UID来标识,每个学校的校长也只有有一个,它的UID为0,权利最大,可以对学校内全部老师和学生发起命令。每个学生可以看到其他学生的活动,但是无权把他们赶出学校,这是可以理解的。这种集中统一的管理方式,很适合大规模人群的管理。

    随着大数据、虚拟化的兴起,Linux为了提供更加精细的资源分配管理机制,给出了namespace机制解决方法。


Control groups:做资源限制

    CGroups 最初叫Process Container,顾名思义就是将进程放到一个组里进行统一控制。后来改名叫Control Groups。CGroups 是 Control Groups 的缩写,它为资源管理提供了一个统一框架,可以把系统任务及其子任务整合到按资源等级划分的不同任务组内。并且对这些任务组实施不同的资源分配方案。CGroups可以限制、记录、隔离进程组所使用的物理资源(包括CPU、memory、I/O等)。

    cgroups有如下四个有趣的特点:

    1. cgroups的API以一个伪文件系统的方式实现,即用户可以通过文件操作实现cgroups的组织管理。

    2. cgroups的组织管理操作单元可以细粒度到线程级别,用户态代码也可以针对系统分配的资源创建和销毁cgroups,从而实现资源再分配和管理。

    3. 所有资源管理的功能都以“subsystem(子系统)”的方式实现,接口统一。

    4. 子进程创建之初与其父进程处于同一个cgroups的控制组。


Union file systems:Container和image的分层

    unionfs是一种为Linux,FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务。它使用branch把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。这些branches或者是read-only或者是read-write的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件,这是因为unionfs用到了一个重要的资管管理技术叫写时复制。

    写时复制(copy-on-write,下文简称CoW),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。它的思想是,如果一个资源是重复的,但没有任何修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改的时候增减小部分的开销。