K3s Kubernetes-Installation: Leichte Container-Orchestrierung
Einzel- und Multi-Node Kubernetes-Cluster-Setup mit K3s, kubectl-Nutzung, Deployments und Services erstellen, Anwendungsverwaltung mit Helm. Kubernetes-Leitfaden für VPS-Umgebungen.
Private Docker Registry einrichten, sichere Registry mit TLS, Authentifizierung, Image Push/Pull, Enterprise Registry mit Harbor und CI/CD-Integration.
Ö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.
| Vorteil | Beschreibung |
|---|---|
| Sicherheit | Private Images nicht öffentlich zugänglich |
| Geschwindigkeit | Schnelles Pull/Push im lokalen Netzwerk |
| Kosten | Keine Docker Hub Rate Limits |
| Kontrolle | Vollständige Image-Lifecycle-Kontrolle |
| Compliance | Datenlokalisierungsanforderungen |
# 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 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
# 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
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
# 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
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:
# 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
# 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
./install.sh
docker login registry.example.com
# 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
# .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 }}
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.
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.
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.
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.
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.
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.
Einzel- und Multi-Node Kubernetes-Cluster-Setup mit K3s, kubectl-Nutzung, Deployments und Services erstellen, Anwendungsverwaltung mit Helm. Kubernetes-Leitfaden für VPS-Umgebungen.
Docker Volume-Typen (Named, Bind Mount, tmpfs), Volume-Verwaltung, Docker-Netzwerkmodi (Bridge, Host, Overlay), benutzerdefinierte Netzwerke und Container-Kommunikation. Umfassender Leitfaden.
Docker-Log-Treiber, docker logs-Befehl, Kubernetes Pod-Logs, zentralisierte Log-Sammlung (Loki, ELK Stack), Log-Rotation und Best Practices für Log-Verwaltung in Produktionsumgebungen.