设为首页 收藏本站
查看: 814|回复: 0

[经验分享] Docker Inspect

[复制链接]

尚未签到

发表于 2017-12-5 16:32:42 | 显示全部楼层 |阅读模式
  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/7988f914a122197035d687eebe0c9e31d69f84bb7b14d976a3fbb030d4d98f70/resolv.conf",
"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": {}
},
"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,
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 用户都知道 docker inspect 命令,该命令用于获取容器/镜像的元数据,其中 -f 参数可以用于获取指定的数据,例如使用 docker inspect -f {{.IPAddress}} 来获取容器的 IP 地址。不过很多用户容易被该特性的语法搞晕,并很少有人能将它的优势发挥出来(大部分人都是通过 grep 来获取指定数据,虽然有效但比较零散混乱)。本文将详细介绍 -f 参数,并给出一些例子来说明如何使用它。

docker inspect
  简单地说,-f 的实参是个 Go 模版,并在容器/镜像的元数据上以该 Go 模版作为输入,最终返回模版指定的数据。第一个问题就是该命令说明文档中的用词“Go 模版”对于没有 Go 开发经验的人来说很模糊——我的第一感觉就是它类似恐怖的 C++ 模版。还好 Go 模版和 C++ 模版/泛型毫不相干,Go 模版是一种模板引擎,让数据以指定的模式输出。这个概念对于 Web 开发者是非常熟悉的,Web 领域有很多模版引擎,比如 Jinga2(用于 Python 和 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 数据中的数值类型都是浮点数,而整数应该对于大多数场景更方便(详见该Issue)。使用字符串时可以使用双引号。
  数据中不存在的值是不可以用来比较的:

$ 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
0
  不过有些情况(比如 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  函数,其他很多函数也很常用。比如逻辑函数 andor 可以返回布尔结果。注意,函数是不能放在中间:

$ 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"}]}
  我们也可以使用 jq 工具来组合结果:

$ 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"
  更多函数请参考 Go 官方文档,不过很奇怪的是官方文档中并没有描述 json 函数(我是从 Nathan LeClaire’s blog 中学到的),你如果知道其中原因,记得告诉我!

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 ifelse 按需使用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-420880-1-1.html 上篇帖子: 【原创】 Docker 中 运行 ASP.NET Core 站点 下篇帖子: Docker日志收集最佳实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表