kalafoto - stock.adobe.com
Mit Docker und Alpine Linux leichte Container erstellen
Alpine Linux ist eine sehr spezielle Distribution und eignet sich nur in ganz bestimmten Fällen. Das Erstellen leichtgewichtiger Container mit Docker ist jedoch einer davon.
Geht es um Docker, ist weniger manchmal mehr. Das gilt vor allen Dingen für die Basis-OS-Images, die in jedem Docker-Abbild oder Image installiert sind.
Verwenden Sie ein leichtgewichtiges Image mit weniger als 200 MByte und optimierte Applikationen, können Sie dadurch Ressourcen und somit Kosten sparen. Ein leichtgewichtiges Image ist außerdem schneller einsatzbereit als ein größeres, weil es zügiger startet.
Die meisten Betriebssystem-Images sind klein und belegen sehr wenig Computing-Ressourcen. Andere sind hingegen sehr umfangreich – zum Beispiel Windows-Container. Alpine Linux ist eine leichtgewichtige Linux-Distribution, die sich eben aufgrund ihrer geringen Größe gut für Docker-Container eignet.
In diesem Beitrag über Docker und Alpine Linux erklären wir Schritt für Schritt, wie Sie einen Nginx Webserver erstellen. Anhand dieses Beispiels können wir demonstrieren, wie klein Alpine-Linux-Container sind. Dabei gilt es jedoch zu beachten, dass das Container-Image, das wir in diesem Beitrag erstellen, noch nicht bereit für einen produktiven Einsatz ist.
Alpine Linux als Betriebssystem
Wie Abbildung 1 zeigt, kann ein Container-Image mit Alpine OS weniger als 6 MByte groß sein. Das ist wesentlich kleiner als zum Beispiel ein vergleichbares Image mit Ubuntu.
Alpine Linux ist extrem minimalistisch. Es bietet nicht die Annehmlichkeiten der meisten Basis-Images, wie zum Beispiel eine grafische Benutzeroberfläche (Graphic User Interface, GUI) oder systemd. Administratoren können also ihre aktuelle OS-Konfiguration nicht einfach austauschen – zum Beispiel Ubuntu gegen Alpine Linux.
Wie man mit Alpine Linux arbeitet
Ein offizielles Image von Alpine Linux, inklusive verschiedener Tags für die entsprechenden veröffentlichten Versionen ist verfügbar. Standardmäßig existiert nur ein root-Konto.
BusyBox ist in Alpine Linux bereits enthalten. Dabei handelt es sich um einen Satz Unix-Utilities. Wollen Sie nun ein Basis-Image von Alpine Linux ausführen, erledigen Sie das mit dem Befehl docker run und den entsprechenden Flags, um Alpine zu initialisieren und zu bezeichnen. Spezifizieren Sie /bin/sh um eine BusyBox-Shell auszuführen:
docker run -i -t alpine /bin/sh
Die Standardkonfiguration mit BusyBox ist recht schnörkellos. Wollen Sie aber die Unix-Shell Bash ausführen, verwenden Sie apk. Das ist der Paketmanager von Alpine. Sie fügen Bash in der Docker-Datei hinzu, indem Sie den Befehl apk add bash ausführen. Der Befehl apk dient allgemein dem Hinzufügen von Paketen.
Teilen Sie dem Container nun mit, die Bash in der Konfiguration zu benutzen. Diesmal verwenden Sie /bin/bash anstelle von /bin/sh:
sudo docker run -i -t alpine /bin/bash
Sie entfernen Pakete mit apk del <Paket>. Um ein Paket zu finden, führen Sie einfach eine Suche mit apk aus. Sie finden hier weitere Details zu Paketen und Konfigurationen.
Es gibt viele Webserver, die mit Alpine Linux in einem Docker-Container betrieben werden können. Der kleinste, leichteste und vermutlich schnellste ist Nginx. Wollen Sie Nginx installieren, erledigen Sie das mit apk add nginx.
Mit apk stehen Ihnen alle Werkzeuge zur Verfügung, um eine Docker-Datei für das Container-Image zu erstellen. Die nachfolgende und sehr kleine Docker-Datei zeigt eine grundsätzliche Konfiguration. Die notwendigen Dateien werden kopiert. Um den Prozess für den Leser verständlicher zu machen, führen wir im nachfolgenden Beispiel mehrere RUN-Befehle hintereinander aus, statt sie wie in der Praxis üblich zu kombinieren.
Wir beginnen mit dem Erstellen eines kleineren Images:
FROM alpine:latest
LABEL maintainer="[email protected]"
RUN apk add nginx
RUN mkdir -p /run/nginx
RUN touch /run/nginx/nginx.pid
RUN adduser -D -g 'www' www
RUN mkdir /www
RUN chown -R www:www /var/lib/nginx
RUN chown -R www:www /www
COPY nginx.conf /etc/nginx/nginx.conf
COPY index.html /www
RUN ["./usr/sbin/nginx"]
Die Docker-Datei reicht bereits aus, um den Webserver zu starten. Viel gibt es jedoch nicht gerade zu sehen, da wir die Nginx-Konfiguration außenvorgelassen haben.
Alpine Linux nutzt das Servicemanagementsystem OpenRC. Es ist jedoch nur optional und nicht zwingend in Docker-Images vorhanden. Sie benötigen es auch nicht unbedingt: da OpenRC ohnehin nur diese eine Aufgabe erfüllt, ist es nicht zu viel Aufwand, es in Nginx-Binärdateien nur über die Kommandozeile (Command Line Interface, CLI) auszuführen.
Wie geht es weiter?
Mit den Informationen aus unserem Beitrag können Sie bereits einen Container starten. Dieser ist aber noch nicht für den produktiven Einsatz geeignet. Wir haben lediglich ein funktionierendes Alpine-Linux-Image mit einem schlichten Nginx-Server erstellt, der die Standardwebseite anzeigt. Sie können diese Docker-Datei nun anpassen und ein maßgeschneidertes Image für Tests oder produktive Einsätze erstellen.
Wie Sie das Image nutzen ist Ihre Entscheidung. Sie können zum Beispiel HTML-Quelldateien in das Image kopieren. Die Dateien können aber auch ein alleinstehender Satz – beispielsweise HTML und JavaScript – sein, die über das Netzwerk eingebunden sind. In dieser Konfiguration ist das Konstrukt zwar etwas robuster, aber das Container-Image muss bei jeder Änderung des Quellcodes neu generiert werden.
Wie bereits erwähnt können IT-Teams die Basis von Ubuntu oder einer anderen Distribution nicht einfach auf Alpine Linux umstellen und dann erwarten, dass alles reibungslos funktioniert. In manchen Fällen benötigen Sie jedoch besonders kleine und leichtgewichtige Container. Das ist dann die richtige Situation für Alpine-Linux-Container.