前面安装了docker,通过最简单的例子也直观的感受了docker是怎么玩的。下面我们就来了解下docker的架构是怎么的,都包括那些核心的东西。下图是docker的架构图:
可以看出Docker采用的是C/S架构模式,client负责发送请求,server(daemon)负责处理请求:包括构建、运行、分发docker容器。当然了client和server可以运行在同一个或不同的主机上。两者之间通过REST API或者socket通信。
主要概念
Docker daemon
Docker daemon承担服务器的职责。当Docker安装成功后,默认该部件就启动了。可以使用systemctl status docker.service或者service docker status查看。
ps可以观察到有一个常驻的进程:dockerd。实际上这个就是docker daemon的进程。Docker daemon负责监听Docker的API请求并且对docker的对象进行管理,包括镜像、容器、网络等等。另外daemon也可以和其他daemon一起相互协作管理docker服务。这一点我们在后面docker swarm会讲到。
Docker client
Docker client是用户与docker交互的最主要的方式。例如,你在终端敲docker run命令,其实就是client将run请求发送到daemon进行处理。Docker拥有丰富的命令集合,每个命令又含有丰富的子命令。当你敲击docker --help你会看到长达几十个命令。
Docker registries
Docker registry是用来存储docker镜像的仓库。Docker Hub和Docker Cloud提供了公有仓库,上面有丰富的镜像资源供用户下载使用。当使用docker
run ubuntu或者docker pull ubuntu默认是去Docker Hub下载镜像。当然,出于对网速和安全的考虑,用户也可以构建自己的私有仓库,然后就可以从私有仓库下载镜像或者上传镜像到私有仓库。
Docker images
Image是docker的基石,是一个可运行的基本单元。image是只读的,包括container运行所需要的数据,主要用来创建container。实际上image是由一层层的文件系统组成的,这种层级的文件系统称为UnionFS。Docker image来源:
(1)可以基于Dockerfile从无到有的构建;
(2)也可以基于Dockerfile从已有的image创建新的image;
(3)也可以基于容器生成新的image;
(4)甚至也可以直接下载别人的image。
Docker containers
Container是由image实例化来的,这就类比于面向对象中class和object的关系。Container类似于虚拟机,我们可以把它看做精简版的Linux+运行于其中的app。当然我们也可以对container进行诸如启动、停止、删除等操作。