编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

使用socat来监视Docker API(docker容器监控工具)

wxchong 2024-09-16 07:02:46 开源技术 11 ℃ 0 评论

在某些情况下,也许您想查看docker daemon和docker client之间的通信的数据流;也许您遇到docker命令不像您预期的那样工作;或者您想编写一个自己的docker客户端来使用API与docker daemon交互。在这些情况下,使用socat来查看docker client与docker daemon的交互就非常有用了。

socat是一个十分强大的命令行工具,它允许你在几乎任何类型的两个数据通道之间中继数据,从而可以嗅探到两个数据通道的通信,进行分析。可以把它看成是一个增强版本的netcat。


我们知道docker是典型的client/server架构的程序,通常默认的情况下,docker配置为通过本地的Unix domain socker来通信,如下图:

通过在客户端的请求和服务器的socker之间插入一个proxy Unix domain socker,使用socat,就可以嗅探到客户端和服务器端的通信。注意需要有root或者sudo的权限来使这种方法工作。如下图:

使用如下的命令来建立proxy socket同时用socat进行监听:

$ sudo socat -v UNIX-LISTEN:/tmp/dockerapi.sock UNIX-CONNECT:/var/run/docker.sock 

上面的命令中-v使输出可读,该命令阻塞在前台运行。如果想让命令在后台运行,只需要在命令的结尾添加一个"&"符号。UNIX-LISTEN部分告诉socat在一个Unix socket上进行监听,UNIX-CONNECT告诉socat连接到Docker的Unix socket上。
下面打开另外一个命令行控制台,使用docker client发送一个命令到上面的proxy socket(即/tmp/dockerapi.sock),该socket会由socat将API调用中继到docker server的socket上,并且命令的具体内容会由socat监听到,命令如下:

$ sudo docker -H unix:///tmp/dockerapi.sock ps -a

socat监听到的内容:

> 2024/07/10 20:54:14.149900  length=92 from=0 to=91
HEAD /_ping HTTP/1.1\r
Host: api.moby.localhost\r
User-Agent: Docker-Client/26.1.1 (linux)\r
\r
< 2024/07/10 20:54:14.150454  length=316 from=0 to=315
HTTP/1.1 200 OK\r
Api-Version: 1.45\r
Builder-Version: 2\r
Cache-Control: no-cache, no-store, must-revalidate\r
Content-Length: 0\r
Content-Type: text/plain; charset=utf-8\r
Docker-Experimental: false\r
Ostype: linux\r
Pragma: no-cache\r
Server: Docker/26.1.1 (linux)\r
Swarm: inactive\r
Date: Wed, 10 Jul 2024 12:54:14 GMT\r
\r
> 2024/07/10 20:54:14.151629  length=113 from=92 to=204
GET /v1.45/containers/json?all=1 HTTP/1.1\r
Host: api.moby.localhost\r
User-Agent: Docker-Client/26.1.1 (linux)\r
\r
< 2024/07/10 20:54:14.152650  length=1853 from=316 to=2168
HTTP/1.1 200 OK\r
Api-Version: 1.45\r
Content-Type: application/json\r
Docker-Experimental: false\r
Ostype: linux\r
Server: Docker/26.1.1 (linux)\r
Date: Wed, 10 Jul 2024 12:54:14 GMT\r
Content-Length: 1650\r
\r
[{"Id":"5863ebaa1c8c13d6d90301a27cc60dce290d9713b64f2741ffdb5c05595d79b8","Names":["..."],...}]

可见,docker ps -a命令就是通过对docker server发送一个特定格式的HTTP的GET请求,第21行显示出了这个请求的格式。从第26行开始是docker server的HTTP响应。这样,我们便监听到了docker client和docker server间的实际通信内容。


所以socat不但可以用来debug Docker,而且还可以用于其它任何的网络服务,它是一个非常强大的工具。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表