本文共 3651 字,大约阅读时间需要 12 分钟。
Docker使用的是 C-S架构。Docker的客户端同Docker Daemon进行交互,其中主要的工作是通过 daemon来完成,包括拉取镜像,编译镜像,运行容器,发布容器等。Docker client和daemon可以运行在同一个系统上,也可以通过远程方式进行访问。Docker client和daemon之间是在 socket 上通过RESTful API来进行交互的。
如上图所示,Docker daemon运行在一个主机之上,用户并不是直接同daemon进行交互,而是通过Docker client来进行访问。
在Docker那个方框中,是主要的用户访问Docker的渠道。用户通过它对Docker Daemon进行访问控制。
Docker Image是一个只读的模板。比如,一个Image可以包含一个Ubuntu操作系统,整个系统可以包括Apache和你的web应用。Image是用来创建容器的。Docker提供了一种简单的方式来创建Image和更新已有的 Image, 你可以从网上下载Image,也可以自己编译Image。
Docker Registry 是存放Image的仓库。我们可以使用公有的和私有的Registry来进行下载和上载。公共的Docker Registry位于Docker Hub,但是国内访问比较慢。Docker Hub包含了大量已有的Image,供用户使用。你可以基于之前的Image来创建自己的 Image。
Docker容器就像一个文件夹。一个容器包含了应用程序运行所需的所有环境。每个容器都源于某一个Docker Image。Docker容器可以运行,开始,停止,移动并删除。每个容器都是完全隔离的和安全的应用。
通过之前的介绍,我们知道:
我们已经看到Docker Image 是只读的模板,并随容器一起启动。每个Image包含了多个层。Docker Image使用的是Union File System来将这些层组合成一个Image。Union File System可以将文件和目录(通常称作Branch)进行透明的层叠组装,然后形成一个单独的文件系统。 Docker为什么轻量,就是因为使用了这些层状的文件系统。当用户修改一个Docker Image的时候(比如更新应用程序)一个新的层就会被建立。因此,这是一种增量式的修改,而不是新建一个全新的Image,这也是区别于传统虚拟机的一点。当你发布一个新的Image时,你只需要发布差异的部分,因此速度就非常快。
每个Image都来自于一个最基础的Image,如:ubuntu是一个基础Image,fedora是一个基础image。你也可以使用自己的Image作为基础Image,比如你可以创建包含了一个Apache 服务器的Image,作为所有web应用的基础Image。注意:Docker通常从Docker Hub获取基础镜像。
Docker的Image都是从这些基础镜像衍生而来的,在编译Image是由一系列指令组成的,每个指令在我们的Image上创建一个新的曾。指令包括:
Docker Registry是Image的仓库,当你编译完成一个Image时,你可以推送到公共的Registry,比如Docker Hub,也可以推送到你自己的私有Registry。 使用Docker Client,你可以搜索已经发布的Image,并从中拉取Image到本地,并在容器中运行。
Docker Hub提供了公有和私有的Registry。所有人都可以搜索和下载公共镜像。私有仓库只有私有用户能够查询和下载。一个容器由操作系统,用户文件和元数据构成。如我们所见,每个容器都根据镜像来生成。这个镜像告诉Docker 容器包含什么内容,运行什么程序,以及其他配置信息。Docker Image是只读的,当一个容器运行一个Image的时候,容器会在union FS的顶层增加文件层。
假如我们运行下面一条指令:
root@gctest:~# docker run -i -t ubuntu /bin/bashUnable to find image 'ubuntu:latest' locallylatest: Pulling from library/ubuntuDigest: sha256:f91f9bab1fe6d0db0bfecc751d127a29d36e85483b1c68e69a246cf1df9b4251Status: Downloaded newer image for ubuntu:latestroot@ea7ffc10c7e7:/#
我们来做一下拆解,Docker Client通过run命令告诉Daemon启动一个新的容器。这个指令至少需要包括:
那么具体到内部的流程是怎么样的呢?
Docker是用Go编写的,同时使用了多种内核的功能来实现我们现在所看到的功能。
Docker 使用了Namespace这项技术来隔离工作区,也就是我们所说的容器。当容器运行时,Docker创建了一系列的Namespace。 通过Namespaces,容器运行在它自己的独立命名空间之中,而外层没有访问权限。目前,Docker使用了以下Namespace:
Docker也使用了cgroups这项内核技术,通过cgroups可以限制应用程序使用的资源,这项技术可以使用户主机更好的运行多个容器而相互间不受影响。Cgroups可以限定容器使用的硬件资源,比如内存数量,CPU数量等。
UnionFS用来对文件系统进行分层,通过分层可以使镜像更加轻量级和快速。Docker可以使用多种不同的UnionFS,比如AUFS, btrfs, vfs, DeviceMapper等。
Docker将上述的多项技术包装在一起,形成了容器的格式。默认的容器格式是libcontainer , Docker也支持传统的 LXC格式。在未来,Docker也许会支持其他的容器格式,比如BSD Jails 或Solaris Zones.
备注:对有兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面。
转载地址:http://tiayl.baihongyu.com/