Docker 了解架构

Docker 总架构图

img

C/S 架构

docker 系统使用了 C/S 的架构,docker client 通过 REST API 请求 docker daemon 来管理 docker 的镜像和容器等。

  • Server 端驻守在后台,称之为 docker daemon
  • Client 端是一个 CLI 程序,可以在命令行中通过 docker 这个二进制文件进行交互

Docker client

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 daemon 是一个常驻后台的系统进程,所谓“运行 docker”,指的就是运行 Docker daemon,其作用主要有以下两点:

  • 接受并处理 Docker Client 发送的请求
  • 管理所有的 Docker containers 和 Docker images

Docker daemon 的架构大致可以分为三部分:Docker Server、Engine 和 Job。

Docker daemon 架构示意图

img

  • Docker Server 专门服务于 Docker Client,其作用是接受并调度分发 Docker client 发送的请求。
  • Engine 是 Docker 中的运行引擎, 是其运行的核心模块。Engine 中存储着大量的容器信息,也管理着 Docker 大部分 Job 的执行。
  • Job 是 Docker 中最基本的工作执行单元,Docker daemon 可以完成的每一项工作都能呈现为一个 Job。

Linux 下,使用 dockerd 命令,便可以 daemon 模式操作 docker

Docker Remote Api

docker daemon 会监听 unix:///var/run/docker.sock 的 socket,提供一个 RESTful 的 Remote API,可供客户端访问,例如:

1
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 命令:

1
dockerd -H 0.0.0.0:5555

便可将 docker daemon 的监听方式变为 tcp://host:port 的方式,然后客户端可以

1
docker -H :5555 pull ubuntu

来访问 daemon