搭建好环境后,要先了解docker的架构,知道有哪些模块,然后挑感兴趣的模块学习。源码阅读环境我前面的文章有写。
1、Docker有哪些模块
下图取自于微信读书里面的《Docker源码分析》一书
docker架构中主要的模块有:DockerClient、DockerDaemon、Docker Registry、Graph、Driver、libcontainer以及Docker Container。
以下是各个模块的功能说明
1.1. Docker Client
在这里其实就是指的docker命令行 cli。用户通过 Docker Client 发起命令,如 docker run
、docker pull
、docker build
等。本质是将用户的命令翻译为 HTTP API 请求,发送给 Docker Daemon。
1.2. Docker Daemon
其实就是我们常说的docker守护进程,也就是我们之前编译的dockerd。它负责接收来自 Docker Client 的请求。
- 管理容器的创建、运行、销毁,以及镜像的下载和存储。
- 提供 Docker API,作为客户端和其他工具(如 Kubernetes)与 Docker 交互的接口。
- 协调其他模块(如存储驱动、网络等)完成用户请求。
1.3. Docker Registry
用于存储和分发 Docker 镜像。Docker Client 可以通过 docker pull
从 Registry 拉取镜像,或通过 docker push
将镜像上传到 Registry。
1.4. Graph
Graph 是 Docker 用于管理镜像和容器分层存储的逻辑组件。它的主要功能由 GraphDriver(存储驱动) 和相关模块实现,负责文件系统操作、数据复用以及镜像和容器元数据管理。虽然 Docker 的文档中不直接提到 “Graph” 作为模块名称,但这一逻辑是 Docker 分层存储机制的核心。
1.5. Driver
Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现对Docker容器运行环境的定制,定制的维度主要有网络环境、存储方式以及容器执行方式。需要注意的是,Docker运行的生命周期中,并非用户所有的操作都是针对Docker容器的管理,同时包括用户对Docker运行信息的获取,还包括Docker对Graph的存储与记录等。
1.6. libcontainer
Docker 用来与容器功能(如 cgroups、namespace、AppArmor、seccomp 等)交互的库。通过直接调用 Linux 内核的低级 API 创建和管理容器。是一个轻量级、高性能的运行时,后来被 Docker 的更通用运行时工具(如 containerd 和 runc)替代,但仍是核心功能的基础。
1.7. Docker Container
经过一系列组件的配置与封装最终运行起来的进程就是Container。
2、查看API对应的逻辑
docker是CS架构,当我们在命令行执行docker命令的时候,其实就是将请求封装成rest请求发送给docker的守护进程, 由守护进程执行对应的操作。
因此我们要知道我们执行docker命令的时候,对应API是啥。
debug模式启动docker守护进程(dockerd)
./bundles/binary-daemon/dockerd --debug
启动完成后会等待请求,如下图所示,可以看到守护进程有哪些api
然后执行docker命令
./build/docker info
再看守护进程的后台输出
v1.48后面就是对应的API, 在代码中搜索,找到像下面这样的
跳转就找到对应的处理逻辑了
3、docker官方API文档
https://docs.docker.com/reference/api/engine/
这里可以看到各个版本的API介绍以及介绍如何用SDK去编码实现docker的自动化运行