架构是一个很大的概念,也绝非一两篇文章能写清楚的,这里记录自己认为重要的部分和相关的学习资料。
Docker 总架构图
docker 系统使用了 C/S 的架构,docker client 通过 REST API 请求 docker daemon 来管理 docker 的镜像和容器等。
Server 端驻守在后台,称之为 docker daemon
Client 端是一个 CLI 程序,可以在命令行中通过 docker
这个二进制文件进行交互
Docker client 是给用户和 Docker daemon 建立通信的客户端,安装了 docker 之后,二进制文件 docker
就是 Docker client,与 Docker daemon 交互,实现对 Docker image 和 container 的管理请求。
Docker client 与 docker daemon 建立请求的方式有三种,分别是:
tcp://host:port
unix://path/to/socket
fd://socketfd
Docker daemon 是一个常驻后台的系统进程,所谓“运行 docker”,指的就是运行 Docker daemon,其作用主要有以下两点:
接受并处理 Docker Client 发送的请求
管理所有的 Docker containers 和 Docker images
Docker daemon 的架构大致可以分为三部分:Docker Server、Engine 和 Job。
Docker daemon 架构示意图
Docker Server 专门服务于 Docker Client,其作用是接受并调度分发 Docker client 发送的请求。
Engine 是 Docker 中的运行引擎, 是其运行的核心模块。Engine 中存储着大量的容器信息,也管理着 Docker 大部分 Job 的执行。
Job 是 Docker 中最基本的工作执行单元,Docker daemon 可以完成的每一项工作都能呈现为一个 Job。
Linux
下,使用 dockerd
命令,便可以 daemon 模式操作 docker
。
docker daemon 会监听 unix:///var/run/docker.sock
的 socket,提供一个 RESTful 的 Remote API,可供客户端访问,例如:
curl --unix-socket /var/run/docker.sock http:/containers/json/?all/=1
便可得到所有的容器列表,相当于在 terminal 中执行了 docker ps -a
命令。
注:如果需要自己实现 docker client
的,可访问 Docker Remote API 参考相关文档。
docker daemon 监听来自 remote api 的请求的方式有三种,unix、tcp 和 fd。
默认情况下,监听的是 unix:///var/run/docker.sock
,在 linux
下,想要改变其监听方式,可以使用 dockerd
命令:
dockerd -H 0.0.0.0:5555
便可将 docker daemon 的监听方式变为 tcp://host:port
的方式,然后客户端可以
docker -H :5555 pull ubuntu
来访问 daemon
。