介绍
Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
系统架构
核心技术
Namespaces (namespace)
Namespace是Linux提供的一种内核级别环境隔离的方法,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。
Control groups (CGroup)
用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)
可以让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。
主要提供了一下功能- Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
- Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
- Accounting: 一些审计或一些统计,主要目的是为了计费。
- Control: 挂起进程,恢复执行进程
Union file systems (AUFS)
AUFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可
当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制copy on write
….等
核心组件
客户端 Client
Docker client 是给用户和 Docker daemon 建立通信的客户端,安装了 docker 之后,二进制文件 docker 就是 Docker client,与 Docker daemon 交互, 通过客户端 docker 命令,我们可以方便地实现对 Docker image 和 container 的管理请求。
Docker client 与 docker daemon 建立请求的方式有三种,分别是:
tcp://host:port
unix://path/to/socket
fd://socketfd
常驻后台的系统进程 Docker daemon
Docker daemon 是一个常驻后台的系统进程,所谓“运行 docker”,指的就是运行 Docker daemon,其作用主要有以下两点:
接受并处理 Docker Client 发送的请求
管理所有的 Docker containers 和 Docker images
Docker daemon 的架构大致可以分为三部分:Docker Server、Engine 和 Job。
docker daemon 监听来自 remote api 的请求的方式有三种:unix、tcp 和 fd
默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,可以使用dockerd命令:
1
dockerd -H 0.0.0.0
镜像 Image
镜像是一个只读的层(layer),由文件系统叠加构成,就相当于是一个 root 文件系统,通过它可以创建 Docker 容器(Container)。
分层存储,每一层都可以添加改变和删除文件,形成一个新的镜像
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层
不同的镜像可以共享相同的层
- 容器 Container
Docker 容器是用于运行镜像的沙箱环境,它是 Docker 镜像的运行实例;容器都是相互隔离、互不可见的,我们可以理解为:镜像是Docker生命周期的打包和构建阶段,而容器是Docker的启动和执行阶段。
镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
在Image Layer之上建立一个 Container Layer(读写层),镜像(image)负责app的存储和分发,容器(Container)负责运行app
- 仓库 Registry
Registry 是集中的存储、分发镜像的文件仓库
仓库分为公有仓库和私有仓库,常用的公有仓库是官方的 Docker Hub,默认的 docker pull 命令就是从官方的公有仓库中拉取镜像;个人可以根据Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务