Alpine Linux ist eine kleine, einfache, aktuelle und ressourcenschonende Linux Distribution.
Sie eignet sich hervorragend für Virtuelle Maschinen, Container und den Einsatz als Docker Host.
17.09.2023 - Anleitung aktualisiert (Proxmox 7, Alpine Linux 3.18, Portainer) 20.06.2022 - Anleitung aktualisiert (Proxmox 7, Alpine Linux 3.16, Portainer) 10.07.2021 - Anleitung aktualisiert (Portainer upgraden) 22.03.2021 - Anleitung aktualisiert (Alpine Linux upgraden)
- Proxmox 7.4-16
- Alpine Linux 3.18.3
- Docker
- Portainer
Alpine Linux VM erstellen
Das aktuelle Alpine VIRTUAL ISO (alpine-virt-3.18.3-x86_64.iso) herunterladen und eine neue VM erstellen.
Alpine Linux installieren
VM starten, in der Konsole als root anmelden und die Installation mit setup-alpine ausführen.
Die Fragen des wizards beantworten. In den meisten Fällen kann hier die Vorgabe übernommen werden.
Bei der Festplatte [sda] wähle ich [sys] aus. (traditional disk install)
Ist die Installation abgeschlossen, die VM herunterfahren. CDROM entfernen und Bootorder anpassen
localhost:~# poweroff
QEMU Guest Agent installieren
Bei der noch ausgeschalteten VM in den Options den QEMU Guest Agent aktivieren. (Oder beim erstellen der VM den Qemu Agent direkt aktivieren.)
VM starten und die APK Community Repositories in der /etc/apk/repositories aktivieren.
#/media/cdrom/apks http://mirror1.hs-esslingen.de/pub/Mirrors/alpine/v3.18/main http://mirror1.hs-esslingen.de/pub/Mirrors/alpine/v3.18/community
System updaten
docker:~# apk update && apk upgrade
QEMU Guest Agent installieren und den Service automatisch starten lassen.
docker:~# apk add --no-cache qemu-guest-agent docker:~# rc-update add qemu-guest-agent
Der Service starten.
docker:~# service qemu-guest-agent start * Caching service dependencies ... [ ok ] * Starting QEMU Guest Agent ... [ ok ] docker:~# service qemu-guest-agent status * status: started
Agent läuft.
Benutzer anlegen
Für den SSH login erstelle ich noch einen neuen Benutzer und Gruppe.
docker:~# addgroup -g 222 gargamel docker:~# adduser -G gargamel gargamel
Sudo installieren und den Benutzer in die sudoers Datei aufnehmen.
docker:~# apk add --no-cache sudo docker:~# visudo # diesen Eintrag hinzufügen gargamel ALL=(ALL) ALL
Sollte aus irgendeinem Grund ein SSH login als root notwendig sein, muss PermitRootLogin in der /etc/ssh/sshd_config erlaubt werden.
#PermitRootLogin prohibit-password PermitRootLogin yes
Den sshd Service neu starten.
docker:~# service sshd restart
Tools installieren
Ein paar nützliche Tools die vielleicht nicht fehlen sollten.
docker:~# apk add --no-cache htop iftop ethtool wget curl git vim ncdu
Docker installieren
Für den Einsatz als Docker Host, docker und docker-compose installieren.
docker:~# apk add --no-cache docker docker-compose docker:~# docker -v Docker version 23.0.6, build ef23cbc4315ae76c744e02d687c09548ede461bd docker:~# docker-compose -v Docker Compose version v2.17.3
Docker automatisch starten lassen.
docker:~# rc-update add docker
Service starten.
docker:~# service docker start
Portainer installieren
Für die grafische Verwaltung von Docker nutze ich Portainer.
docker:~# docker volume create portainer_data docker:~# docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
Läuft der Container, kann über https://docker-ip:9443 das Webinterface aufgerufen werden.
Portainer auf die aktuelle Version upgraden
Andere Anwendungen, Container, etc. werden dadurch nicht entfernt. (upgrade Portainer)
docker:~# docker stop portainer docker:~# docker rm portainer docker:~# docker pull portainer/portainer-ce:latest docker:~# docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
Portainer mit eigenen SSL Zertifikaten
Ich nutze intern meine eigenen Zertifikate mit einer lokaler CA.
Am Ende des docker run Befehls die Zertifikate mit angeben.
$ docker run -d -p 9443:9443 ... --sslcert /certs/cert.crt --sslkey /certs/privkey.key
Oder im WebUI die Zertifikate später einfach hochladen.
Alpine Linux auf die aktuelle Version upgraden
Installierte Version anzeigen.
docker:~# cat /etc/alpine-release 3.12.4
In der /etc/apk/repositories die Versionsnummer auf die aktuelle ändern. (z.B. 3.12 auf 3.13)
# http://dl-cdn.alpinelinux.org/alpine/v3.12/main # http://dl-cdn.alpinelinux.org/alpine/v3.12/community http://dl-cdn.alpinelinux.org/alpine/v3.13/main http://dl-cdn.alpinelinux.org/alpine/v3.13/community
Um nicht immer die Nummern erhöhen zu müssen, kann man auch direkt auf die letzte stable release setzen.
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
Den Index neu aufbauen, upgraden und neu starten.
docker:~# apk update docker:~# apk upgrade --available docker:~# sync docker:~# reboot # sync Schreibt alle gepufferten Blöcke (Dateien) auf die Platte. # --availabe Erzwingt das alle Pakete aktualisiert werden, auch wenn sie die gleiche Version haben. Ist bei Änderungen in de uClibs manchmal erforderlich.
Nach dem reboot die Version kontrollieren.
docker:~# cat /etc/alpine-release 3.13.2
qemu-guest-agent startet nicht (Alpine Linux 3.12)
Der Service startet nicht, sondern crashed!
docker:~# service qemu-guest-agent start * Caching service dependencies ... [ ok ] * Starting QEMU Guest Agent ... [ ok ] docker:~# service qemu-guest-agent status * status: crashed
Der virtuelle serielle Port für die Kommunikation mit dem Agent muss in der /etc/init.d/qemu-guest-agent geändert werden.
docker:~# ls -la /dev/vport* crw-rw---- 1 root root 248, 1 Oct 4 13:59 /dev/vport2p1
Bei mir ist es der Port vport2p1. Könnte aber ggf. auch vport1p1 sein. Die letzte Zeile entsprechend ändern.
#!/sbin/openrc-run name="QEMU Guest Agent" pidfile="/run/qemu-ga.pid" command="/usr/bin/qemu-ga" # command_args="-m ${GA_METHOD:-virtio-serial} -p ${GA_PATH:-/dev/virtio-ports/org.qemu.guest_agent.0} -l /var/log/qemu-ga.log -d" command_args="-m ${GA_METHOD:-virtio-serial} -p ${GA_PATH:-/dev/vport2p1} -l /var/log/qemu-ga.log -d"
Service neu starten.
docker:~# service qemu-guest-agent restart * Caching service dependencies ... [ ok ] * Stopping QEMU Guest Agent ... [ ok ] * start-stop-daemon: no matching processes found [ ok ] * Starting QEMU Guest Agent ... [ ok ] docker:~# service qemu-guest-agent status * status: started
Mit dem richtigen Port, läuft jetzt auch der Agent.
Super Anleitung!
Vielen Dank.
Danke! :)
Danke, genau die Einstellungen die ich gesucht habe.
Vielen Dank erstmal für Ihre ausführlichen Erklärungen!!
Ich stehe nur jetzt vor der Frage, ob ich das, wie hier beschrieben, als VM oder als LXC (von Ihnen auch bereits sehr gut erklärt) umsetzten soll. Könnten Sie vielleicht die Vor und Nachteile beider Methoden kurz beschreiben.
Ein Container benötigt weniger Ressourcen und ist kleiner als eine VM.
Eine VM sollte man für alles mit GUI nehmen, einen LXC Container für alles ohne GUI.
Ich lasse mittlerweile alles was geht in einem Container laufen.
Wenn ich nur eine Applikation unter Docker laufen lassen möchte, nutze ich immer einen Container
Vielen Dank!
Nur noch Mal für mein Verständnis:
Ich könnte aber “Proxmox mit Docker im LXC Container” (https://www.bachmann-lan.de/proxmox-mit-docker-im-lxc-container/) umsetzten und in dem Alpine LXC Container könnte man portainer mit weiteren Docker-Containern laufen lassen. Mit Portainer hätte ich dann mein GUI zur Containerverwaltung und das wäre ressourcenschonender als der hier beschriebene Weg mit der VM.
Übersehe ich einen Haken bei dem Weg über den LXC Container oder einen Vorteil bei der VM, wenn ich später die Docker-Container nur über portainer verwalte?
Nein, das siehst du richtig.
Ein Container ist immer ressourcenschonender als eine VM.
Die VM emuliert einen kompletten PC und bietet dadurch mehr Einstellungen. (Hardware, BIOS, Display, etc.)
Dadurch benötigt sie auch mehr Ressourcen als ein Container.
Auch von meiner Seite aus vielen Dank für die Anleitung ;-) Bei Durchlaufen der setup-alpine Routine ist mir etwas komisches aufgefallen: Ich arbeite bei mir im Netzwerk mit statischen IPs, daher habe ich der AL-VM eine aus dem Nicht-DHCP-Pool vergeben. Komischerweise wollte die anschließende Config meinen name dns-Server nicht annehmen, ich bekam immer den Fehler “wget bad address” bei dem Abruf der Mirrors. Nur durch Abändern auf 8.8.8.8 war ein Abruf möglich. Bei einem weiteren Testversuch auf einer neuen VM haben ich setup-alpine mit den Auto-DHCP-Einstellungen durchlaufen lassen, da kam der Fehler komischerweise nicht vor. Irgendwo in den “Unweiten des Internets” hatte ich mal die Info gefunden, dass es an der Busybox Version liegt (die hätte wohl ein sehr kurzes Time-Out für Antworten).
Danke für die Info.