Daily Docker Inspect

TLDR;

Docker inspect erlaubt es uns, einen Blick in die Tiefen und Untiefen eines Containers zu werfen.

Hierfür starten wir zunächst einen einfachen Container im eigenen Netzwerk, der nichts tut außer warten.

docker network create -d bridge test-bridge
docker volume create test

docker run -d -p 8080:8080 -v test:/test -v /tmp:/tmp/test --network test-bridge --name runner effectivetrainings/runner
# das Portmapping ist völlig unnötig, dient uns nur zur Veranschaulichung von Ports in der inspect-Ausgabe.

Inspizieren wir den laufenden Container, bekommen wir eine ganze Menge Informationen, für die wir üblicherweise gar keine Verwendung haben. Das geht besser.

docker inspect runner
[
    {
        "Id": "cfa659b16d3849515cb32f73d8ec6c16bf0dc291a9fc2e56f8186d6ffb57996c",
        "Created": "2017-01-15T11:18:46.862670763Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "sleep 100000000000000000"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,

Natürlich können wir mit Linux-Boardmitteln wie grep arbeiten.

Beispielsweise im folgenden um die IP-Addresse des Containers zu ermitteln.

docker inspect runner | grep -i ipaddress
     "SecondaryIPAddresses": null,
     "IPAddress": "",
          "IPAddress": "172.18.0.2",

Ideal ist das nicht.. die Ausgabe ist nicht eindeutig und kann beispielsweise keinesfalls maschinell verarbeitet werden. Wie viele Befehle unterstützt docker inspect auch Go-Templates.


Go Templates

Go Templates erlauben das dynamische Formatieren der Ausgabe anhand von einem Template-String. Es gibt schon dutzende Artikel zu diesem Thema. Dieser Artikel möchte nicht auf die Details eingehen, sondern einige Templates vorstellen, die ich tagtäglich verwende.

Wollen Sie tiefer in das Thema Templates einsteigen emfehle ich die Artikel in der Links-Sektion.

Daily Templates

Container Status:
docker inspect -f "{{ .State.Status }}" runner

running
Port Bindings
docker inspect -f "{{json .HostConfig.PortBindings }}" runner

{"8080/tcp":[{"HostIp":"","HostPort":"8080"}]}

docker inspect -f "{{ .Config.ExposedPorts }}" runner

{"8080/tcp":{}}

# Portbindings aller laufender Container
docker ps -q | xargs docker inspect -f "{{json .HostConfig.PortBindings }}"

Environment

docker inspect -f "{{ json .Config.Env}}" runner

["no_proxy=splunk","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
Hostname
docker inspect -f "{{ .Config.Hostname }}" runner

cfa659b16d38
Netzwerke
docker inspect -f "{{ json .NetworkSettings.Networks}}" runner

{
  "test-bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": [
      "cfa659b16d38"
    ],
    "NetworkID": "2f6b0ad02123b64b4e921a007f8cf972942fa18c224b18dd4744232fe87fd4d3",
    "EndpointID": "39aaedf2bc7196952783282f64789df15968c6ce3ce0dcb15dbb554739a4c219",
    "Gateway": "172.18.0.1",
    "IPAddress": "172.18.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:12:00:02"
  }
}
Mounts

Da wir zwei Volumes haben (Host-Binding / Volume) gibt es zwei Mounts, eines vom Typ Volume, eines vom Typ bind.

docker inspect -f "{{ json .Mounts}}"  runner
[
  {
    "Type": "volume",
    "Name": "test",
    "Source": "/var/lib/docker/volumes/test/_data",
    "Destination": "/test",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  },
  {
    "Type": "bind",
    "Source": "/tmp",
    "Destination": "/tmp/test",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

Wollen wir von jedem Element in der Liste nur bestimmte Informationen, beispielsweise eine Liste von Mappings (src ⇒ target) geht das mit dieser Syntax.

docker inspect -f '{{ range .Mounts }}{{.Source}}=>{{.Destination}},{{end}}' runner

/tmp=>/tmp/test /var/lib/docker/volumes/test/_data=>/test,

# Oder mit expliziter Variablendeklaration
docker inspect -f '{{ range $index, $element := .Mounts }}{{$element.Source}}=>{{$element.Destination}}{{end}}' runner

Fazit

Es lohnt sich, sich ein wenig mit Go-Templates zu beschäftigen. Es ist noch viel mehr möglich, aber alleine mit den paar einfachen Templates hier lassen sich schon die meisten Informationen schnell ermitteln, die man so tagtäglich braucht.


Docker Training

Wollen Sie mehr erfahren? Ich biete Consulting / Training für Docker. Schauen Sie doch mal vorbei!