赞
踩
前几篇总结了Docker有关容器以及镜像方面的相关知识,从本篇开始我们就升华到了宏观方向的学习,这次我们来了解一下Docker的CS模式。
在前面的学习中我们了解到,Docker是以客户端和守护进程的方式来运行,本篇我们就来详细了解Docker的CS模式是如何运行的。
下图为Docker官方提供的Docker的CS运行模式的介绍:
在Docker Client中来运行Docker的各种命令,而这些命令会传送给在Docker的宿主机上运行的Docker的守护进程。而Docker的守护进程是负责来实现Docker的各种功能。
下面的图是去掉了一些没有用的信息,专注于Docker的客户端与守护进程的描述:
如图所示,Docker的守护进程运行在宿主机上,也就是我们常说的“C/S架构”的Server(服务)端,守护进程会在启动后,一直在后台运行,负责实现Docker的各种功能。而Docker的使用者并不会直接与守护进程进行交互,而是要通过Docker的客户端,也就是我们在前面演示过的Docker的命令行接口,来与Docker守护进程进行通信。而这个命令行接口,也就是我们在Shell中执行Docker命令时运行的二进制程序,它是Docker最主要的用户接口,用来从用户处接收Docker的命令,并且传递给守护进程;而守护进程将命令执行的结果返回给客户端,返显示在命令行接口中。
除了上面提到的客户端的命令行接口,Docker也提供了另外的与守护进程进行通信的方式。这就是Remote API。
Remote API和我们常见的网络平台提供的API非常相似,它也是一个RESTful风格的API。我们可以通过Remote API与Docker的守护进程进行通信。也就是说,我们可以通过编写程序,调用这个API,来将我们自己的程序与Docker进行集成。
Docker的Remote在某些复杂的情况下,也支持以下方式进行交互:
STDIN、STDOUT、STDERR
备注:标准输入(STDIN)、标准输出(STDOUT)、标准错误输出(STDERR)
下面这幅图我们可以看到,通过Remote API的形式,来实现Docker的C/S架构的模式:
用户可以与自定义的程序(JAVA、C++等)进行交互,而这些程序通过调用Remote API与Docker的守护进行进行协作。
大家可以通过Docker的官方网站,来访问Remote API的语言参考:
https://docs.docker.com/reference/api/docker_remote_api/
后面的总结也会详细介绍Remote API的使用。
至此,我们知道了Docker的CS模式的大致执行模式,那么Docker的客户端是如何与守护进程进行通信的呢?
Docker的客户端与守护进程,实际上是通过Socket进行连接的。
Docker提供了三种进行Socket连接的模式:
(1)Unix的端口模式
unix:///var/run/docker.sock
(2)TCP协议的host:port模式:
tcp://host:port
(3)fd的Socket模式
fd://socketfd
其中,Unix的端口模式是Docker默认的客户端与守护进程的连接方式。我们也可以通过配置进行修改,来使用其它的Socket连接方式。
下图就是一个完整的Docker的C/S模式的运行方式:
用户可以通过命令行接口,或者自定义的应用,来与客户端进行连接。这个客户端可以是Docker提供的二进制程序(Shell中运行的Docker命令),也可以是用户自定义的程序,而这个程序是通过调用Remote API来调用Docker的服务。而Docker的客户端与Docker的服务端是通过Socket进行连接,这种连接本身也就意味着,Docker客户端与服务端既可以在同一台机器,也可以在不同机器上运行。也就是Docker的客户端可以通过远程访问的方式,来访问Docker的服务端。在后面的学习中,会详细介绍这种连接方式。
下面通过演示,来进一步理解这一过程。
刚才我们了解到,Docker的守护进程,在启动后,会一直运行,那么我们就可以使用Linux的PS命令,来查看当前进程中是否已经启动了Docker的服务:
我们使用“grep”来过滤Docker关键字。我们看到的第一条就是正在运行的Docker的守护进程。
我们在命令行中使用的Docker命令,实际上就是使用的Docker的客户端程序在与守护进程进行交互。我们运行version命令:
其中的“server API version”指的就是我们刚刚讲的Remote API的版本。
下面我们再来演示Docker的Remote API是什么样子。这里我们需要使用Linux的netcat(nc)的命令,来实现socket的连接:
注意:没有nc命令,使用“yum install -y nc”即可安装。
上面我们使用“-U”来指明使用的是socket,Docker使用的socket地址为“/var/run/docker.sock”。回车后,就已经成功连接了socket:
此时我们使用socket来发起一个http的指令,用来查看Remote API中的一个接口---info,这个接口用来返回Docker的相关信息。后面的“HTTP/1.1”为指定的协议类型。我们看到返回的结果就是通过Docker的Remote API所返回的结果,这个结果使用了json的格式。(这里我始终得不到JSON反馈,了解的童鞋请帮忙分析一下原因)
这里我们介绍的都是通过本机来访问,无论是通过Docker的客户端还是Remote API。我们前面讲,Docker的C/S模式本身也可以支持远程的访问,在后面的学习总结中,会对这种远程访问进行介绍。
参考资料:
《极客学院Docker学习》教学视频
转载请注明出处:https://blog.csdn.net/acmman/article/details/85474728
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。