Docker组成架构
概述
Docker采用C/S架构,客户端与守护进程(daemon)通信,后者负责构建、运行和分发Docker容器。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序使用REST API,通过UNIX套接字或网络接口进行通信。
守护进程(daemon)
Docker daemon:(dockerd): 守护进程,主要用于监听Docker API请求和管理Docker的对象比如:镜像,容器,网络,和数据卷等,一个daemon也可以和其他daemon进行通信,以便于管理Docker服务。
Docker客户端
Docker用户主要通过客户端与docker交互,比如当运行“docker run”命令时,docker客户端接收到后,将其转交给守护进程daemon执行,docker命令行采用docker API,并且docker客户端能够和不止一个守护进程通信。
Docker镜像仓库
Docker镜像仓库存储了Docker的镜像,Docker Hub是任何人可以使用的公用镜像仓库,并且Docker默认配置为先从Docker Hub查找镜像。当然也可以自建私人镜像仓库,如果使用的是Docker数据中心(Docker DataCenter ,DDC),它包含docker可信任的镜像仓库(Docker Trusted Registry,DTR).
可以使用docker pull或者docker run命令拉取所需镜像,docker push推送镜像至镜像仓库。
一般来说,用仓库名和标签来标识镜像。标签为
Docker对象
当使用docker时,实际上是创建和使用一些诸如:镜像,容器,网络,数据卷,插件和其他对象。所谓对象都可以进行增删改查。
镜像
所谓”镜像“,它是一个只读的模板,其中包含有关创建容器的说明。通常,一个镜像依赖于另一个镜像,并附加一些额外的自定义属性,比如,你可以构建一个基于Ubuntu的镜像,但是安装Apache Web服务器和应用程序,以及运行应用程序所需的配置详细信息。
当然,也可以创建自己的镜像或者采用他人创建好的镜像然后公布到镜像仓库中,创建自己的镜像,可以采用书写一些简单的语法来控制创建和运行镜像的步骤的Dockerfile文件,dockerfile中的一条指令对应镜像中的一个层,当你改变你的dockerfile文件或者重构dockerfile文件的时候,只有改变的才会重建,这也是为什么和其他虚拟化技术相比,docker镜像如此轻量,小巧和快速的原因之一。
容器
容器是镜像的可运行实例。您可以使用Docker API或CLI创建,启动,停止,移动或删除容器。您可以将容器连接到一个或多个网络,将存储连接到它,甚至可以根据其当前状态创建新映像。
默认情况下,容器与其他容器及其主机相对隔离。您可以控制容器的网络,存储或其他基础子系统与其他容器或主机的隔离程度。
容器由其镜像以及您在创建或启动时为其提供的任何配置选项定义。删除容器后,对其状态的任何未存储在持久存储中的更改都将消失。
以下命令运行ubuntu
容器,以交互方式附加到本地命令行会话,然后运行/bin/bash
。
$ docker run -i -t ubuntu /bin/bash
运行此命令时,会发生以下情况(假设您使用的是默认注册表配置):
- 如果您没有
ubuntu
本地镜像,Docker会从您配置的注册表中提取镜像,就好像您已docker pull ubuntu
手动运行一样。 - Docker创建一个新容器,就像您
docker container create
手动运行命令一样。 - Docker将读写文件系统分配给容器,作为其最后一层。这允许正在运行的容器在其本地文件系统中创建或修改文件和目录。
- Docker创建了一个网络接口,用于将容器连接到默认网络,因为您没有指定任何网络选项。这包括为容器分配IP地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
- Docker启动容器并执行
/bin/bash
。由于容器以交互方式运行并连接到终端(由于-i
和-t
标志),因此您可以使用键盘提供输入,同时将输出记录到终端。 - 键入
exit
以终止/bin/bash
命令时,容器会停止但不会被删除。您可以重新启动它或将其删除。
服务
服务允许您跨多个Docker守护程序扩展容器,这些守护程序一起作为具有多个管理器和工作程序的群组一起工作。swarm的每个成员都是Docker守护程序,守护进程都使用Docker API进行通信。服务允许您定义所需的状态,例如在任何给定时间必须可用的服务的副本数。默认情况下,服务在所有工作节点之间进行负载平衡。对于消费者来说,Docker服务似乎是一个单独的应用程序。Docker Engine支持Docker 1.12及更高版本中的swarm模式。
基础技术
命名空间
Docker使用一种被称为namespaces
提供隔离工作空间的技术来称为容器。运行容器时,Docker会为该容器创建一组 名称空间。
这些命名空间提供了一层隔离。容器的每个方面都在一个单独的命名空间中运行,其访问权限仅限于该命名空间。
Docker Engine在Linux上使用以下命名空间:
pid
** 命名空间: **进程隔离(PID:进程ID)。net
**命名空间:**管理网络接口(NET:网络)。ipc
**命名空间:**管理访问IPC资源(IPC:进程间通信)。mnt
**命名空间:**管理文件系统挂载点(MNT:挂载)。uts
**命名空间:**隔离内核和版本标识符。(UTS:Unix分时系统)。
控制组
Linux上的Docker Engine还依赖于另一种称为控制组 (cgroups
)的技术。cgroup将应用程序限制为特定的资源集。控制组允许Docker Engine将可用的硬件资源共享给容器,并可选择强制执行限制和约束。例如,您可以限制特定容器的可用内存。
统一文件系统
联合文件系统或UnionFS是通过创建层来操作的文件系统,使它们非常轻量和快速。Docker Engine使用UnionFS为容器提供构建块。Docker Engine可以使用多种UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式
Docker Engine将命名空间,控制组和UnionFS组合成一个称为容器格式的包装器。默认容器格式是libcontainer
。将来,Docker可以通过与BSD Jails或Solaris Zones等技术集成来支持其他容器格式。