docker CLI还使用API与守护进程进行通信。查找CLI执行哪些请求的简单方法是以调试模式运行守护程序,该守护程序将在守护程序日志中记录API调用。
如果您不想在调试模式下运行常规守护进程,则可以使用docker-in-docker。 Docker Hub上的官方docker
图像(https://hub.docker.com/_/docker/)可用于此目的。
例如,查看Docker 1.13.1守护进程的请求;
首先,用docker 1.13.1启动一个容器;以交互模式启动容器,并提供sh
作为主要命令(这使得它更容易);
docker run -it --rm \
-v /var/lib/docker \
--privileged \
--name my-docker \
docker:1.13.1 \
sh
在容器内,启动在前景中的守护进程(dockerd
);
dockerd --debug --iptables=false
你会看到守护进程启动;
DEBU[0000] Listener created for HTTP on unix (/var/run/docker.sock)
INFO[0000] libcontainerd: new containerd process, pid: 16
DEBU[0000] containerd: read past events count=0
...
...
DEBU[0001] Registering POST, /networks/prune
DEBU[0001] Registering DELETE, /networks/{id:.*}
INFO[0001] API listen on /var/run/docker.sock
一旦守护进程正在运行,打开一个新的外壳。在该shell中,在刚开始使用docker exec
的容器中打开一个新的sh
会话。上面的例子使用my-docker
作为容器名称,所以命令将会是;
docker exec -it my-docker sh
内部的容器,你现在可以运行泊坞窗命令,并且为每个运行将在守护进程的其他shell中输出显示命令所做的API调用。
例如,跑步;
docker network create foobar
在守护程序日志中显示为;
DEBU[0304] Calling GET /_ping
DEBU[0304] Calling POST /v1.26/networks/create
DEBU[0304] form data: {"Attachable":false,"CheckDuplicate":true,"Driver":"bridge","EnableIPv6":false,"IPAM":{"Config":[],"Driver":"default","Options":{}},"Internal":false,"Labels":{},"Name":"foobar","Options":{}}
API调用的主体打印在form data:
之后,并且是;
{
"Attachable": false,
"CheckDuplicate": true,
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Config": [],
"Driver": "default",
"Options": {}
},
"Internal": false,
"Labels": {},
"Name": "foobar",
"Options": {}
}