Docker客户端和守护进程
Docker的CS模式
在Docker的实现机制中,有两个重要的概念,“Docker客户端”和“Docker守护进程”。“Docker守护进程”运行在宿主计算机上,在CS模式中充当Server的角色,它为“Docker客户端”提供服务,并且完成Docker中的各项任务。
sequenceDiagram
用户->>Docker客户端: 命令行指令
Docker客户端->>Docker守护进程: 执行指令
Docker守护进程->>Docker客户端: 执行结果
Docker客户端->>用户: 命令行输出
除了“Docker客户端”这个最主要的与“Docker守护进程”交互的方式外,Docker还提供了RESTful风格的“Remote API”,这就意味着我们可以通过编写程序,调用这些API来将自己的程序与Docker进行集成。“Remote API”在某些复杂的情况下,也支持“STDIN”、“STDOUT”以及“STRERR”的通讯机制进行交互。
sequenceDiagram
用户->>自定义程序: 程序输入
自定义程序->>Docker守护进程: Remote API
Docker守护进程->>自定义程序: 执行结果
自定义程序->>用户: 程序输出
Docker Remote API Reference:
https://docs.docker.com/engine/reference/api/docker_remote_api/
连接方式
“Docker客户端”和“Docker守护进程”是通过socket进行连接的,官方提供了三种进行连接的模式:
- unix:///var/run/docker.sock
- tcp://host:port
- fd://socketfd
其中,“unix”模式是默认提供的,我们来验证一下:
schen@scvmu01:~$ ps -ef | grep docker
root 1106 1 0 21:14 ? 00:00:04 /usr/bin/dockerd -H fd://
root 1224 1106 0 21:15 ? 00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
schen 1603 1582 0 22:03 pts/0 00:00:00 grep --color=auto docker
schen@scvmu01:~$
schen@scvmu01:~$ docker version
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Thu Aug 18 05:33:38 2016
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Thu Aug 18 05:33:38 2016
OS/Arch: linux/amd64
schen@scvmu01:~$
schen@scvmu01:~$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Sep 7 21:14 /var/run/docker.sock
schen@scvmu01:~$
schen@scvmu01:~$ nc -U /var/run/docker.sock
GET /info HTTP/1.0
HTTP/1.0 200 OK
Content-Type: application/json
Server: Docker/1.12.1 (linux)
Date: Thu, 17 Nov 2016 12:16:25 GMT
Content-Length: 1874
{
"ID":"VVPW:WOIW:TCPI:YDUG:J67N:5DHU:WSWW:RMMN:64FK:KNHO:NPPH:ATSL","Containers":26,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":26,"Images":44,"Driver":"aufs","DriverStatus":[["Root Dir","/var/lib/docker/aufs"],["Backing Filesystem","extfs"],["Dirs","83"],["Dirperm1 Supported","true"]],"SystemStatus":null,"Plugins":{
"Volume":["local"],"Network":["host","bridge","null","overlay"],"Authorization":null},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":14,"OomKillDisable":true,"NGoroutines":22,"SystemTime":"2016-11-17T20:16:25.663603424+08:00","ExecutionDriver":"","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"4.4.0-45-generic","OperatingSystem":"Ubuntu 16.04 LTS","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{
"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{
"docker.io":{
"Name":"docker.io","Mirrors":null,"Secure":true,"Official":true}},"Mirrors":null},"NCPU":1,"MemTotal":512176128,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"scvmu01.shichen.org","Labels":null,"ExperimentalBuild":false,"ServerVersion":"1.12.1","ClusterStore":"","ClusterAdvertise":"","SecurityOptions":["apparmor","seccomp"],"Runtimes":{
"runc":{
"path":"docker-runc"}},"DefaultRuntime":"runc","Swarm":{
"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"",