使用前了解架构和原理,能帮助你更好的理解思想和原理。
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 镜像(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 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 pull
或docker run
命令时,所需的图像将从配置的注册表中提取。使用该docker push
命令时,会将映像推送到配置的注册表。
Docker对象
使用Docker时,您正在创建和使用映像,容器,网络,磁盘卷,插件和其他对象。本节是其中一些对象的简要概述。
image 镜像
一个images是用于创建一个docker容器的只读模板。一个image继承自另一个image,类似多层只读文件夹,这样多个image占用的磁盘空间就减少了。
container 容器
image的运行实例,一个image可以有多个container。容器运行时,会自动拷贝image最上一层文件,所有的读写都在这个复制层完成,不会修改镜像本身文件。
Docker引擎
Docker Engine是具有以下主要组件的客户端-服务器应用程序:
- 服务器是一种长期运行的程序,称为守护程序进程(
dockerd
命令)。 - REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
- 命令行界面(CLI)客户端(
docker
命令)。
CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护程序或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。
底层技术
Docker用Go编写,并利用Linux内核的多个功能来交付其功能。
- Namespaces 命名空间
- Control groups 控制组
- Union file systems 联合文件系统
-
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等技术集成来支持其他容器格式。