我们不会介绍所有API,官方文档(https://docs.docker.com/engine/reference/ api/docker_remote_api_v1.24/)写得很好,并提供了足够的细节。相反,我们将探索一些关于Docker Swarm的基本示例。下面将通过重复之前实践的一些客户端命令来了解如何使用API。本章的目标是获取足够的知识,以便能够在你的应用程序中使用API,以及作为在接下来的章节中探讨的不同服务之间的粘合剂。稍后我们将尝试利用这些知识来创建一个监控系统,该监控系统会将有关集群的信息存储在数据库中并执行一些操作。
下面针对API的可能场景来讨论一个简单的例子。
如果一个节点失败,那么Swarm会确保在它内部运行的容器被重新安排。但是,并不意味着这样就够了。我们可能希望发送一封电子邮件来指出某个节点失败。收到此类电子邮件后,有人会对节点失败的原因进行排查,并可能采取一些措施。由于Swarm缓解了这个问题,因此这些任务并不紧急。但是,不紧急并不意味着不需要做。
接下来的章节将尝试使集群更加健壮,并且API将在其中扮演至关重要的角色。现在,让我们简要介绍一下。
下面将从一个简单的例子开始,看一下集群由哪些节点组成:
输出显示有三个节点,每个节点都有详细的信息。显示所有节点的所有信息对于本书来说太多,所以将输出限制在其中一个节点上。我们所要做的就是将节点的名称追加到前面的命令中:
上面的输出被截断并且只包含“Leader”节点,你的输出将包含三组以ID开头的节点。我们不会详细说明每个字段的含义,你应该已经熟悉它们中的大多数。
请参阅Docker Remote API v1.24:Nodes(https://docs.docker.com/engine/ reference/api/docker_remote_api_v1.24/#/nodes)以获取更多信息。
该API不仅限于查询,还可以使用它来执行Docker客户端(以及其他几个地方)可用的任何操作(以及更多)。例如,可以创建一项新服务:
我们发送一个POST请求来创建一个名为go-demo-db的服务。该服务的镜像是mongo:3.2.10。API把服务的ID作为响应结果:
更多信息请参考Docker Remote API v1.24:创建一个服务(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#create-a-service)。
可以列出所有服务以确认操作确实成功:
输出如下:
我们得到了一个服务列表(目前只有一个服务),并列出了其中的一些属性。我们可以看到创建服务的时间、副本的数量,等等。请参考Docker Remote API v1.24:列出服务(https://docs.docker.com/engine/reference/api/docker_remote_ api_v1.24/#/list-services)以获取更多信息。
同样,可以检索单个实例的信息:
输出与我们列出所有服务时的输出几乎相同。唯一区别是这次我们得到了一个单一的结果,而服务列表返回了一个包含在[和]中的数组:
更多信息请参考Docker Remote API v1.24:检查一个或多个服务(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#inspect-one-more-services)。
让我们稍微调整一下,扩展到三个副本。可以通过更新服务来实现这一目标。但是,在发送更新请求之前,需要该服务的版本和ID,刚才发送的服务请求的输出中提供了这些信息。但是,由于我们尝试以易于自动化的方式执行操作,所以最好将这些值放在环境变量中。
可以使用jq过滤输出并返回一个特定值。
返回服务版本的命令如下:
变量$ VERSION的输出如下:
同样,也应该获取服务ID:
输出如下:
现在有了更新服务所需的所有信息,把副本数量更改为三个:
更多信息请参考Docker Remote API v1.24:更新服务(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#update-a-service)
接下来可以列出任务并确认服务是否确实扩展到三个实例:
输出如下:(www.xing528.com)
如你所见,返回了三个任务,每个任务都代表go-demo-db服务的一个副本。
更多信息请参考Docker Remote API v1.24:列出任务(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#list-tasks)以获取更多信息。
到目前为止,所有的API请求都与节点和服务有关。在某些情况下,我们可能需要降低级别并在容器级别上使用API。例如,可能想要获取与单个容器相关的统计信息。
在继续之前,请确保所有任务的状态都正在运行。请重复http:/tasks请求以确认状态。如果任务没在运行,请稍等片刻再次检查。
要获取容器的统计信息,首先需要找出它正在运行的节点:
退出swarm-1机器并使用eval创建环境变量,这些环境变量要求在主机上运行的Docker客户端使用swarm-1上运行的引擎。请注意,这些环境变量告诉客户端使用我们在本章中一直使用的相同的API。
接下来检索构成go-demo-db服务的其中一个容器正在运行的节点。我们已经多次使用过类似的命令,所以不需要更详细地解释它。
$NODE变量的输出如下所示:
在我的笔记本电脑上,正在寻找的容器运行在swarm-2节点。在你的机器上,可能是另一个节点。
现在可以进入节点并获取容器的ID:
ID变量的输出如下:
最后准备获取统计数据。该命令如下:
发送请求后,你将看到持续的统计数据流。当你看够了,请按下Ctrl+C停止。
如果想要实现自己的监控解决方案,流式统计可能是一个非常有用的功能。在许多其他情况下,我们可能希望禁用流式传输并且只获取单个记录集,可以通过将stream参数设置为false来实现这一点。
返回单个统计记录集的命令如下所示:
输出仍然太大,没办法在书中展示出来,因此你需要从屏幕上查看。
我们不会详细介绍统计数据中每个字段的含义,到了监控相关章节才会进行更深入的探索。现在需要注意的是,你可以为集群中的每个容器获取统计信息。
作为练习,创建一个脚本来检索节点上运行的所有容器,遍历虚拟机的所有容器以获取统计信息。
更多信息请参考Docker Remote API v1.24:根据资源使用情况获取容器统计信息(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#get-container-stats-based-on-resource-usage)了解更多信息。
现在某种程度上几乎完成了与Swarm服务相关的基本API请求的探索,因此删除创建的服务:
首先发送删除请求以删除go-demo-db服务,然后请求检索所有服务。后者的输出如下:
服务不复存在,我们从集群中删除了它,因为那是我们创建的唯一一个,检索服务列表的请求返回一个空数组[]。
更多信息请参考Docker Remote API v1.24:删除服务(https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#remove-a-service)以获取更多信息。
最后,退出机器:
现在你对API有了一个基本的了解,下面可以探索一个可能的用例。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。