Container & VMs

Private Docker Registry auf Ubuntu einrichten – Schritt für Schritt

Private Docker Registry auf Ubuntu einrichten – Schritt für Schritt

Einleitung

Eine private Docker Registry stellt eine selbstverwaltete Lösung für die Speicherung und Verteilung von Container-Images dar. Im Gegensatz zu öffentlichen Registries wie Docker Hub bietet eine private Registry vollständige Kontrolle über Zugriffsberechtigung, Sicherheit und Verfügbarkeit Ihrer Container-Images. Dies ist besonders wichtig für Unternehmen, die proprietäre Anwendungen entwickeln oder compliance-kritische Umgebungen betreiben.

Die Hauptvorteile einer eigenen Docker Registry umfassen die vollständige Kontrolle über Zugriffsrichtlinien, reduzierte Latenzzeiten durch lokale Speicherung, Unabhängigkeit von externen Diensten und die Möglichkeit, auch in abgeschotteten Netzwerken zu operieren. Gleichzeitig übernehmen Sie die Verantwortung für Wartung, Sicherheit und Backup-Strategien.

Dieses Tutorial zeigt Ihnen, wie Sie eine sichere private Docker Registry auf Ubuntu Server einrichten. Wir verwenden Docker Compose für die Container-Orchestrierung, Nginx als Reverse Proxy mit TLS-Terminierung und HTTP Basic Authentication für die Zugriffskontrolle.

Voraussetzungen

Für die Einrichtung einer privaten Docker Registry benötigen Sie folgende Komponenten:

  • Ubuntu Server 22.04 LTS oder neuer mit mindestens 2 GB RAM und 20 GB Speicherplatz
  • Root- oder sudo-Berechtigung auf dem Server
  • Eine registrierte Domain, die auf Ihren Server zeigt
  • Grundlegende Kenntnisse in der Linux-Administration und Docker
  • Internetzugang für die Installation der erforderlichen Pakete

Stellen Sie sicher, dass Ihr System auf dem neuesten Stand ist:

sudo apt update && sudo apt upgrade -y

Schritt-für-Schritt Anleitung

Docker und Docker Compose installieren

Zunächst installieren wir Docker und Docker Compose auf Ihrem Ubuntu-Server. Fügen Sie das offizielle Docker-Repository hinzu:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aktualisieren Sie die Paketliste und installieren Sie Docker:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

Fügen Sie Ihren Benutzer zur Docker-Gruppe hinzu:

sudo usermod -aG docker $USER
newgrp docker

Nginx installieren und konfigurieren

Installieren Sie Nginx als Reverse Proxy für Ihre Registry:

sudo apt install nginx apache2-utils -y

Erstellen Sie eine Nginx-Konfigurationsdatei für Ihre Registry. Ersetzen Sie registry.ihredomain.de durch Ihre tatsächliche Domain:

sudo nano /etc/nginx/sites-available/docker-registry

Fügen Sie folgende Konfiguration hinzu:

upstream docker-registry {
    server 127.0.0.1:5000;
}

map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    '' 'registry/2.0';
}

server {
    listen 80;
    server_name registry.ihredomain.de;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name registry.ihredomain.de;

    ssl_certificate /etc/letsencrypt/live/registry.ihredomain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/registry.ihredomain.de/privkey.pem;

    client_max_body_size 0;
    chunked_transfer_encoding on;

    location /v2/ {
        auth_basic "Docker Registry";
        auth_basic_user_file /etc/nginx/docker-registry.htpasswd;

        add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

        proxy_pass http://docker-registry;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900;
    }
}

SSL-Zertifikat mit Let’s Encrypt einrichten

Installieren Sie Certbot für automatische SSL-Zertifikate:

sudo apt install certbot python3-certbot-nginx -y

Aktivieren Sie zunächst die Nginx-Konfiguration ohne SSL:

sudo ln -s /etc/nginx/sites-available/docker-registry /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Erstellen Sie das SSL-Zertifikat:

sudo certbot --nginx -d registry.ihredomain.de

Authentifizierung konfigurieren

Erstellen Sie eine Passwort-Datei für die HTTP Basic Authentication. Ersetzen Sie username durch Ihren gewünschten Benutzernamen:

sudo htpasswd -c /etc/nginx/docker-registry.htpasswd username

Geben Sie ein sicheres Passwort ein, wenn Sie dazu aufgefordert werden.

Docker Registry mit Docker Compose einrichten

Erstellen Sie ein Verzeichnis für die Registry-Konfiguration:

mkdir ~/docker-registry
cd ~/docker-registry

Erstellen Sie eine docker-compose.yml-Datei:

nano docker-compose.yml

Fügen Sie folgende Konfiguration hinzu:

version: '3.8'

services:
  registry:
    image: registry:2
    container_name: docker-registry
    restart: unless-stopped
    ports:
      - "127.0.0.1:5000:5000"
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - registry-data:/var/lib/registry
    networks:
      - registry-network

volumes:
  registry-data:

networks:
  registry-network:

Starten Sie die Registry:

docker compose up -d

Aktualisieren Sie die Nginx-Konfiguration und starten Sie den Service neu:

sudo systemctl reload nginx

Überprüfung

Registry-Funktionalität testen

Überprüfen Sie zunächst, ob die Registry läuft:

docker ps

Testen Sie die Verbindung zur Registry:

curl -u username https://registry.ihredomain.de/v2/_catalog

Sie sollten eine JSON-Antwort mit einem leeren Repository-Array erhalten.

Test-Image pushen und pullen

Melden Sie sich bei Ihrer Registry an:

docker login registry.ihredomain.de

Laden Sie ein Test-Image herunter und taggen Sie es für Ihre Registry:

docker pull alpine:latest
docker tag alpine:latest registry.ihredomain.de/alpine:latest

Pushen Sie das Image in Ihre Registry:

docker push registry.ihredomain.de/alpine:latest

Überprüfen Sie, ob das Image erfolgreich gespeichert wurde:

curl -u username https://registry.ihredomain.de/v2/_catalog

Troubleshooting

Häufige Probleme und Lösungen

Problem: Registry ist nicht erreichbar

  • Überprüfen Sie den Status der Docker-Container mit docker ps
  • Prüfen Sie die Nginx-Konfiguration mit sudo nginx -t
  • Kontrollieren Sie die Firewall-Einstellungen mit sudo ufw status

Problem: SSL-Zertifikat-Fehler

  • Stellen Sie sicher, dass Ihre Domain korrekt auf den Server zeigt
  • Überprüfen Sie die Certbot-Logs mit sudo certbot certificates
  • Erneuern Sie das Zertifikat mit sudo certbot renew --dry-run

Problem: Authentifizierungsfehler

  • Überprüfen Sie die htpasswd-Datei mit sudo cat /etc/nginx/docker-registry.htpasswd
  • Testen Sie die Anmeldung manuell mit docker logout und docker login

Log-Dateien überprüfen

Für eine detaillierte Fehleranalyse können Sie verschiedene Log-Dateien einsehen:

# Docker Registry Logs
docker logs docker-registry

# Nginx Logs
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

Fazit

Sie haben erfolgreich eine private Docker Registry auf Ubuntu Server eingerichtet. Diese Lösung bietet Ihnen vollständige Kontrolle über Ihre Container-Images und gewährleistet deren Sicherheit durch HTTPS-Verschlüsselung und HTTP Basic Authentication.

Die eingerichtete Registry kann nun für die Speicherung und Verteilung Ihrer eigenen Docker-Images verwendet werden. Vergessen Sie nicht, regelmäßige Backups der Registry-Daten zu erstellen und die SSL-Zertifikate zu überwachen. Für Produktionsumgebungen sollten Sie zusätzliche Sicherheitsmaßnahmen wie erweiterte Authentifizierungsmechanismen oder Netzwerksegmentierung in Betracht ziehen.

Mit dieser Grundlage können Sie Ihre Container-Infrastruktur weiter ausbauen und an Ihre spezifischen Anforderungen anpassen. Die private Registry bildet eine solide Basis für CI/CD-Pipelines und automatisierte Deployment-Prozesse in Ihrem Unternehmen.