Docker: Core Concept

 7th March 2021 at 8:32pm

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-slimDockerfile,不明白这个 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:让文件系统分层,比如一层可写的覆盖在一层只读的上面

References