Alpine Linux unter Proxmox als Docker Host

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.

7 Gedanken zu „Alpine Linux unter Proxmox als Docker Host“

  1. 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.

    Antworten
    • 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

      Antworten
  2. 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?

    Antworten
    • 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.

      Antworten

Schreibe einen Kommentar zu Klaus Antworten abbrechen