Zum Hauptinhalt springen
Zurück zur Kategorie

Private Docker Registry einrichten: Image-Speicherung und -Verwaltung

Private Docker Registry einrichten, sichere Registry mit TLS, Authentifizierung, Image Push/Pull, Enterprise Registry mit Harbor und CI/CD-Integration.

Lesezeit: 14 dk Container & Orchestrierung
dockerregistryimageharborcontainerci/cdspeicherungprivate registry
Autor
REXE Teknoloji Network & Security Team
Redaktion
REXE Teknoloji Technical Editorial
Erstveröffentlichung
Letzte Aktualisierung

Private Docker Registry einrichten

Öffentliche Registries wie Docker Hub sind praktisch, aber das Hosten einer eigenen Registry für private Images bietet Vorteile in Sicherheit, Geschwindigkeit und Kosten. Dieser Leitfaden behandelt Optionen von der einfachen Docker Registry bis zum Enterprise Harbor.

Warum eine private Registry?

VorteilBeschreibung
SicherheitPrivate Images nicht öffentlich zugänglich
GeschwindigkeitSchnelles Pull/Push im lokalen Netzwerk
KostenKeine Docker Hub Rate Limits
KontrolleVollständige Image-Lifecycle-Kontrolle
ComplianceDatenlokalisierungsanforderungen

1. Einfache Docker Registry (registry:2)

Grundlegende Einrichtung

hljs bash
# Registry-Container starten
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# Registry-Betrieb überprüfen
curl http://localhost:5000/v2/
# Ausgabe: {}

Image Push und Pull

hljs bash
# Image taggen
docker tag myapp:latest localhost:5000/myapp:latest

# In Registry pushen
docker push localhost:5000/myapp:latest

# Aus Registry pullen
docker pull localhost:5000/myapp:latest

# Images in Registry auflisten
curl http://localhost:5000/v2/_catalog

2. Sichere Registry mit TLS

hljs bash
# Zertifikatsverzeichnis erstellen
mkdir -p /etc/docker/certs/registry

# Self-Signed-Zertifikat erstellen
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout /etc/docker/certs/registry/domain.key \
  -x509 -days 365 \
  -out /etc/docker/certs/registry/domain.crt \
  -subj "/CN=registry.example.com" \
  -addext "subjectAltName=DNS:registry.example.com,IP:192.168.1.100"

# Zertifikat zu Dockers vertrauenswürdigen Zertifikaten hinzufügen
mkdir -p /etc/docker/certs.d/registry.example.com:5000
cp /etc/docker/certs/registry/domain.crt \
   /etc/docker/certs.d/registry.example.com:5000/ca.crt

systemctl restart docker

Registry mit TLS starten

hljs bash
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

3. Registry mit Authentifizierung

hljs bash
# htpasswd-Datei erstellen
mkdir -p /etc/docker/registry/auth
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn admin StarkesPasswort123! > /etc/docker/registry/auth/htpasswd

# Registry mit Authentifizierung starten
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -v /etc/docker/registry/auth:/auth \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

# Anmelden
docker login registry.example.com:5000

4. Registry mit Docker Compose

hljs yaml
version: '3.8'

services:
  registry:
    image: registry:2
    restart: always
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - registry-data:/var/lib/registry
      - ./certs:/certs:ro
      - ./auth:/auth:ro

  registry-ui:
    image: joxit/docker-registry-ui:latest
    ports:
      - "8080:80"
    environment:
      - REGISTRY_TITLE=REXE Private Registry
      - REGISTRY_URL=https://registry.example.com:5000
      - SINGLE_REGISTRY=true

volumes:
  registry-data:

5. Harbor — Enterprise Registry

hljs bash
# Harbor-Installer herunterladen
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzf harbor-online-installer-v2.9.0.tgz
cd harbor

cp harbor.yml.tmpl harbor.yml
nano harbor.yml
hljs yaml
# harbor.yml
hostname: registry.example.com

https:
  port: 443
  certificate: /etc/harbor/certs/domain.crt
  private_key: /etc/harbor/certs/domain.key

harbor_admin_password: StarkesPasswort123!
data_volume: /data/harbor
hljs bash
./install.sh
docker login registry.example.com

6. Registry-Bereinigung (Garbage Collection)

hljs bash
# Ungenutzte Schichten bereinigen
docker exec registry registry garbage-collect \
  /etc/docker/registry/config.yml

# Dry-Run
docker exec registry registry garbage-collect \
  --dry-run \
  /etc/docker/registry/config.yml

7. CI/CD-Integration

hljs yaml
# .github/workflows/build-push.yml
name: Build and Push

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to Private Registry
        uses: docker/login-action@v3
        with:
          registry: registry.example.com:5000
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and Push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: registry.example.com:5000/myapp:${{ github.sha }}

Fazit

Eine private Docker Registry ist für Image-Sicherheit und -Verwaltung in Unternehmensumgebungen unerlässlich. Wählen Sie registry:2 für einfache Anwendungsfälle, Harbor für Enterprise-Funktionen (RBAC, Sicherheits-Scanning, Replikation). Mit einer privaten Registry auf REXE-Servern können Sie Ihre Images sicher speichern und in CI/CD-Pipelines integrieren.

Häufig gestellte Fragen

Warum sollte ich eine private Registry statt Docker Hub verwenden?

Mehrere wichtige Gründe: 1) Sicherheit — Ihre privaten Images sind nicht öffentlich zugänglich, 2) Geschwindigkeit — Pull/Push ist im lokalen Netzwerk viel schneller, 3) Keine Rate Limits — Docker Hub Free-Konten haben stündliche Pull-Limits, 4) Datenkontrolle — Ihre Images bleiben auf Ihrem eigenen Server, 5) Compliance — einige Branchen erfordern Datenlokalisierung.

Ich erhalte einen Insecure-Registry-Fehler, wie behebe ich ihn?

Wenn Sie eine HTTP-Registry (ohne TLS) verwenden, müssen Sie Docker mitteilen, ihr als unsicherer Registry zu vertrauen. Fügen Sie {"insecure-registries": ["registry.example.com:5000"]} zu /etc/docker/daemon.json hinzu und starten Sie Docker neu. Die Verwendung von TLS in der Produktion wird dringend empfohlen.

Die Registry-Festplatte ist voll, wie bereinige ich sie?

Zwei Schritte: 1) Zuerst Images über API löschen (DELETE /v2/IMAGE/manifests/DIGEST), 2) Dann Garbage Collection ausführen (docker exec registry registry garbage-collect /etc/docker/registry/config.yml). Ohne Garbage Collection wird nur das Manifest gelöscht — Schichten bleiben auf der Festplatte.

Was ist der Unterschied zwischen Harbor und registry:2?

registry:2 ist ein einfacher, leichtgewichtiger Image-Speicher. Harbor bietet Enterprise-Funktionen: RBAC (rollenbasierte Zugriffskontrolle), Schwachstellen-Scanning (Trivy-Integration), Image-Replikation, Webhooks, Audit-Logs und Web-UI. registry:2 für kleine Teams, Harbor für große Organisationen empfohlen.

Ich kann keine Images aus meiner privaten Registry in Kubernetes pullen, warum?

Kubernetes benötigt Registry-Anmeldedaten. Erstellen Sie Anmeldedaten als Secret mit kubectl create secret docker-registry und fügen Sie imagePullSecrets zu Ihrem Deployment hinzu. Alternativ können Sie imagePullSecrets zum Service Account hinzufügen, um es namespace-weit gültig zu machen.

Verwandte Artikel

NetzwerkverkehrEingehend GbpsAusgehend Gbps