docker架构
Docker daemon
是Docker最核心的后台进程,它负责响应来自Dockerclient的请求,然后将这此请求翻译成系统调用完成容器管理操作。该进程会在后台后启动一个APIServer,负责接收由 Dockerclient发送的请求;接收到的请求将通过Dockerdaemon分发调度,再由具体的函数来执行请求。
Docker client
是-个泛称,用来向Dockerdaemon发起请求,执行相应的容器管理操作
镜像管理
distribution负责与Dockerregistry交互,上传下载镜像以及存储与v2registry有关的元数据。
registry模块负责与Dockerregistry有关的身份验证、镜像查找、镜像验证以及管理registry mirror等交互操作。
image模块负责与镜像元数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导人导出等操作。
reference负责存储本地所有镜像的repository和tag名,并维护与镜像ID之间的映射关系。口layer模块负责与镜像层和容器层元数据有关的增删查改,并负责将镜像层的增删查改操作映射到实际存储镜像层文件系统的graphdriver模块。
execdriver(容器执行驱动)、volumedriver(volume存储驱动)、graphdriver(镜像存储驱动)
execdriver是对Linux操作系统的namespaces、cgroups、apparmor、SELinux等容器运行所需的系统操作进行的一层二次封装,其本质作用类似于LXC,但是功能要更全面。这也就是为什么LxC会作为execdriver的一种实现而存在。当然,execdriver最主要的实现,也是现在的默认实现:是Docker官方编写的libcontainer库。
volumedriver是volume数据卷存储操作的最终执行者,负责volume的增删改查,屏蔽不同驱动实现的区别为上层调用者提供一个统一的接口。Docker中作为默认实现的 volumedriver是local默认将文件存储于Docker根目录下的volume文件夹单。其他的 volumedriver均是通过外部插件实现的。
graphdriver是所有与容器镜像相关操作的最终执行者。graphdriver会在Docker工作目录下维护一组与镜像层对应的目录,并记下镜像层之间的关系以及与具体的graphdriver实现相关的元数据。这样,用户对镜像的操作最终会被映射成对这些目录文件以及元数据的增删改查,从而屏蔽掉不同文件存储实现对于上层调用者的影响。在Linux环境下,目前 Docker已经支持的graphdriver包括aufs、btrfs、zfs、devicemapper、overlay和vfs。
network
libnetwork抽象出了一个容器网络模型(Container NetworkModel,CNM),并给调用者提供了一个统一抽象接口,其目标并不仅限于Docker容器
docker 工作目录结构
libcontainer实现原理
用Factory创建逻辑容器Container
用逻辑容器创建物理容器
启动逻辑容器Container
docker daemon 与容器之间通信
发送信号通知(signal)
对内存轮询访问(pollmemory)
sockets通信(sockets)
文件和文件描述符(filesandfile-descriptors)
docker架构
2024-06-08 18:06:43