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.
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.2-4
- Alpine Linux 3.16.0
- Docker
- Portainer
Alpine Linux VM erstellen
Das aktuelle Alpine VIRTUAL ISO (alpine-virt-3.16.0-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, fahre ich die VM herunter.
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://dl-cdn.alpinelinux.org/alpine/v3.16/main http://dl-cdn.alpinelinux.org/alpine/v3.16/community #http://dl-cdn.alpinelinux.org/alpine/edge/main #http://dl-cdn.alpinelinux.org/alpine/edge/community #http://dl-cdn.alpinelinux.org/alpine/edge/testing
System updaten
docker:~# apk update && apk upgrade
QEMU Guest Agent installieren und den Service automatisch starten lassen.
docker:~# apk add 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 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
Docker installieren
Für den Einsatz als Docker Host, docker und docker-compose installieren.
docker:~# apk add docker docker-compose docker:~# docker -v Docker version 20.10.16, build aa7e414fdcb23a66e8fabbef0a560ef1769eace5 docker:~# docker-compose -v docker-compose version 1.29.2, build unknown
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.