Cloud & Hosting

Cloudflare Tunnel in Docker betreiben (2026 Compose-Anleitung)

So betreiben Sie Cloudflare Tunnel in Docker: Fügen Sie das Image cloudflare/cloudflared zu docker-compose hinzu, übergeben Sie ein TUNNEL_TOKEN und stellen Sie jede selbst gehostete App ohne offene Ports bereit. Inklusive der Container-Networking-Falle und der Limits des kostenlosen Plans.

Waqas Ahmed Waseer
Waqas Ahmed Waseer 8. Juli 2026 8 Min. Lesezeit
Cloudflare Tunnel in Docker betreiben (2026 Compose-Anleitung)

Um Cloudflare Tunnel in Docker zu betreiben, fügen Sie das offizielle Image cloudflare/cloudflared als Service in Ihre docker-compose.yml ein, übergeben Sie ein aus dem Cloudflare-Dashboard erzeugtes Tunnel-Token als Umgebungsvariable TUNNEL_TOKEN und platzieren Sie cloudflared im selben Docker-Netzwerk wie die App, die Sie bereitstellen möchten. Das ist der ganze Trick: keine an Ihrer Firewall geöffneten Ports, kein zu konfigurierender Reverse Proxy, und cloudflared erreicht Ihre App über ihren Container-Namen im internen Docker-Netzwerk. Diese Anleitung führt Sie durch die exakte Compose-Einrichtung, die eine Networking-Falle, über die fast jeder stolpert, und die Limits, die man kennen sollte, bevor man sich darauf verlässt.

Wenn Sie das vollständige Bild davon möchten, wie Tunnel über jede Installationsmethode hinweg funktionieren (systemd, macOS, Quick Tunnels sowie Cloudflare Access davor), lesen Sie unsere vollständige Anleitung zum Einrichten eines Cloudflare Tunnels. Dieser Beitrag ist bewusst enger gefasst: das containerisierte Docker-Compose-Muster, das die offizielle Dokumentation weitgehend auslässt.

Warum cloudflared als Container betreiben?

Das Docker-Image cloudflare/cloudflared ist der Connector-Daemon, der eine ausschließlich ausgehende Verbindung zum Edge von Cloudflare öffnet und Anfragen an Ihre lokalen Dienste weiterleitet. Es als Container statt als Systempaket zu betreiben, bietet für einen selbst gehosteten Stack drei echte Vorteile. Es lebt in derselben docker-compose.yml wie alles andere, sodass der gesamte Stack mit einem einzigen docker compose up -d hochkommt. Es ist an einen Image-Tag gebunden, sodass Upgrades ein bewusstes docker pull sind und kein Auto-Update im Hintergrund. Und es kann direkt über ein privates Docker-Netzwerk mit Ihren anderen Containern kommunizieren, was bedeutet, dass die App, die Sie bereitstellen, niemals einen veröffentlichten Port benötigt.

Das Sicherheitsmodell ist der Teil, den man unterschätzt. Weil cloudflared über QUIC/HTTPS nach außen zu Cloudflare wählt, kann Ihr VPS oder Heimserver jeden eingehenden Port an der Firewall geschlossen halten. Es lauscht kein 80/443 im öffentlichen Internet, das gescannt oder per Brute Force angegriffen werden könnte. Für einen selbst gehosteten Server bedeutet das eine spürbare Reduzierung der Angriffsfläche im Vergleich dazu, für einen klassischen Reverse Proxy Löcher zu bohren.

Voraussetzungen

  • Eine bei Cloudflare eingebundene Domain (die die Nameserver von Cloudflare verwendet). Die offizielle Setup-Dokumentation nennt dies als Voraussetzung, um eine Anwendung über einen Tunnel zu veröffentlichen.
  • Docker und Docker Compose auf dem Host installiert. Wenn Sie von einem nackten Server ausgehen, behandelt unsere Anleitung für die sichere erste Stunde auf einem VPS das Härten, bevor Sie irgendetwas bereitstellen.
  • Ein Tunnel-Token, das in einem Schritt im Dashboard erstellt wird (nächster Abschnitt).

Cloudflare Tunnel selbst ist kostenlos mit unbegrenzter Bandbreite — Sie benötigen nur das kostenlose Cloudflare-Konto und eine Domain in deren DNS.

Schritt 1 — Einen remote verwalteten Tunnel erstellen und das Token kopieren

Gehen Sie im Cloudflare-Dashboard zu Zero Trust → Networks → Tunnels → Create a tunnel, wählen Sie Cloudflared, benennen Sie ihn und speichern Sie. Wählen Sie auf dem Bildschirm "install connector" die Option Docker. Cloudflare zeigt Ihnen einen docker run-Befehl mit einem eingebetteten langen Token — Sie benötigen nicht den ganzen Befehl, sondern nur die Token-Zeichenkette nach --token. Dieses Token authentifiziert den Connector und teilt ihm zugleich mit, zu welchem Tunnel er gehört.

Dies ist das remote verwaltete Modell: Die Routing-Regeln des Tunnels (welcher Hostname welchem lokalen Dienst zugeordnet ist) werden im Dashboard konfiguriert, nicht in einer lokalen Konfigurationsdatei. Es ist der einfachste Weg für Docker und derjenige, den Cloudflare inzwischen standardmäßig verwendet. Die Alternative, lokal verwaltet, hält eine config.yml und eine Credentials-Datei im Container vor — portabler und versionierbar, aber mit mehr beweglichen Teilen. Die folgende Tabelle vergleicht sie.

Remote verwaltet (Token)Lokal verwaltet (config.yml)
Wo das Routing liegtCloudflare-Dashboardconfig.yml auf dem Host
Was der Container brauchtNur TUNNEL_TOKENConfig-Datei + eingebundenes Credentials-JSON
Am besten geeignet fürDie meisten Docker-Setups, schneller StartGitOps, viele Hostnamen, reproduzierbare Infrastruktur
Ingress-ÄnderungenKlick im DashboardDatei bearbeiten, Container neu starten
Zu schützende GeheimnisseDas TokenDie Credentials-Datei

Schritt 2 — cloudflared zur docker-compose.yml hinzufügen

Hier ist eine minimale Compose-Datei, die einen App-Container (nennen wir ihn webapp, der auf Port 3000 lauscht) über den Tunnel bereitstellt:

services:
  webapp:
    image: your/webapp:latest
    restart: unless-stopped
    networks: [internal]
    # note: no "ports:" — nothing is published to the host

  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}
    networks: [internal]

networks:
  internal:

Legen Sie das Token in eine .env-Datei neben der Compose-Datei ab (TUNNEL_TOKEN=ey...) und fügen Sie diese Datei zu .gitignore hinzu. Committen Sie das Token niemals — wer es besitzt, kann Ihren Tunnel betreiben. Verwenden Sie für ein gehärtetes Setup ein Docker Secret statt einer Umgebungsvariable. Das Flag --no-autoupdate ist Absicht: Der Image-Tag steuert die Version, sodass Sie durch Ziehen eines neuen Images upgraden und nicht, indem Sie den Daemon sich zur Laufzeit selbst patchen lassen.

Der entsprechende einmalige Befehl, falls Sie Compose nicht verwenden, ist derselbe, den das Dashboard ausgibt:

docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TUNNEL_TOKEN>

Schritt 3 — Den Tunnel auf Ihren Container richten (die Falle)

Hier bleiben die meisten hängen, und es findet sich überall in den Cloudflare-Community-Foren. Öffnen Sie im Dashboard erneut Ihren Tunnel, gehen Sie zum Tab Public Hostname und fügen Sie eine Route hinzu: Wählen Sie eine Subdomain (etwa app.yourdomain.com) und legen Sie die service-URL fest.

Der Fehler besteht darin, http://localhost:3000 einzugeben. Innerhalb des cloudflared-Containers ist localhost der cloudflared-Container selbst — nicht Ihre App und nicht der Docker-Host. Weil beide Container das Netzwerk internal teilen, kann cloudflared die App über ihren Compose-Service-Namen auflösen. Der korrekte service-Wert lautet also:

http://webapp:3000

Das eingebaute DNS von Docker ordnet webapp der IP des App-Containers im gemeinsamen Netzwerk zu. Läuft Ihre App an einem anderen Ort als in einem Geschwister-Container — etwa direkt auf dem Host —, würden Sie stattdessen http://host.docker.internal:3000 verwenden (mit dem passenden extra_hosts-Eintrag unter Linux). Diese URL richtig zu treffen, macht 90 % eines funktionierenden Tunnels aus; ein 502 am Edge bedeutet fast immer, dass cloudflared die hier eingetragene Adresse nicht erreichen kann.

Schritt 4 — Hochfahren und überprüfen

docker compose up -d
docker compose logs -f cloudflared

Halten Sie in den Logs nach Zeilen Ausschau, die registrierte Verbindungen zum Edge von Cloudflare bestätigen (in der Regel vier, zu verschiedenen Rechenzentren). Sobald sie stehen, laden Sie https://app.yourdomain.com — TLS wird am Edge von Cloudflare automatisch terminiert, sodass Sie HTTPS erhalten, ohne jemals ein Zertifikat auf Ihrem Server installieren zu müssen. Wenn es nicht auflöst, prüfen Sie, ob der DNS-Eintrag des Public Hostname erstellt wurde (Cloudflare legt für Sie einen proxied CNAME an) und ob die service-URL zu Ihrem Container-Namen und Port passt.

Limits, die man kennen sollte, bevor man sich darauf verlässt

Tunnel sind solide, aber der kostenlose Proxy hat harte Grenzen:

  • 100-MB-Upload-Limit. Die Free- und Pro-Pläne von Cloudflare erzwingen eine maximale Request-Body-Größe von 100 MB. Laden Sie eine größere Datei durch den Tunnel hoch, gibt der Edge HTTP 413 zurück, bevor sie jemals Ihren Container erreicht. Das trifft Datei-Upload-Apps, Backups und große Medien-Posts.
  • Nicht für schweres Media-Streaming. Der Proxy von Cloudflare ist nicht dafür gedacht, große Mengen an Nicht-HTML-Inhalten wie Videobibliotheken auszuliefern; ein selbst gehostetes Plex oder Jellyfin hinter einem Tunnel kann auf Throttling stoßen. Nutzen Sie ihn für Apps und Dashboards, nicht als CDN für eine Filmsammlung.
  • Quick Tunnels sind nur zum Testen. Die Wegwerf-Tunnel trycloudflare.com haben ein Limit von 200 gleichzeitigen Anfragen und unterstützen keine Server-Sent Events. Gut für eine Demo, falsch für die Produktion — verwenden Sie stattdessen einen benannten Tunnel mit Ihrer eigenen Domain.
  • Sie vertrauen dem Edge von Cloudflare. Der gesamte Traffic durchläuft deren Netzwerk. Für die meisten Selbst-Hoster ist das ein akzeptabler Kompromiss für geschlossene eingehende Ports; wenn er es für Ihr Bedrohungsmodell nicht ist, sind ein selbst gehostetes WireGuard oder ein Reverse Proxy die Alternative.

Für eine tiefere Sicherheitsschicht können Sie außerdem Cloudflare Access vor den Hostnamen schalten, sodass nur authentifizierte Benutzer die App erreichen — behandelt in der allgemeinen Tunnel-Anleitung.

Wo das in einen selbst gehosteten Stack passt

Das Docker-Tunnel-Muster glänzt, wenn Sie Ihre Apps ohnehin bereits in Containern betreiben — die Richtung, in die sich das Self-Hosting größtenteils bewegt hat. Kombinieren Sie es mit unserer Schritt-für-Schritt-Anleitung zum Self-Hosting Ihrer Apps auf einem VPS, und cloudflared wird zum einzigen, portablen "Haustür"-Dienst, den Sie in jeden Stack einsetzen. Ein Image, eine Umgebungsvariable, null offene Ports.

Häufig gestellte Fragen

Kann ich cloudflared in docker-compose betreiben?

Ja. Fügen Sie cloudflare/cloudflared:latest als Service mit command: tunnel --no-autoupdate run und einer Umgebungsvariable TUNNEL_TOKEN hinzu, die ein im Cloudflare-Zero-Trust-Dashboard erstelltes Token enthält. Platzieren Sie ihn im selben Docker-Netzwerk wie die App, die Sie bereitstellen, damit er den Container über den Namen erreichen kann.

Wie erreicht cloudflared einen anderen Container?

Über das interne DNS von Docker. Wenn beide Container ein benutzerdefiniertes Netzwerk teilen, löst cloudflared den anderen Container über dessen Compose-Service-Namen auf — die service-URL des Tunnels lautet also http://<service-name>:<port> (zum Beispiel http://webapp:3000), niemals http://localhost:3000, weil localhost innerhalb des Containers auf cloudflared selbst verweist.

Muss ich für einen Cloudflare Tunnel in Docker Ports öffnen?

Nein. cloudflared stellt eine ausschließlich ausgehende Verbindung zum Edge von Cloudflare her, sodass keine eingehenden Ports am Container veröffentlicht oder an der Host-Firewall geöffnet werden. Diese Haltung geschlossener Ports ist der wesentliche Sicherheitsvorteil gegenüber einem klassischen Reverse Proxy.

Ist Cloudflare Tunnel kostenlos?

Ja. Cloudflare Tunnel ist im kostenlosen Plan gratis und mit unbegrenzter Bandbreite; Sie benötigen nur ein kostenloses Cloudflare-Konto und eine Domain, die das DNS von Cloudflare verwendet. Kostenpflichtige Pläne heben einige Proxy-Limits an (etwa das 100-MB-Request-Limit), sind aber nicht erforderlich, um einen Tunnel zu betreiben.

Cloudflare Tunnel oder Reverse Proxy — was sollte ich in Docker verwenden?

Verwenden Sie einen Reverse Proxy (Caddy, Traefik, Nginx), wenn es Ihnen recht ist, 80/443 zu öffnen, und Sie die volle Kontrolle über TLS und Caching auf Ihrem eigenen Server möchten. Verwenden Sie einen Cloudflare Tunnel, wenn Sie lieber jeden eingehenden Port geschlossen halten und Cloudflare TLS und Edge-Routing übernehmen lassen. Viele Stacks betreiben beides: einen Tunnel für den externen Zugriff, einen Proxy für das interne Routing.

Sources

Waqas Ahmed Waseer

Waqas Ahmed Waseer

Waqas Ahmed Waseer ist Entwickler und Automation-Builder mit über 8 Jahren Erfahrung im Aufbau von Produktivsystemen, die von mehr als 100.000 Menschen genutzt werden. Er baut individuelle Multi-Tenant-SaaS, KI-Automatisierung (n8n, LLM-Workflows, WhatsApp-Bots) und Hosting-Infrastruktur (WHM/cPanel, CloudLinux) — und ist der Macher von WaSphere, FlowMaticX und der Hosting-Marke WaseerHost. Über 100 Projekte für KMU, Agenturen und finanzierte Start-ups umgesetzt.

Ähnliche Beiträge

Mehr in Cloud & Hosting

Alle ansehen

Diskussion · 0

Bleib fair. Kommentare sind öffentlich.

    Newsletter · Montagsausgabe

    Der Montagsbrief.

    Eine E-Mail jeden Montagmorgen. Die kommende Woche in KI, Startups, Hosting und Dev-Tools — ohne Schnickschnack, ohne gesponserten Köder.

    Kostenlos. Abmeldung mit einem Klick.