michelangelus - Fotolia

Wie Sie mit Alpine Linux und Docker leichte Container erstellen

Da Alpine Linux eine sehr spezielle Distribution ist, ist sie nur für wenige Fälle geeignet, zum Beispiel für das Erstellen leichtgewichtiger Container mit Docker.

In jedem Docker-Abbild oder Image werden Basis-OS-Images installiert, aber hier ist manchmal weniger mehr.

Durch die Verwendung eines Thin Images mit weniger als 200 MByte und optimierten Anwendungen können Ressourcen und damit Kosten gespart werden. Ein leichtgewichtiges Images ist auch schneller einsatzbereit als ein größeres, da es schneller bootet.

Die meisten Betriebssystem-Images sind klein und beanspruchen sehr wenig Rechenressourcen. Andere hingegen sind sehr groß – zum Beispiel Windows-Container. Alpine Linux ist eine leichtgewichtige Linux-Distribution, die sich gerade wegen ihrer geringen Größe gut für Docker-Container eignet.

In diesem Artikel über Docker und Alpine Linux erklären wir Schritt für Schritt, wie man einen Nginx Webserver erstellt. Anhand dieses Beispiels können wir zeigen, wie klein Alpine-Linux-Container sind. Es ist jedoch zu beachten, dass das Container-Image, das wir in diesem Beitrag erstellen, noch nicht für den produktiven Einsatz bereit ist.

Das Betriebssystem Alpine Linux

Wie Abbildung 1 zeigt, kann ein Container-Image mit Alpine OS weniger als sechs MByte groß sein. Das ist deutlich kleiner als beispielsweise ein vergleichbares Image mit Ubuntu.

Größenvergleich der Images mit Ubuntu und Alpine Linux
Abbildung 1: Hier sehen Sie einen Größenvergleich der Images mit Ubuntu und Alpine Linux.

Alpine Linux ist sehr minimalistisch. Es bietet nicht die Annehmlichkeiten der meisten Basis-Images, wie zum Beispiel eine grafische Benutzeroberfläche (GUI) oder systemd. Administratoren können daher ihre aktuelle OS-Konfiguration nicht einfach austauschen – zum Beispiel Ubuntu gegen Alpine Linux.

Arbeiten mit Alpine Linux

Ein offizielles Image von Alpine Linux mit verschiedenen Tags für die entsprechenden veröffentlichten Versionen ist verfügbar. Standardmäßig gibt es nur ein root-Konto.

BusyBox ist bereits in Alpine Linux enthalten. Dabei handelt es sich um eine Sammlung von Unix-Utilities. Wenn Sie nun ein Basis-Image von Alpine Linux ausführen möchten, tun Sie das mit dem Befehl docker run und den entsprechenden Flags, um Alpine zu initialisieren und zu benennen. Geben Sie /bin/sh an, um eine BusyBox-Shell auszuführen:

docker run -i -t alpine /bin/sh
Start eines rudimentären Docker-Containers
Abbildung 2: Starten Sie so einen rudimentären Docker-Container mit der Basis Alpine Linux.

Die Standardkonfiguration mit BusyBox ist recht einfach. Wenn Sie jedoch die Unix-Shell Bash verwenden möchten, verwenden Sie apk. Das ist der Paketmanager von Alpine. Sie fügen Bash in die Docker-Datei ein, indem Sie den Befehl apk add bash ausführen. Der Befehl apk wird allgemein zum Hinzufügen von Paketen verwendet.

Weisen Sie nun den Container an, die Bash in der Konfiguration zu verwenden. Diesmal nutzen Sie /bin/bash statt /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 durch. Weitere Details zu Paketen und Konfigurationen finden Sie hier.

Es gibt viele Webserver, die mit Alpine Linux in einem Docker-Container betrieben werden können. Der kleinste, leichteste und wahrscheinlich schnellste ist Nginx. Wenn Sie Nginx installieren wollen, tun Sie das mit mit apk add nginx.

Mit apk stehen alle Werkzeuge zur Verfügung, um eine Docker-Datei für das Container-Image zu erstellen. Die folgende, sehr kleine Docker-Datei zeigt eine grundlegende Konfiguration. Die benötigten Dateien werden kopiert. Um den Vorgang für den Leser verständlicher zu machen, führen wir im folgenden Beispiel mehrere RUN-Befehle nacheinander aus, anstatt sie wie in der Praxis üblich zu kombinieren.

Zunächst wird ein kleineres Image erstellt:

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 aus, um den Webserver zu starten. Es gibt nicht wirklich viel zu sehen, da wir die Nginx-Konfiguration ausgelassen haben.

Alpine Linux verwendet das Servicemanagementsystem OpenRC. Es ist jedoch nur optional und nicht zwingend in den Docker-Images enthalten. Man braucht es auch nicht unbedingt: Da OpenRC sowieso nur diese eine Aufgabe erfüllt, ist es nicht zu viel Aufwand, es in den Nginx-Binärdateien nur über die Kommandozeile (CLI) laufen zu lassen.

Wie es weiter geht

Mit den Informationen aus unserem Beitrag können Sie bereits einen Container starten. Dieser ist allerdings noch nicht für den produktiven Einsatz geeignet. Wir haben lediglich ein funktionierendes Alpine-Linux-Image mit einem einfachen Nginx-Server erstellt, der die Standardwebseite anzeigt. Sie können nun diese Docker-Datei anpassen und ein maßgeschneidertes Image für Tests und den produktiven Einsatz erstellen.

Wie Sie das Image verwenden, bleibt Ihnen überlassen. Sie können beispielsweise HTML-Quelldateien in das Image kopieren. Die Dateien können aber auch ein eigenständiger Satz sein – zum Beispiel HTML und JavaScript – der über das Netzwerk eingebunden wird. In dieser Konfiguration ist das Konstrukt etwas robuster, aber das Container-Image muss bei jeder Änderung des Quellcodes neu generiert werden.

Wie bereits erwähnt, können IT-Teams nicht einfach von Ubuntu oder einer anderen Distribution auf Alpine Linux umsteigen und erwarten, dass alles reibungslos funktioniert. In manchen Fällen benötigt man jedoch besonders kleine und leichtgewichtige Container. Dann sind Alpine-Linux-Container genau das Richtige.

Erfahren Sie mehr über Containervirtualisierung