NingG +

Docker 系列:核心原理和实现(1)

概要

几个常见问题:

需要分析 Docker 的设计理念和底层实现原理,才能提纲挈领,对上述问题,有个本质的理解。

按照 Docker overview: 官网 的思路,从几个方面介绍:

  1. 入门介绍:
    1. Docker 平台(Docker Platform)
    2. Docker 引擎(Docker Engine)
    3. 适用场景
  2. Docker 架构:
    1. Docker daemon:服务器
    2. Docker client:客服端
    3. Docker registries:私服
    4. Docker objects:镜像、容器、服务
  3. 底层技术:
    1. 命名空间:namespace
    2. 控制组:control groups
    3. 联合文件系统(分层文件系统):Union file systems
    4. 容器格式:Container format

入门介绍

Docker 是一个开发、分发、部署运行应用的平台,能够非常简便的控制应用之间的资源隔离,极大提升开发、测试、部署上线的效率。

Docker 平台

Docker :

  1. 依赖容器,实现应用之间的资源隔离安全控制
  2. 容器运行时,能够直接调用 Kernel 接口(系统调用),效率非常高;
  3. 容器,既可以运行在物理机上,甚至也可以运行在虚拟机上;

Docker 平台,提供多种工具,来管理容器的整个生命周期

Docker 引擎

Docker 引擎,本质是 Client-Server 模式,包含下述几个组件:

参考示意图:

适用场景

Docker 可以用来做什么呢?有什么好处呢?

Docker 架构

主要关键点:

  1. Docker 是 C/S 架构,由 Client 和 Server 组成。
  2. Client 通过 REST API 跟 Server 之间交互。
  3. Docker Server 具体形式,就是 Docker Daemon 后台进程。
  4. Docker Client 和 Docker Server,可以在同一台机器上,也可以不在一起。

具体的架构:

具体 4 个关键对象:

Docker 服务器

Docker Daemon 后台进程(dockerd),做几件事情:

  1. 对外:通过 REST API,提供交互接口,监听外部的交互命令
  2. 对内:管理 镜像容器网络磁盘

补充说明:

Docker 客户端

几个方面:

  1. 直接使用的 docker 命令,就是最常见的 Docker 客户端;
  2. 使用 docker 命令,能够跟 dockerd 后台进程,进行交互;
  3. docker 客户端,可以跟多个 dockerd 后台进程,进行交互; (疑问:什么含义?)

Docker 仓库

Docker 仓库:

Docker 对象

Docker 场景下,几个常见对象的说明:

更多细节,可以参考下文的「实例」部分的说明。

实例

下面一条命令的执行过程:

-- 目标:运行一个 ubuntu 容器,同时,进入容器的操作系统命令行
$ docker run -i -t ubuntu /bin/bash

具体分为下面几个过程:

  1. 镜像:如果 dockerd 的本地不存在 ubuntu 镜像,则,自动执行 docker pull ubuntu 命令,从 Docker 仓库 获取镜像,下载到 Docker 服务器 的本地;
  2. 容器:创建一个容器,跟命令 docker container create 类似;
  3. 文件系统:自动创建一个可读、可写层,允许容器在本地文件系统上,进行读写操作;
  4. 网络:为容器分配一个网络地址,容器可以使用宿主机的网络对外通信;
  5. 启动:启动容器,并且,执行 /bin/bash 命令,因为设置了 -it 选项,容器通过本地终端窗口,进行交互
  6. 终止:交互命令窗口中,输入 exit 容器会终止运行,但是,容器并未删除,可以再次重启,或者进一步删除容器;

底层技术

Docker 是使用 Go 语言编写的,使用了大量的 Linux 内核调用,以达到其对外的资源隔离.

Docker 的底层技术,涵盖:

  1. 命名空间:namespace,OS 级别,实现资源隔离,避免容器之间相互干扰
  2. 控制组:control groups
  3. 联合文件系统(分层文件系统):Union file systems
  4. 容器格式:Container format

命名空间:资源隔离, OS 级别

Docker 引擎,通过命名空间namespace),来实现容器之间的资源隔离,每个容器,只能看到自己空间内的东西。

Docker 引擎,使用的命名空间:(OS 级别

详细说明:

控制组:资源限制,硬件级别

Docker 引擎,依赖控制组(control group, cgroup),实现硬件资源共享限额

关于限额,几个方面:

  1. 隔离
  2. 优先级
  3. 配额

可以控制限额的硬件资源

疑问:

联合文件系统,分层文件系统

Union file systems, or UnionFS,通过分层方式,标识差量部分。提供几点便利:

现在有多种联合文件系统的实现:

更多细节,参考:

容器格式

Docker 引擎,封装 namespacescontrol groupsUnionFS 构造成一个容器格式。当前默认的容器格式,是 libcontainer

未来,结合了 BSD JailsSolaris Zones 技术,可能会诞生其他容器格式

参考资料

Top