docker container

Docker Kommandos für Container:

Kommandos

Funktionalität

docker container

Hauptbefehl: Container verwalten

docker attach

I/O eines Containers mit Terminal connecten

docker commit

neues Image aus Container

docker cp

Kopieren von Daten zwischen Container <-> Host

docker create

Container erzeugen, aber nicht starten

docker diff

veränderte Dateien eines Containers erzeugen

docker exec

Kommando in laufendem Container ausführen

docker export

Container in Archiv speichern

docker import

Container aus Archiv erzeugen

docker inspect

Konfiguration und Status eines Containers

docker kill

Container sofort beenden

docker logs

Container-Loggings

docker pause/unpause

Container anhalten/fortsetzen

docker port

Container Ports auflisten

docker ps

Container auflisten

docker rename

Container umbenennen

docker restart

Container neu starten

docker rm

Container löschen

docker run

neuen Container erzeugen und starten

docker start

Container starten

docker stop

Container anhalten

docker top

Container Prozesse anzeigen

docker update

Container Optionen anpassen

docker wait

Container Ende erwarten

docker attach

Auf Container die man mit docker run -it oder docker start -a -i gestartet hat, kann man ja über die interaktive Konsole zugreifen.

Andernfalls kann man mit docker attach diese Funktionalität nachholen.

docker commit

Man sollte besser über Dockerfile und Builds arbeiten, weil sonst die Aufbauten der Images nicht mehr nachvollziehbar sind!

docker cp

Manuelle Kopieren von Daten zwischen Container und Host, was normaler Weise automatisch beim Erzeugen von Images genutzt wird.

echo "Testing" > /tmp/testdatei
docker start alpinejoeb
docker container cp /tmp/testdatei alpinejoeb:/
docker exec alpinejoeb cat /testdatei
docker stop alpinejoeb

docker diff

Abweichungen zwischen Container und ursprünglichem Image auflisten.

  • A (added - hinzugefügt)

  • C (changed - geändert)

  • D (deleted - gelöscht)

docker exec

Befehle in einem laufenden Contaier aufrufen. Der Container muss aktiv sein / laufen.

Wird eine Shell im exec benutzt und mit exit verlassen, dann läuft der Container weiter!

docker export

Beim Exportieren eines Containers werden alle Layer zusammengefasst! Man spricht vom flatten für Image Layer. Das ist beim docker save | load für Images gänzlich anders.

Anm.: Daten in Volumes werden nicht berücksichtigt!

docker images

Bitte auf Plural achten! Tipp: docker images -q listet nur die IDs auf und kann somit gut zum Pipeling für andere Docker-Aufrufe genutzt werden!

docker inspect

Arbeitet mit Images und Containern und erzeugt Infos im JSON-Format.

JSON anzeigen:

docker inspect -s mariadb-test5
...
...
    {
        "Id": "cd42b1a7c4542f76174f936e5a2060f1f87e3511d3fe5e07bb27e15a1ca74ea5",
        "Created": "2019-01-06T19:56:47.958915783Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "mysqld"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-01-06T19:56:48.881461371Z",
            "FinishedAt": "2019-01-06T20:15:04.192413984Z"
        },
...
...

Analyse über Parameter -f (format)

docker inspect -s -f "{{.State.Status}}" mariadb-test5
docker inspect -s -f "{{.State.FinishedAt}}" mariadb-test5

docker ps (kurz für: docker container ps)

Filterung mit Kriterium: -f <Kriterium=Wert>

Filterungs-Schalter aus Hilfen zu den Tools docker-ps bzw. docker-container-ls|ps

Filter output based on these conditions:
- ancestor=(<image-name>[:tag]|<image-id>| image@digest )
  containers created from an image or a descendant.
- before=(<container-name>|<container-id>)
- expose=(<port>[/<proto>]|<startport-endport>/[<proto>])
- exited=<int> an exit code of <int>
- health=(starting|healthy|unhealthy|none)
- id=<ID> a container's ID
- isolation=(default|process|hyperv) (Windows daemon only)
- is-task=(true|false)
- label=<key> or label=<key>=<value>
- name=<string> a container's name
- network=(<network-id>|<network-name>)
- publish=(<port>[/<proto>]|<startport-endport>/[<proto>])
- since=(<container-name>|<container-id>)
- status=(created|restarting|removing|running|paused|exited)
- volume=(<volume name>|<mount point destination>)

Formatierte / tabellarische Ausgaben mit Schalter --format:

docker container ls -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Labels}}"
docker container ls -a --format '{{printf "%-30s%-30s" .Names .RunningFor}}'
# auch hier wieder JSON Formatierung möglich:
docker container ls -a --format '{{json . }}' | jq

Formatierungs-Schalter (siehe Go-Templates) gerne wieder per Hilfen zu den Tools docker-ps bzw. docker-container-ls|ps

Valid placeholders for the Go template are listed below:
- .ID           - Container ID.
- .Image        - Image ID.
- .Command      - Quoted command.
- .CreatedAt    - Time when the container was created.
- .RunningFor   - Elapsed time since the container was started.
- .Ports        - Exposed ports.
- .Status       - Container status.
- .Size         - Container disk size.
- .Names        - Container names.
- .Labels       - All labels assigned to the container.
- .Label        - Value of a specific label for this container.
                  For example '{{.Label "com.docker.swarm.cpu"}}'.
- .Mounts       - Names of the volumes mounted in this container.
- .Networks     - Names of the networks attached to this container.

Exit Status aus Aufruf docker container ps -a

Die Nummern in Angabe Exited (#) von Spalte STATUS beziehen sich auf Exit-Meldungen beim Verlassen, stoppen oder killen eines Containers.

Eigene Docker Exit Return Code:

  • 125 Docker Daemon hat Fehler

  • 126 Container Kommando kann nicht aufgerufen werden

  • 127 Container Kommando konnte nicht gefunden werden

Ansonsten orientiert sich das Exit-Coding an

docker run

Erzeugt und startet einen neuen Container. Dabei wird, falls noch kein Image lokal vorhanden das entsprechende Image erst gepullt - also lokal bereitgestellt!

Bei Image-Namen ohne Tag wird versucht das image:latest genommen!

Siehe auch Extensives Manual für Kondsolentool docker-run!

Optionen

Funktionalität

–cpus=“1.25“

maximal 1,25 CPU Cores

-d

Container im Hintergrund (detached)

-e VAR=value

Variable für Container setzen

-h

Hostname

-i

interaktiv ausführen lassen

-m 512m

Container-RAM auf 512 MiB limitieren

–name cname

Containername

–network nwname

Netzwerk verwenden

-p localport:containerport

Portweiterleitungen zwischen Host und Container

-P

alle Port des Containers mit zufälligen Host-Ports

–rm

Container nach Ausführung löschen

-t

Pseudo-Terminal mit Standardausgabe verbinden

-v containerdir

Containerverzeichnis als Volume

-v vname:cdir

Volume mit Namen erzeugen

-v /localdir:cdir

Host-Dir mit Container-Dir verbinden

–volumes-from cname

Volume eines anderen Containers nutzen

Bemerkung

Enthalten Images keine aktiven Prozesse werden Container-Instanzen nicht am Leben gehalten!

Solche Prozesse (z.B. /bin/bash) müssen natürlich im Image vorhanden sein und direkt und sofort für den Container genutzt werden: also -it und nicht -d!

docker start | stop

Mit Parameter -ai (attach) direkt in eine Shell eines Containers starten: docker start -ai containername

Tipp

Die Container-Instanz wird mit exit beendet! Mit Strg+P Strg+Q läuft Container weiter!

Alle vorhandenen Container stoppen: docker stop $(docker ps -a -q)

Alle gestoppten Container entfernen: docker rm $(docker ps --filter "status=exited")

Oder mit neuem prune (dt.: stutzen, beschneiden) Schalter: docker container prune

docker top

Angelehnt an das top Kommando - hier aber als Einzelausgabe.

Aber der Reihe nach… wir starten erst einmal einen Container: docker start alpine (oder natürlich docker run ...).

CONTAINER ID   IMAGE    COMMAND    CREATED        STATUS        PORTS    NAMES
ba4471eeb783   alpine   "/bin/sh"  10 days ago    Up 17 minutes          alpinejoeb

Analyse auf Docker-Host mit ps axf ergibt (Anm. gekürzt und Umbrüche erzeugt):

1705 ?        Ssl    0:00  \_ docker-containerd
--config /var/run/docker/containerd/containerd.toml
--log-level info

3602 ?        Sl     0:00      \_ docker-containerd-shim -namespace moby
-workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/ba4471eeb783b...

3619 pts/0    Ss+    0:00          \_ /bin/sh

Man erkennt die PIDs für Container und Shell.

Jetzt mal die Prozesse im Container klassisch: docker container exec alpinejoeb ps ax

PID   USER     TIME  COMMAND
  1   root     0:00  /bin/sh
 11   root     0:00  ps ax

Und mit dem docker container top alpinejoeb -x Kommando: (Anm.: -x verkürzte Ausgabe)

PID                 TTY                 STAT                TIME                COMMAND
3619                pts/0               Ss+                 0:00                /bin/sh

Hinweis

Also völlig unterschiedliche Prozess-IDs aus verschiedenen Ansichten! Der erste Prozess im Container hat immer die Container-PID 1.

Prozesse lassen sich jederzeit von außen stoppen (killen).

Test:

# Endlosschleife im Container exec-uten:
docker container exec -d alpinejoeb /bin/sh \
  -c "while true; do echo palimpalim; sleep 1; done"

# Prozess für Schleife im Container ermitteln
docker container exec alpinejoeb ps ax (hier: Schleife mit PID 16)
# Prozess mit Container-PID 16 stoppen
docker container exec kill 16