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:
...
...
{
"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
Technik chroot (Exit Codes with special Meaning)
Docker run Exit Status (Docker reference run)
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