Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Docker-Images per Nexus auf Raspberry Pi verwalten

Während der Softwareentwicklung verwenden wir häufig installierbare Bibliothek- und Programm-Pakete. Für deren Verwaltung werden Repository-Manager eingesetzt, die das Hochladen, Suchen und Herunterladen von Paketen erlauben. Der Einsatz eines eigenen Repository-Managers bietet einige Vorteile:

  • private Pakete werden nicht in ein öffentliches Repository hochgeladen
  • verringerte Netzwerklast bei einem Proxy-Repository im eigenen Netzwerk
  • erhöhte Verfügbarkeit, falls ein öffentliches Repository ausfällt
  • zentraler Ort für unterschiedliche Paket-Typen

Eine weit verbreitete Lösung ist der Repository-Manager Nexus, der grundlegende Funktionen auch in der kostenfreien Version liefert:

  • Unterstützung vieler Paket-Formate:
    Docker, Maven (Java), NPM (Node / JavaScript), NuGet (.Net), …
  • Nutzung als Proxy zu öffentlichen Repositories (z.B. Docker-Hub, Maven Central)
  • Unterscheidung zwischen Snapshot- und Release-Paketen
Nexus auf einem Raspberry Pi

Installation auf dem Raspberry Pi

In meinem Heimnetzwerk läuft ein Raspberry Pi 4, der problemlos einen Nexus-Server beherbergen kann (Name: saturn). Dazu installiert man das momentan veraltete Java 8, ergänzt die APT-Sources um einen entsprechenden Nexus-Eintrag und installiert anschließend Nexus als Service per APT (englische Anleitung). Im Browser können wir dann den laufenden Nexus auf dem Port 8081 aufrufen.

sudo apt update
sudo apt install default-jdk
sudo curl https://nx-staging.sonatype.com/repository/community-hosted/deb/sonatype-community.list | sudo tee /etc/apt/sources.list.d/sonatype-community.list
sudo apt-get update && sudo apt-get install nexus-repository-manager
sudo service nexus-repository-manager status
pi@saturn:~ $ sudo service nexus-repository-manager status
● nexus-repository-manager.service - Nexus Repository Manager 3 Service
   Loaded: loaded (/opt/sonatype/nexus3/extra/daemon/nexus-repository-manager.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-08-16 22:53:40 CEST; 1 weeks 1 days ago
  Process: 449 ExecStart=/opt/sonatype/nexus3/bin/nexus start (code=exited, status=0/SUCCESS)
 Main PID: 702 (java)
    Tasks: 119 (limit: 4915)
   Memory: 653.3M
   CGroup: /system.slice/nexus-repository-manager.service
           └─702 /usr/lib/jvm/java-1.8.0-openjdk-armhf/bin/java -server -Dinstall4j.jvmDir=/usr/lib/jvm/java-1.8.0-openjdk-armhf -Dexe4j.moduleName=/opt/sonatype/nexus3/bin/nexus 

Aug 16 22:53:39 saturn systemd[1]: Starting Nexus Repository Manager 3 Service...
Aug 16 22:53:40 saturn nexus[449]: Starting nexus
Aug 16 22:53:40 saturn systemd[1]: Started Nexus Repository Manager 3 Service.

Repository-Arten des Nexus

Für die meisten Paket-Formate werden drei Arten von Repositories angeboten:

  • Proxy: dient als Proxy und Cache zu einem öffentlichen Repository und erlaubt nur lesenden Zugriff, sodass ein Paket nur einmalig vom öffentlichen Repository heruntergeladen wird
  • Hosted: dient als Ablageort für eigene Pakete und erlaubt den lesenden und schreibenden Zugriff (bei Maven unterscheidet man noch zwischen Snapshot-, Release- und Mixed-Repository)
  • Group: Vereinigt Proxy- und Hosted-Repository für lesende Zugriffe, sodass sie unter einem Endpunkt erreichbar sind

Docker-Repositories erstellen

Um die eigenen Docker-Images im Nexus verwalten zu können, sollten wir alle drei Arten von Repositories anlegen:

  • Server Administration => Repository => Repositories => Create Repository
  • Proxy-Repository:
    – ‚docker (hosted)‘ auswählen
    – Namen vergeben: my-docker-proxy
    – HTTP-Connector Port: 8082 (optional, da auch über die Gruppe nutzbar)
    – Proxy – Remote Storage: https://registry-1.docker.io
    => Create Repository
  • Hosted-Repository
    – ‚docker (hosted)‘ auswählen
    – Namen vergeben: my-docker-hosted
    – HTTP-Connector Port: 8083
    => Create Repository
  • Group-Repository:
    – ‚docker (group)‘ auswählen
    – Namen vergeben: my-docker-group
    – HTTP-Connector Port: 8084
    – Group – Member Repositories: my-docker-proxy + my-docker-hosted
    => Create Repository
  • URLs per curl, wget oder Browser aufrufen um Repository-Erreichbarkeit zu prüfen
    – z.B.: curl http://localhost:8083
    – evtl. einen anderen Port ausprobieren, falls eine Seite nicht erreichbar ist
Nexus-Administration: Docker (Proxy) – Repository anlegen

Docker-Konfiguration auf Client-Rechner einrichten

Um von einem anderen Rechner auf die Docker-Repositories zugreifen zu können, müssen wir die neuen Repositories erst einmal bekannt machen und uns einloggen:

  • in der Docker-Konfiguration, den folgenden Eintrag ergänzen:
    "insecure-registries": [ "saturn:8082", "saturn:8083“, "saturn:8084“ ]
  • auf einem Linux-System die Datei evtl. anlegen: /etc/docker/daemon.json
  • auf MacOS mit Docker-Desktop: Preferences -> Docker Engine
  • Docker neu starten
  • per Docker einloggen in alle Repositories:
    docker login -u myUsername -p myPassword saturn:8082
  • Daten für Authentifizierung wurden gespeichert: cat ~/.docker/config.json
Docker Desktop: Docker-Konfiguration anpassen

Docker-Images hoch- und herunterladen

Für das Herunterladen von Docker-Images können wir jetzt das Proxy- oder Group-Repository verwenden:

docker pull saturn:8084/httpd:2.4-alpine

Das Hochladen eines Docker-Images muss hingegen gegen das Hosted-Repository erfolgen. Ich habe erwartet, dass dafür auch das Group-Repository nutzbar ist, aber das ist nicht der Fall (was nicht nur mich verwirrt: Stackoverflow, Nexus-Issue).

docker build -t my-app .
docker images
docker tag my-app:latest saturn:8083/my-app:latest
docker push saturn:8083/my-app:latest
docker rmi saturn:8083/my-app:latest
docker run -p 80:80 --name my-app saturn:8084/my-app:latest

Docker-Images funktionieren – und jetzt ?

Mit Docker-Images kann unser Nexus also jetzt arbeiten. Als Fullstack-Entwickler benötige ich außerdem Maven- und NPM-Repositories, die natürlich ebenfalls vom Nexus auf dem Raspberry Pi bereitgestellt werden.

Kommentare sind geschlossen.