Docker/Buch/08 Alpine Linux
Docker/Buch/08 Alpine Linux
Beschreibung
Alpine Linux
Als Basis für Container kommen alle möglichen Linux-Distributionen zum Einsatz: Debian, Fedora, Ubuntu etc. Im Mittelpunkt dieses Kapitels steht aber eine Linux- Distribution, die außerhalb der Container-Welt (und eventuell im Umfeld von Embed- ded Linux) weitgehend unbekannt ist: Alpine Linux ist im Hinblick auf Sicherheit und den sparsamen Umgang mit Ressourcen optimiert und unterscheidet sich in vielen technischen Details von anderen Linux-Distributionen. Das wichtigste Unterschei- dungsmerkmal geht aber aus Tabelle 8.1 hervor: Der Platzbedarf des Images ist im Vergleich zu dem anderer Distributionen verschwindend klein!
Distribution Image-Größe
Alpine Linux ca. 7 MByte
BusyBox ca. 5 MByte
Debian 12 ca. 115 MByte
Fedora 38 ca. 190 MByte
Ubuntu 22.04 ca. 80 MByte
Ubuntu 23.04 ca. 70 MByte
Tabelle 8.1 Größe von wichtigen Linux-Images
Generell gehen wir in diesem Buch davon aus, dass Sie Linux zumindest in seinen Grundzügen kennen und mit seinen wichtigsten Funktionen und Kommandos ver- traut sind.
Sollte das nicht der Fall sein, empfehlen wir Ihnen natürlich die Lektüre von »Linux – Das umfassende Handbuch« von Michael Kofler, ebenfalls erschienen im Rheinwerk Verlag.
Aber selbst viele Linux-Profis haben noch nie von Alpine Linux gehört. Deswegen fassen wir in diesem Kapitel ganz kurz zusammen, in welchen Details sich Alpine Linux von anderen Distributionen unterscheidet und wie es zu bedienen ist. Ein
8 Alpine Linux
Hauptaugenmerk legen wir dabei auf die Paketverwaltung, die beim Zusammenstel- len eigener Images von großer Bedeutung ist.
BusyBox als Alpine-Alternative Ein Blick auf Tabelle 8.1 macht schon klar: Mit BusyBox gibt es ein Image, das noch ein wenig kleiner ist als jenes von Alpine Linux. BusyBox ist eine kompakte Zusam- menstellung wichtiger Linux-Kommandos. Die Unterschiede zwischen dem BusyBox- und dem Alpine-Linux-Image sind nicht riesig, weil Alpine selbst wieder auf das Pro- gramm BusyBox zurückgreift. Der größte Vorteil von Alpine Linux ist die Integration einer echten Paketverwaltung (Kommando apk). Das vereinfacht die Installation zusätzlicher Software enorm. Wir konzentrieren uns deswegen hier auf Alpine Linux. Nur wenn die Größe eigener Images von höchster Bedeutung für Sie ist, sollten Sie BusyBox in Erwägung ziehen. Die Handhabung ist etwas umständlicher, dafür kön- nen Sie aber ca. 2 MByte Platz einsparen. Die Images von BusyBox und Alpine Linux unterscheiden sich auch durch die Art und Weise, wie die Binaries mit den dazugehörigen Bibliotheken gelinkt sind (BusyBox sta- tisch versus Alpine Linux dynamisch). Welche Vor- und Nachteile sich daraus ergeben, fasst der folgende Stack-Overflow-Artikel zusammen: https://stackoverflow.com/questions/67529042
8.1 Merkmale Um Alpine Linux möglichst schlank zu halten, haben seine Entwickler andere Kompo- nenten ausgewählt als in »großen« Linux-Bibliotheken üblich. Beispielsweise nutzt Alpine Linux die C-Standardbibliothek musl anstelle von glibc oder das Init-System OpenRC anstelle von systemd. Auch die grundlegenden Linux-Kommandos stehen nicht in ihren Vollversionen zur Verfügung, sondern stammen in abgespeckter Form aus dem schon erwähnten Paket BusyBox. Beim interaktiven Arbeiten bietet Alpine Linux deswegen vergleichsweise wenig Komfort. Aber Alpine Linux reicht aus, um einen Serverdienst wie z. B. Apache oder Nginx mit minimalem Overhead auszuführen – und darauf kommt es im Docker- Umfeld an. Weitere Informationen können Sie hier nachlesen: https://alpinelinux.org/about https://de.wikipedia.org/wiki/Alpine_Linux
Alpine Linux ausprobieren Auch wenn Alpine Linux nicht für die interaktive Nutzung gedacht ist, sollten Sie sich zum Ausprobieren der Grundfunktionen einen Container erstellen. Am schnellsten gelingt dies mit dem folgenden Kommando:
docker run -it --rm -h alpine --name alpine alpine
Damit gelangen Sie in eine interaktive root-Shell, in der Sie die Versionsnummer von Alpine Linux ergründen können:
cat / etc / os - release NAME =" Alpine Linux " ID = alpine VERSION_ I D =3.18.2 PRETTY_N A M E =" Alpine Linux v3 .18" HOME_URL =" https :// alpineli n u x . org /" BUG_REPO R T _ UR L =" https :// gitlab . alpineli n ux . org /alpine / aports "
Shell In Alpine Linux wird standardmäßig die Shell /bin/sh ausgeführt, die Teil von Busy- Box ist (siehe den nächsten Abschnitt). Diese Shell kann nicht mit dem Komfort der bash mithalten, die bei anderen Linux-Distributionen zum Einsatz kommt. Deswe- gen kann es sich lohnen, zur Erkundung von Alpine Linux die viel größere bash zu installieren. Details zum Kommando apk folgen in Abschnitt 8.2, »Paketverwaltung mit apk«.
apk add --update bash bash - completi o n
bash
Wenn Sie nun in einem zweiten Terminal docker ps -s ausführen, werden Sie sehen, dass die Container-Größe von wenigen Bytes auf gut 5 MByte angewachsen ist. Mit anderen Worten: Allein die bash beansprucht fast gleich viel Speicherplatz wie das gesamte Alpine-Image!
BusyBox BusyBox ist ein für Alpine-Verhältnisse relativ großes Programm (0,8 MByte). Dafür enthält es aber Implementierungen von rund 140 Standardkommandos wie cat, echo, grep, gzip, hostname , ip, ls, mount, ping, rm, route oder su. Diese Kommandos stehen in Form von symbolischen Links auf busybox zur Verfügung:
ls / bin / sbin -l / bin ... 12 ash -> / bin / busybox
8 Alpine Linux
12 base64 -> / bin /busybox 12 bbconfig -> / bin / busybox 816888 busybox 12 cat -> / bin / busybox
... / sbin
12 acpid -> / bin / busybox 12 adjtimex -> / bin / busybox
69632 apk
12 arp -> / bin / busybox
...
Der offensichtliche Vorteil von BusyBox besteht darin, dass der Platzbedarf für diese Standardkommandos gering ist. Der Nachteil von BusyBox ist, dass die Kommandos zum Teil in einer vereinfachten Form realisiert sind und diverse Optionen fehlen, die unter Linux gebräuchlich sind. Eine Zusammenfassung aller Kommandos und Optio- nen, die mit BusyBox verwendet werden können, finden Sie hier: https://busybox.net/downloads/BusyBox.html
Init-System und Logging Das Init-System ist unter Linux dafür zuständig, beim Hochfahren des Rechners Hintergrund- und Netzwerkdienste zu starten. Dazu besteht bei der Anwendung unter Docker aber keine Notwendigkeit. (Das gilt auch für andere Linux-Images für Docker.) Ähnlich sieht es beim Logging aus: Standardmäßig ist im Alpine-Image kein Logging vorgesehen. Bei Bedarf können Sie das Paket rsyslog installieren und müssen sich um dessen Start kümmern.
Die musl-Bibliothek Die in Alpine Linux eingesetzte Bibliothek musl ist eine schlankere libc-Implemen- tierung als die weitverbreitete glibc. Allerdings führt diese Bibliothek mitunter zu Problemen. Eines besteht darin, dass die Auswertung von /etc/resolv.conf verein- facht wurde. So ignoriert musl die Schlüsselwörter domain und search. Sollten Sie Probleme beim Auflösen von Domainnamen haben, werfen Sie unbedingt einen Blick auf die folgende Webseite: https://github.com/gliderlabs/docker-alpine/blob/master/docs/caveats.md Schwierigkeiten machen auch Binärdateien, die nicht für Alpine Linux kompiliert wurden. Sie verwenden mitunter Symbole, die es zwar in der glibc gibt, nicht aber in musl. Bei der Fehlersuche hilft das Kommando ldd <binary>.
Ein weiteres Problem ist die fehlende Unterstützung von Lokalisierungsdateien (lo- cales). Ein möglicher Ausweg besteht darin, eine für Alpine Linux optimierte Variante der glibc zu installieren. Details können Sie hier nachlesen: https://github.com/gliderlabs/docker-alpine/issues/144#issuecomment-339906345 https://github.com/sgerrand/alpine-pkg-glibc
Fehlendes root-Passwort Im Mai 2019 wurde bekannt, dass die Docker-Images von Alpine Linux ohne root- Passwort ausgeliefert wurden. Zum Glück klingt das dramatischer, als es tatsächlich ist: Im Docker-Umfeld ist es eher ungewöhnlich, dass innerhalb eines Containers eine Benutzerverwaltung aktiv ist. Standardmäßig ist dies weder in Alpine Linux noch in unzähligen darauf aufbauenden Images der Fall. Umgekehrt ist es aber eben nicht auszuschließen, dass einzelne Docker-Anwender Zusatzpakete für die Benutzerver- waltung mit apk installieren – und dann wird die Möglichkeit eines root-Logins ohne Passwort zum Sicherheitsrisiko. Das Problem ist natürlich längst behoben. cat /etc/shadow zeigt, dass in der Hash- Code-Spalte für das root-Passwort ein Ausrufezeichen im Sinne von »ungültiges Passwort« gespeichert ist.
cat / etc / shadow root :!::0:::: : bin :!::0::: :: daemon :!::0::: : : ...
8.2 Paketverwaltung mit apk Unter Debian und Ubuntu verwenden Sie zur Installation von Paketen apt, unter Fedora und RHEL dnf. Das äquivalente Kommando unter Alpine Linux heißt apk. Die beiden wichtigsten Kommandos apk update zum Einlesen der Paketquellen sowie apk add <name> zur Installation eines Pakets haben Sie im vorigen Abschnitt ja schon kennengelernt. Einige weitere Kommandos fasst Tabelle 8.2 zusammen. Noch mehr Details und Optionen können Sie hier nachlesen: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management Standardmäßig sind im Docker-Image von Alpine Linux nur wenige Pakete installiert:
apk info | sort
alpine - baselayo u t alpine - baselayout - data
209
8 Alpine Linux
alpine - keys apk - tools busybox busybox - binsh ca - certificates - bundle libc - utils libcrypt o 3 libssl3 musl musl - utils scanelf ssl_clie n t zlib
Kommando Funktion
apk add <name> Installiert das angegebene Paket.
apk del <name> Entfernt das angegebene Paket.
apk info Listet die installierten Pakete auf.
apk search <name> Sucht nach Paketen in den Paketquellen.
apk stats Zeigt an, wie viele Pakete installiert sind.
apk update Ermittelt, welche Pakete aktuell verfügbar sind.
apk upgrade Aktualisiert alle installierten Pakete.
Tabelle 8.2 Die wichtigsten Kommandos zur Paketverwaltung
Paketquellen Die Paketquellen für Alpine Linux sind in der Datei /etc/apk/repositories definiert:
cat / etc / apk / repositor i e s https :// dl - cdn . alpinelin u x . org / alpine / v3 .18/ main https :// dl - cdn . alpinelin u x . org / alpine / v3 .18/ communit y
Das Paketangebot ist nicht ganz so riesig wie unter Debian oder Ubuntu, aber mit 20.000 Paketen doch mehr als beachtlich:
apk update ... OK : 20063 distinct packages available
Die Indexdateien der Paketquellen werden in /var/cache/apk gespeichert und bean- spruchen ca. 1 MByte Platz. Um Speicherplatz zu sparen, können Sie die dort befind- lichen Dateien nach Abschluss der Installationsarbeiten wieder löschen. Mit apk search können Sie in den Paketquellen nach Paketen suchen:
apk search php8 | sort cacti -php -1.2.24 -r1 php81 -8.1.20 -r0 php81 -apache2 -8.1.20 -r0 ... php82 -8.2.7 -r0 php82 -apache2 -8.2.7 -r0 ...
Alternativ können Sie zur Paketsuche auch einen Blick auf die folgende Seite werfen: https://pkgs.alpinelinux.org/packages
Vergessen Sie »apk update« nicht! Bevor Sie das erste Paket installieren können, müssen Sie mit apk update einen lokalen Index erstellen, der alle aktuell in den Paketquellen verfügbaren Pakete ent- hält. Alternativ können Sie apk add mit der Option --update aufrufen: Dann wird apk update automatisch ausgeführt.
Wenn Sie apk in einem Dockerfile verwenden, um ein neues Image zu erstellen,
das zusätzliche Pakete nutzt, sollten Sie anstelle der Option --update die Option
--no-cache verwenden. Auch diese Option bewirkt ein apk update, allerdings wird der
heruntergeladene Paketindex nach der Installation sofort aus dem Cache gelöscht. Das verhindert, dass das Image durch unnötige Daten aufgebläht wird.
Ebenfalls empfehlenswert ist es, nur vorübergehend benötigte Pakete sofort wieder zu löschen, wie Sie im folgenden Beispiel sehen:
- Datei Dockerfi l e
... RUN apk add --no - cache \ build - base \ python3 - dev \ py3 -pip \ jpeg - dev \ zlib - dev \ ffmpeg \ && pip3 install sigal \ && pip3 install cssmin \ && apk del build - base python3 - dev jpeg -dev zlib - dev
8 Alpine Linux
Pakete und ihre Dateien apk info <name> fasst die wichtigsten Informationen zu einem Paket zusammen:
apk info musl musl -1.2.4 -r0 descript io n : the musl c library ( libc ) implemen ta t i o n musl -1.2.4 -r0 webpage : https :// musl . libc . org / musl -1.2.4 -r0 installe d size : 620 KiB
Mit apk info -L <name> liefert das Kommando eine Liste aller Dateien, die zu einem Paket gehören:
apk info -L musl musl -1.2.4 -r0 contains : lib / ld - musl -x86_64 . so .1 lib / libc . musl - x86_64 . so .1
Umgekehrt können Sie mit apk info --who-owns <datei> feststellen, zu welchem Pa- ket die angegebene Datei gehört:
apk info --who - owns / bin /ls / bin / ls symlink target is owned by busybox -1.36.1 -r0
Anhang
Siehe auch
Dokumentation
Links
Projekt
Weblinks