Von Docker zu Buildah – Cheatsheet

Von:
Datum: 28. Mai 2021

Bei der Migration von Docker zu ContainerD ändert sich nicht nur der Name sondern auch die Kommandozeilenaufrufe. Die Docker-Images bleiben kompatibel und können in ContainerD ausgeführt werden.

Docker – ContrainerD/Buildah Migration Cheatsheet – Wichtige Kommandos

Im Folgenden findest du eine Gegenüberstellung der wichtigsten Kommandos von Docker und ContainerD einander gegenübergestellt.

Weitere Unterschiede

ContainerD benutzt Namespaces um Zugriffsrechte verwalten zu können. Daher muss immer auch ein Namespace angegeben werden, auf den sich der aktuelle Befehl bezieht. Aus Convenience Gründen empfiehlt sich die folgende Erweiterung des lokalen Environments:

alias CTR="ctr -n k8s.io"

Mit dieser Konfiguration könnten die Aufrufe in diesem Cheatsheet verkürzt werden. Um die Kommandozeilen

Bei einem Pull der Images ist bei ContainerD stets eine Version anzugeben. Im Gegensatz zu Docker wird bei fehlender Versionsnummer nicht "latest" angenommen.

Lokale Daten von ContainerD werden unter den Verzeichnissen /var/lib/containerd/ und /run/containerd/ abgelegt.

Login und Pull

Einloggen in den jeweiligen Imagehub, und herunterladen der Images.

Docker:

docker login registry.predic8.de docker pull registry.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io image pull -u USER:PASSWORD registry.predic8.de/p8/xyz:10

Image Export

Bereitstellen des Images aus dem lokalen Hub.

Docker:

docker save -o imager.tar hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io image export image.tar hub.predic8.de/p8/xyz:10

Images auflisten

Ausgabe der aktuell im Namespace befindlichen Images.

Wichtig ist hier zu beachten, dass ContainerD und Buildah separate Speicher verwenden, das heißt ein mit Docker oder Buildah gebautes Image steht nicht direkt in ContainerD zur Verfügung.

Docker:

docker images

ContainerD:

ctr -n k8s.io images list

Container Stop

Ausgabe der aktuell laufenden Container. Heraussuchen der ID des zu stoppenden Containers und stoppen des Containers.

Docker:

docker ps CONTAINER_ID = … #pick one docker stop $CONTAINER_ID

ContainerD:

ctr -n k8s.io t list TASK_ID=… #pick one ctr -n k8s.io t kill [-s 9] $TASK_ID

Container entfernen

Ausgabe der aktuell laufenden Container. Heraussuchen der ID des zu entfernenden Containers und entfernen des Containers.

Docker:

docker ps CID = … #pick one docker rm $CID

ContainerD:

ctr -n k8s.io c list TID=… #pick one ctr -n k8s.io c rm $TID

Image starten

Neuen Container starten basierend auf dem Image p8/xyz:10.

Docker:

docker run hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run hub.predic8.de/p8/xyz:10 xyz-container

Container nach Stop entfernen

Entfernt Container automatisch, sobald diese gestoppt sind.

Docker:

docker run –-rm hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run –-rm hub.predic8.de/p8/xyz:10 xyz-container

Container im gleichen Netzwerk laufen lassen wie den Host

Wenn mehrere Container auf einem System laufen sollen, welche untereinander kommunizieren, vereinfacht diese Konfiguration die Kommunikation der Container untereinander.

Docker:

docker run –-net=host hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run –-net-host hub.predic8.de/p8/xyz:10 xyz-container

Environmentvariable für den Container setzen

Häufige Variante die im Container laufende Software von außen zu konfigurieren.

Docker:

docker run –e KEY=VALUE hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run –-env KEY=VALUE hub.predic8.de/p8/xyz:10 xyz-container

Privilegierter Container

Einen Container mit privileged Rechten zu starten sollte wohl überlegt sein, da dies dem Container auf dem jeweiligen System Root Rechte einräumt.

Docker:

docker run --privileged hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run --privileged hub.predic8.de/p8/xyz:10 xyz-container

Verzeichnis in den Container mounten

Auf diese Weise kann ein Container Daten auf Daten außerhalb des eigenen Containers zugreifen, bzw Daten direkt auf die Festplatte/Storage Lösung des Hostsystems schreiben. Dies dient meist dazu, die durch die jeweilige Anwendung geschriebenen Daten über die Lebenszeit des Containers hinaus zu erhalten.

Docker:

docker run –-v /dir/in/host:/dir/in/container:rw hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run --mount type=bind,src=/dir/in/host,dst=/dir/in/container,options=rbind:rw hub.predic8.de/p8/xyz:10 xyz-container

Container detached starten

In der Regel werden Container gestartet, um längere Zeit zu existieren, und nicht automatisch geschlossen werden, wenn die Shell beendet wird, welche den jeweiligen Container gestartet hat. Diese Container werden detached gestartet, das heißt sie laufen nicht auf der Konsole, sondern im Hintergrund.

Docker:

docker run -d hub.predic8.de/p8/xyz:10

ContainerD:

ctr -n k8s.io run -d hub.predic8.de/p8/xyz:10 xyz-container

Image entfernen

Images vom lokalen Rechner entfernen.

Docker:

docker rmi $IMAGE

ContainerD:

ctr -n k8s.io images rm $IMAGE

Auf das Container Log zugreifen

Ein laufender Docker Prozess produziert entsprechende Ausgaben auf der Konsole auf Stdout und Stderr. Diese können bei Docker durch die Benutzung des Log Commands eingesehen werden.

Docker:

docker logs $CID

ContainerD:

-

Ein ähnlicher Vorgang ist mit ContainerD nicht möglich. Den Befehl zum Abruf der Logs eines laufenden Containers ist nicht möglich. Wie mit dem Log eines Containers verfahren wird, ist abhängig davon, wie der Container gestartet wird.

Wird keine Option spezifiziert, so wird das Log standardmäßig auf die Konsole des CTR Prozesses ausgegeben.

Bei Containern die durch das Kubelet, also Kubernetes gestartet werden, werden die Logs unter /var/log/pods/${NAMESPACE}_${POD_NAME}-${POD_UUID}/${CONTAINER_NAME}/${RESTART_COUNT}.log abgelegt.

In dieser Datei befinden sich einzelne Log-Zeilen, welche den Timestamp, den Output-Kanal, sowie die eigentliche Log Zeile beinhaltet. Damit kann zu jeder Zeit bestimmt werden, ob es sich um eine Ausgabe auf Stdout oder Stderr handelt.