Docker 可以切割成下面几块进行理解。
Docker Engine
Docker Engine is a client-server application with these major components:
- A server which is a type of long-running program called a daemon process (the
dockerd
command). - A REST API which specifies interfaces that programs can use to talk to the daemon and instruct it what to do.
- A command line interface (CLI) client (the docker command).
Docker Architecture
这个图,可以看出 Container, Image 和 Registry 之间的关系:
- Conatiner 是上一节 Docker engine 描述的东西,它一般是通过某个 image 部署而来
- Image 是 Docker engine 根据你的 Dockerfile 构建出来的一个二进制包。Docker 用了一种我搞不懂的机制,保证了同一个 Dockerfile 构建出来同样的 image(未确认过)
- Registry 类似于 PyPi,是一个 Dockerfile 跟 Image 的仓库,你可以通过 Registry 拉到 image
大多数的 Image 都不是 base image,他们都是基于某个 parent image 构建出来的,比如 Redis,里面第一行 FROM alpine:3.7
表示它是基于 alpine:3.7
这个 image 构建的。Base image 一般都有一行 FROM scratch
,这个 scratch
并不是一个真实的 image,不能被 pull。流行的 base image 有 Debian 系的 jessie-slim
和 Alpine。
这些 base image 是怎样构建出来的,我还看不懂。看 Github 上 jessie-slim
的 Dockerfile,不明白这个 rootfs.tar.xz
的内容,怎样保证就能运行在 Container 的环境中?比如各种驱动怎样保证呢?
Service, Task, Node, Stack, and Swarm
Service 表示一组服务。比如上图,你想要有一个 nginx 作为 load balancer,于是你定义了一个有 3 个实例(replica)的 nginx 服务。
这个服务被分割成 3 个 task,每个 task 都要起一个容器去运行 nginx。每个容器即是这个 nginx 服务的一个结点。
一个 stack 表示一组相互关联的 service。比如你有两个服务,一个 nginx 作 LB,一个 Django 作应用服务器,这两个服务是相互关联的。那么你可以写一个 docker-compose.yml
文件,再通过 docker stack
命令部署上去。
由于往往有多个容器运行不同服务,需要一套机制来管理不同的容器结点,因此 Docker Swarm 产生了:
Swarm 定义了一个 manager 结点和一些 worker 结点。在不同容器中通过 docker swarm
命令成为 manager 结点或者加入另外一个 manager 结点组成 swarm。这个机制于 Docker Stack 相辅相成,有了 Docker Swarm 后,stack 才可以在 manager 结点上,通过 API 与各个 worker 通讯,按 docker-compose.yml
定义的服务去部署节点。
The Underlying Technology
这块我无力深入,只把需要理解的内容纪录下来。
- Namespace:实现不同容器间,进程、网络、IPC、文件系统装载、用户系统等隔离
- Control groups:实现资源分配
- Union file systems:让文件系统分层,比如一层可写的覆盖在一层只读的上面