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