使用前了解架构和原理,能帮助你更好的理解思想和原理。

Docker架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。

Docker 面向对象
容器 对象
镜像

Docker架构 - 图1

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Docker使用C/S(客户端-服务器)架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
Docker架构 - 图2

Docker daemon 守护程序

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和磁盘卷。守护程序还可以与其他守护程序通信以管理Docker服务。

Docker client 客户端

Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

Docker registries 仓库

Docker registries 存储Docker映像。Docker Hub是任何人都可以使用的公共注册表,并且默认情况下,Docker已配置为在Docker Hub上查找映像。您甚至可以运行自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)。
使用docker pulldocker run命令时,所需的图像将从配置的注册表中提取。使用该docker push命令时,会将映像推送到配置的注册表。

Docker对象

使用Docker时,您正在创建和使用映像,容器,网络,磁盘卷,插件和其他对象。本节是其中一些对象的简要概述。

image 镜像

一个images是用于创建一个docker容器的只读模板。一个image继承自另一个image,类似多层只读文件夹,这样多个image占用的磁盘空间就减少了。

container 容器

image的运行实例,一个image可以有多个container。容器运行时,会自动拷贝image最上一层文件,所有的读写都在这个复制层完成,不会修改镜像本身文件。

Docker引擎

Docker Engine是具有以下主要组件的客户端-服务器应用程序:

  • 服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
  • REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
  • 命令行界面(CLI)客户端(docker命令)。

Docker架构 - 图3
CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护程序或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。

底层技术

Docker用Go编写,并利用Linux内核的多个功能来交付其功能。

  • Namespaces 命名空间
  • Control groups 控制组
  • Union file systems 联合文件系统
  • Container format 容器格式化

    Namespaces 命名空间

    Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组 命名空间
    这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
    Docker Engine在Linux上使用以下名称空间:

  • pid命名空间:进程隔离(PID:进程ID)。

  • net命名空间:管理网络接口(NET:网络)。
  • ipc命名空间:管理访问IPC资源(IPC:进程间通信)。
  • mnt命名空间:管理文件系统挂载点(MNT:Mount)。
  • uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)。

    Control groups 控制组

    Linux上的Docker引擎还依赖于另一种称为控制组cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。

    Union file systems 联合文件系统

    联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。

    Container format 容器格式化

    Docker Engine将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中。默认容器格式为libcontainer。将来,Docker可能会通过与BSD Jails或Solaris Zones等技术集成来支持其他容器格式。