OCI-Container ohne Overhead

Buildah: Einfach und schnell Container ohne Docker erstellen

William Henry

© Shutterstock / WilleeCole Photography

Linux-Container gewinnen für die moderne Unternehmens-IT immer mehr an Bedeutung. Entwickler müssen deshalb möglichst unkompliziert containerisierte Applikationen erstellen können. Einen einfachen Container-Bau unterstützt Buildah – ohne den Overhead, den Docker erfordert. Ein ähnliches Konzept verfolgt Google Jib.

Linux-Container bieten eine effiziente Möglichkeit für die Entwicklung und Bereitstellung neuer Applikationen. Container-Technologien paketieren und isolieren Apps zusammen mit der gesamten Laufzeitumgebung. Die Container sind damit schnell betriebsbereit und einfacher portierbar als herkömmliche Anwendungen, da sie die komplette Applikationsumgebung enthalten.

Zwei Punkte sind im Container-Umfeld von hoher Relevanz. Zum einen entwickeln sich die Linux-Container-Technologien kontinuierlich weiter, vor allem die Open Container Initiative (OCI) treibt Innovationen maßgeblich voran. Und zum anderen gibt es bezüglich der Linux-Container-Architektur nach wie vor einige Missverständnisse. Folgende Klarstellungen sind wichtig: Container laufen nicht auf Docker. Container sind Prozesse und laufen auf dem Linux-Kernel. Container sind deshalb Linux. Außerdem ist der Docker-Daemon nur einer von vielen User-Space-Tools und Bibliotheken, der mit dem Linux-Kernel kommuniziert, um Container zu erstellen.

Für beide Punkte liefert Buildah ein hervorragendes Beispiel: bei der Erstellung von Containern und für die innovative Weiterentwicklung. Buildah ermöglicht das Erstellen von Containern ohne Docker, das heißt mit Buildah können Docker- und OCI-konforme Container-Images realisiert werden, ohne dass ein Container Runtime Daemon laufen muss.

In der Regel müssen Entwickler zum Erstellen eines Linux-Container-Images eine Reihe von Tools und Daemons nutzen. Das Kommandozeilenwerkzeug Buildah hingegen beschränkt sich auf die Basisanforderungen zur Erstellung oder Modifizierung von Container Images und basiert dabei auf dem entsprechenden OCI-Standard. Aufbauend auf Open-Source-basierten containers/image– und containers/storage-Projekten (auf GitHub) bietet Buildah ein einfaches Command Line Interface (CLI) für die Erstellung OCI-konformer Images. Buildah vereinfacht damit die Container-Build-Pipeline entscheidend.

DevOpsCon Istio Cheat Sheet

Free: BRAND NEW DevOps Istio Cheat Sheet

Ever felt like service mesh chaos is taking over? Then our brand new Istio cheat sheet is the right one for you! DevOpsCon speaker Michael Hofmann has summarized Istio’s most important commands and functions. Download FOR FREE now & sort out your microservices architecture!

Buildah unterstützt einfache Container-Erstellung

Die Verwendung von Buildah unterscheidet sich von der Image-Erstellung mit Docker in einigen Punkten entscheidend. Buildah kann etwa einen Container unter Verwendung eines Container Images und Dockerfiles erstellen oder auch mit einem leeren Image gestartet werden. Darüber hinaus besteht die Möglichkeit, externe Packaging Tools zu nutzen – anstatt eines Package Managers innerhalb des Images selbst. Der Grund dafür ist, dass man Buildah auch unter Verwendung eines vorhandenen Images innerhalb eines laufenden Containers (ähnlich wie bei Docker) nutzen oder ein Image direkt auf dem Storage-Volume (containers/storage) ohne Betrieb eines Containers erstellen kann. Docker erfordert einen laufenden Container, Buildah nicht.

Die Verwendung von Buildah führt im Vergleich zum Erstellen von Images mit dem Docker-Kommando zu mehreren Vorteilen:

  • Reduzierte Größe des erstellten Images.
  • Höhere Sicherheit des Images, da die für die Erstellung des Containers genutzte Software wie gcc, make und dnf nicht im Image enthalten ist.
  • Reduzierter Ressourcenbedarf für das Verschieben von Images, da sie kleiner sind.
  • Möglichkeit zur Erstellung eines Single Layer Images, das besser auf Test- und Produktionsumgebungen angepasst werden kann.
  • Besseres Secrets Handling für Subskriptionen oder Credentials für die Sicherung von Registrys

Generell bietet Buildah eine große Optionsvielfalt für die Erstellung und Bearbeitung von Containern, so gibt es mehr als ein Dutzend Möglichkeiten für die Verwendung des Buildah-Kommandos. Zu den wichtigsten Kommandos und Aktivitäten gehören:

  • Erstellen eines Containers von einem anderen Image oder von Grund auf neu: Erstellen eines neuen Containers (Container Root Filesystems) auf Basis eines vorhandenen Basis-Images (buildah from <imagename>) oder von Grund auf neu (buildah from scratch).
  • Erstellen eines Containers aus einem Dockerfile: Nutzung eines Dockerfiles für den Bau eines neuen Container Images (buildah bud).
  • Informationsabfragen zu Containern oder Images: Prüfen von Metadaten, die mit dem Container oder Image verbunden sind (buildah inspect).
  • Mounten eines Containers: Mounten eines Container Root Filesystems auf dem Host, um Inhalte hinzuzufügen oder zu ändern (buildah mount).
  • Gestaltung eines neuen Container Layers: Nutzung der Inhalte eines Container Root Filesystems als Layer des Dateisystems, um Inhalte einem neuen Image hinzuzufügen (buildah commit).
  • Löschen eines Containers oder eines Images: Entfernen eines Containers (buildah rm) oder eines Container Images (buildah rmi).

Neue Container mit Buildah schnell erstellen

Anstatt mit einem Basis-Image zu starten, kann mit Buildah ein neuer Container ohne Inhalt und mit nur wenigen Container-Metadaten erstellt werden, ein sogenannter Scratch Container. Ein Script auf GitHub, genannt buildah_intro.sh, zeigt das Erstellen eines Buildah-Containers unter Verwendung von Podman sowie die Docker-Kompatibilität. Das Beispiel belegt auch, dass kein Docker Daemon benötigt wird.

Ein weiteres Beispiel, in dem ein Web-Service (httpd) einem Container hinzugefügt und ablauffähig konfiguriert wird, verdeutlicht die einfache Vorgehensweise. Im Beispiel wird gezeigt, wie ein Image erzeugt wird, sodass es vom lokalen Docker-Service direkt verwaltet werden kann. Der Docker Daemon ist hierbei lokal in /var/lib/docker gespeichert.

Wir starten mit dem Erstellen eines Scratch Containers:

# buildah from scratch

working-container

Dann erzugen wir einen leeren Container, der folgendermaßen gemountet werden kann:

# scratchmnt=$(buildah mount working-container)
# echo $scratchmnt /var/lib/containers/storage/devicemapper/mnt/cc92011e9a2b077d03a97c0809f1f3e7fef0f29bdc6ab5e86b85430ec77b2bf6/rootfs

Nun folgt die Initialisierung einer RPM-Datenbank im Scratch Image und das Hinzufügen eines Red Hat Release Packages, das weitere erforderliche Dateien für den RPM-Einsatz enthält:

# rpm --root $scratchmnt –initdb
# yum install yum-utils       (if not already installed)
# yumdownloader --destdir=/tmp redhat-release-server
# rpm --root $scratchmnt -ihv /tmp/redhat-release-server*.rpm

Dann installieren wir den httpd-Service in das Scratch-Verzeichnis…

# yum install -y --installroot=$scratchmnt httpd

… und fügen Text in eine index.html-Datei im Container für spätere Tests hinzu:

# echo "Your httpd container from scratch worked." > $scratchmnt/var/www/html/index.html

Optionen von buildah config werden genutzt, um den httpd-Daemon „by default“ ablaufen zu lassen, wenn der Container gestartet wird:

# buildah config --entrypoint "/usr/sbin/httpd -DFOREGROUND" working-container
# buildah config --port 80/tcp working-container
# buildah commit working-container docker-daemon:myhttpd:latest

Durch Standardeinstellung fügt das Kommando buildah commit den docker.io-Repository-Namen dem Image-Namen hinzu und kopiert das Image in den Storage-Bereich des lokalen Docker Services (/var/lib/docker). Ab jetzt kann die Image-ID für den Betrieb des neuen Images als Container mit dem docker-Kommando genutzt werden:

# docker images

REPOSITORY          TAG      IMAGE ID       CREATED         SIZE
docker.io/myhttpd   latest   47c0795d7b0e   9 minutes ago   665.6 MB

# docker run -p 8080:80 -d --name httpd-server 47c0795d7b0e
# curl localhost:8080

Your httpd container from scratch worked.

Fazit

Das Beispiel verdeutlicht, wie schnell und komfortabel ein Container mit Buildah zu erstellen ist – und zwar ohne Container Runtime oder Daemon. Da Buildah keinen Daemon erfordert, ist aber nicht nur das Erstellen von Containern einfacher, sondern auch der Betrieb, denn so muss keine spezielle Infrastruktur auf dem Host bereitgestellt werden.

Abgesehen vom Container-Bau und -Betrieb spricht aber noch eine weiterer Punkt für Buildah: Es ist ein Kommandozeilenwerkzeug (CLI). Dadurch können es Entwickler auch wesentlich einfacher in bereits vorhandene Pipelines für die Applikationserstellung integrieren.

Verwandte Themen:

Geschrieben von
William Henry

William Henry ist Senior Consulting Engineer bei Red Hat.

Kommentare

Hinterlasse einen Kommentar

1 Kommentar auf "Buildah: Einfach und schnell Container ohne Docker erstellen"

avatar
4000
  Subscribe  
Benachrichtige mich zu:
Sebastian Mendel
Gast

buildah hat bestimmt Vorteile, aber die, die hier aufgezählt wurden, sind ebenso mit Docker umsetzbar, und sollten sie auch in jedem ordentlichen Image.