DockerInspect
1、Inspect结果详细信息
docker inspect 7988f914a122
其中7988f914a122是某⼀容器进程的id
{
"Id": "7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70",
"Created": "2017-02-07T05:04:30.305563148Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 19138,
"ExitCode": 0,
"Error": "",
"StartedAt": "2017-02-07T08:11:55.171653409Z",
"FinishedAt": "2017-02-07T06:20:22.462071105Z"
},
"Image": "sha256:93541fa8323099b6be585526fac694ac52063aba1830d6e1e9961594e43f8b88",
"ResolvConfPath": "/var/lib/docker/containers/7f",
"HostnamePath": "/var/lib/docker/containers/7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70/hostname",
"HostsPath": "/var/lib/docker/containers/7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70/hosts",
"LogPath": "/var/lib/docker/containers/7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70/7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70-json.log",        "Name": "/newtomcat7",
"RestartCount": 0,
"Driver": "aufs",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/root/work/docker:/root/hzbtest"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
tcpip详解卷二pdf
},
"NetworkMode": "default",
"PortBindings": {
"5000/tcp": [
{
"HostIp": "",
"HostPort": "5000"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Name": "aufs",
"Data": null
},
"Mounts": [
{
"Source": "/root/work/docker",
"Destination": "/root/hzbtest",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "7988f914a122",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"5000/tcp": {}
},
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": null,
"Cmd": [
"/bin/bash"
],
"Image": "93541fa83230",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "927b5aac94a952453bce87bbb346b3dd573f9af622c8913875ae564161ee3332",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "5000"
}
]
},
"SandboxKey": "/var/run/docker/netns/927b5aac94a9",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "254ea67cfdda5bcafa3504141584f6c8148449f185574bcf1facd0a925416df9",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "4d1bed26364a6c5844e0530e77b37bbe637901ef0579930da6fba5e31484aa61",
"EndpointID": "254ea67cfdda5bcafa3504141584f6c8148449f185574bcf1facd0a925416df9",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
}
很多⽤户都知道docker inspect命令,该命令⽤于获取容器/镜像的元数据,其中-f参数可以⽤于获取指定的数据,例如使⽤docker inspect -f {{.IPAddress}}来获取容器的 IP 地址。不过很多⽤户容易被该特性的语法搞晕,并很少有⼈能将它的优势发挥出来(⼤部分⼈都是通过grep来获取指定数据,虽然有效但⽐较零散混乱)。本⽂将
详细介绍-f参数,并给出⼀些例⼦来说明如何使⽤它。
docker inspect
简单地说,-f的实参是个模版,并在容器/镜像的元数据上以该 Go 模版作为输⼊,最终返回模版指定的
数据。第⼀个问题就是该命令说明⽂档中的⽤词“Go 模版”对于没有 Go 开发经验的⼈来说很模糊——我的第⼀感觉就是它类似恐怖的 C++ 模版。还好 Go 模版和 C++ 模版/泛型毫不相⼲,Go 模版是⼀种,让数据以指定的模式输出。这个概念对于 Web 开发者是⾮常熟悉的,Web 领域有很多模版引擎,⽐如 Jinga2(⽤于和 Flask)、Mustache、JSP 等等,看下⾯的简单⽰例:
$ docker inspect -f 'Hello from container {{.Name}}' jenkins
Hello from container /jenkins
我们可以看到,-f指定了⼀个简单的模式(或称之为模版)并应⽤于容器的元数据。当然,对于元数据,我们也可以什么都不指定:
$ docker inspect -f "This is a bit pointless" jenkins
This is a bit pointless
下⾯让我们来进⼀步看看 Go 模版的奇妙之处,例如我们可以通过模版来查所有退出码为⾮ 0 的容器名:
$ docker inspect -f '{{if ne 0.0 .State.ExitCode }}{{.Name}} {{.State.ExitCode}}{{ end }}' $(docker ps -aq)
/tender_colden 1
/clever_mcclintock 126
/grave_bartik 1
(⽆论是否匹配到,对于每个容器都会输出⼀⾏)
或者在jenkins-data容器中查卷/var/jenkins_home对应在 host 的⽬录:
docker inspect -f '{{index .Volumes "/var/jenkins_home"}}' jenkins-data
/var/lib/docker/vfs/dir/5a6f7b306b96af38723fc4d31def1cc515a0d75c785f3462482f60b730533b1a
上⾯的例⼦可能稍微有点难理解,不过没关系,我们先来了解⼀下 Go 模版的基本⽤法。
模版指令
{{ }} 语法⽤于处理模版指令,⼤括号外的任何字符都将直接输出。
上下⽂
“.” 表⽰“当前上下⽂”。⼤多数情况下表⽰了容器元数据的整个,但在某些情况下可以重新规定上下⽂,⽐如使⽤with函数:
$ docker inspect -f '{{.State.Pid}}' jenkins
6331
$ docker inspect -f '{{with .State}} {{.Pid}} {{end}}' jenkins
6331
可以使⽤$来获取根上下⽂,例如:
$ docker inspect -f '{{with .State}} {{$.Name}} has pid {{.Pid}} {{end}}' jenkins
/jenkins has pid 6331
注意,单独使⽤ “.” 本⾝也是可以的,将输出未格式化的完整元数据:
$ docker inspect -f '{{.}}' jenkins
...
数据类型
inspect 数据可以由浮点数、字符串和布尔组成,可以使⽤ Go 模版内置函数进⾏⽐较判断。虽然 Go 模版⽀持整数,但⽬前 inspect 数据中的数值类型都是浮点数,⽽整数应该对于⼤多数场景更⽅便(详见该)。使⽤字符串时可以使⽤双引号。
数据中不存在的值是不可以⽤来⽐较的:
$ docker inspect -f '{{.ExecIDs}}' jenkins
<no value>
$ docker inspect -f '{{eq .ExecIDs .ExecIDs}}' jenkins
FATA[0000] template: :1:2: executing "" at <eq .ExecIDs .ExecIDs>: error calling eq: invalid type for comparison
数据结构
inspect 数据使⽤ map 以及数组保存。Map 结构⾮常简单,前⾯我们曾经展⽰过,可以通过 . 的链式来访问 map 内部数据:
$ docker inspect -f '{{.State.ExitCode}}' jenkins
不过有些情况(⽐如 map 的键不是字符串)是不能直接使⽤ . ⽅式来获取 map 值的,此时我们可以使⽤index函数,前⾯卷的例⼦可以这样写:
docker inspect -f '{{index .Volumes "/var/jenkins_home"}}' jenkins-data
/var/lib/docker/vfs/dir/5a6f7b306b96af38723fc4d31def1cc515a0d75c785f3462482f60b730533b1a
我们也可以使⽤index来获取指定下标的数组值:
$ docker inspect -f '{{.HostConfig.Binds}}' jenkins
[/var/run/docker.sock:/var/run/docker.sock /usr/bin/docker:/usr/bin/docker]
$ docker inspect -f '{{index .HostConfig.Binds 1}}' jenkins
/usr/bin/docker:/usr/bin/docker
函数
除了index函数,其他很多函数也很常⽤。⽐如逻辑函数and、or可以返回布尔结果。注意,函数是不能放在中间:
$ docker inspect -f '{{and true true}}' jenkins
true
⽽不是:
$ docker inspect -f '{{true and true}}' jenkins
FATA[0000] template: :1:2: executing "" at <true>: can't give argument to non-function true
下⾯是⼀些常⽤的⽐较函数:
eq (等于)
ne (不等于)
lt (⼩于)
le (⼩于等于)
gt (⼤于)
ge (⼤于等于)
我们可以⽤这些函数来⽐较字符串、浮点数或整数:
$ docker inspect -f '{{eq "abc" "abc"}}' jenkins
true
$ docker inspect -f '{{ge 1 -1}}' jenkins
true
$ docker inspect -f '{{lt 4.5 4.6}}' jenkins
true
$ docker inspect -f '{{ne 4.5 4.5}}' jenkins
false
要注意的是操作数类型必须匹配,数字⽐较时使⽤浮点数:
$ docker inspect -f '{{eq "4.5" 4.5}}' jenkins
FATA[0000] template: :1:2: executing "" at <eq "4.5" 4.5>: error calling eq: incompatible types for comparison
$ docker inspect -f '{{gt .State.Pid 1}}' jenkins
FATA[0000] template: :1:2: executing "" at <gt .State.Pid 1>: error calling gt: incompatible types for comparison
$ docker inspect -f '{{gt .State.Pid 1.0}}' jenkins
true
另外,可以使⽤json函数来⽣成 JSON 输出:
$ docker inspect -f '{{json .NetworkSettings.Ports}}' jenkins
{"50000/tcp":null,"8080/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"}]}
我们也可以使⽤⼯具来组合结果:
$ docker inspect -f '{{json .State}}' jenkins-data | jq '.StartedAt'
"2015-03-15T20:26:30.526796706Z"
当然,docker inspect的默认输出结果就是 JSON,所以下⾯这样也可以:
$ docker inspect jenkins-data | jq '.[] | .State.StartedAt'
"2015-03-15T20:26:30.526796706Z"
更多函数请参考,不过很奇怪的是官⽅⽂档中并没有描述json函数(我是从中学到的),你如果知道其中原因,记得告诉我!If 语句
条件语句if可以和前⾯的⽐较函数⼀起使⽤:
$ docker inspect -f '{{if eq .State.ExitCode 0.0}}
Normal Exit
{{else if eq .State.ExitCode 1.0}}
Not a Normal Exit
{{else}}
Still Not a Normal Exit
{{end}}' jenkins
Normal Exit
注意,{{end}}语句必须有,else if和else按需使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。