[{"data":1,"prerenderedAt":1133},["ShallowReactive",2],{"navigation":3,"\u002Fde\u002Fblog\u002Fdocker-vs-kubernetes":354,"\u002Fde\u002Fblog\u002Fdocker-vs-kubernetes-surround":1128},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,263,275,306,347],{"title":5,"path":6,"stem":7},"Moderne Website in 5 Minuten erstellen und deployen","\u002Fde\u002Fblog\u002Fbuild-with-loveable","de\u002F3.blog\u002F1.build-with-loveable",{"title":9,"path":10,"stem":11},"Die souveräne Vercel-Alternative für den Mittelstand: Souveränes Hosting auf Hetzner mit lowcloud","\u002Fde\u002Fblog\u002Fdigital-sovereignty-lowcloud-vs-vercel-b2b","de\u002F3.blog\u002F10.digital-sovereignty-lowcloud-vs-vercel-b2b",{"title":13,"path":14,"stem":15},"Cloud Exit Strategie: Warum Unabhängigkeit kein Notfallplan ist","\u002Fde\u002Fblog\u002Fcloud-exit-strategie","de\u002F3.blog\u002F11.cloud-exit-strategie",{"title":17,"path":18,"stem":19},"Cloud Sovereignty Framework: Wie die EU Cloud-Souveränität endlich messbar macht","\u002Fde\u002Fblog\u002Fcloud-sovereignty-framework","de\u002F3.blog\u002F12.cloud-sovereignty-framework",{"title":21,"path":22,"stem":23},"Cloud Vendor Lock-in vermeiden: Was echte Souveränität technisch bedeutet","\u002Fde\u002Fblog\u002Fcloud-vendor-lock-in","de\u002F3.blog\u002F13.cloud-vendor-lock-in",{"title":25,"path":26,"stem":27},"Digitale Souveränität mit Kubernetes: Wann ist Open Source wirklich souverän?","\u002Fde\u002Fblog\u002Fkubernetes-digital-sovereignty","de\u002F3.blog\u002F14.kubernetes-digital-sovereignty",{"title":29,"path":30,"stem":31},"Was ist DevOps as a Service und wann macht es wirklich Sinn?","\u002Fde\u002Fblog\u002Fdevops-as-a-service","de\u002F3.blog\u002F15.devops-as-a-service",{"title":33,"path":34,"stem":35},"Cloud-Souveränität Governance: Warum das Thema aus der IT-Abteilung ins Führungsteam gehört","\u002Fde\u002Fblog\u002Fcloud-souveraenitaet-governance","de\u002F3.blog\u002F16.cloud-souveraenitaet-governance",{"title":37,"path":38,"stem":39},"PaaS vs. DaaS: Was ist der Unterschied und welches Modell passt zu dir?","\u002Fde\u002Fblog\u002Fpaas-vs-daas","de\u002F3.blog\u002F17.paas-vs-daas",{"title":41,"path":42,"stem":43},"Souveräne Cloud: Kann SaaS wirklich die Kontrolle über eure Daten wahren?","\u002Fde\u002Fblog\u002Fsovereign-cloud-saas-data-control","de\u002F3.blog\u002F18.sovereign-cloud-saas-data-control",{"title":45,"path":46,"stem":47},"DevOps vs. DevOps as a Service – Was passt zu deinem Team?","\u002Fde\u002Fblog\u002Fdevops-vs-devops-as-a-service","de\u002F3.blog\u002F19.devops-vs-devops-as-a-service",{"title":49,"path":50,"stem":51},"Docker Grundlagen: Wie Container-Virtualisierung funktioniert","\u002Fde\u002Fblog\u002Fhow-docker-works","de\u002F3.blog\u002F2.how-docker-works",{"title":53,"path":54,"stem":55},"Die 7 größten DevOps-Probleme in KMU – und wie du sie löst","\u002Fde\u002Fblog\u002Fdevops-problems-smb","de\u002F3.blog\u002F20.devops-problems-smb",{"title":57,"path":58,"stem":59},"PostgreSQL Helm Chart: So deployst du Postgres auf Kubernetes","\u002Fde\u002Fblog\u002Fpostgresql-helm-chart-kubernetes","de\u002F3.blog\u002F21.postgresql-helm-chart-kubernetes",{"title":61,"path":62,"stem":63},"Platform Engineering vs. DevOps – Wo liegt der Unterschied?","\u002Fde\u002Fblog\u002Fplatform-engineering-vs-devops","de\u002F3.blog\u002F22.platform-engineering-vs-devops",{"title":65,"path":66,"stem":67},"Cloud Act vs. DSGVO: Das Risiko für EU-Unternehmen","\u002Fde\u002Fblog\u002Fcloud-act-vs-gdpr","de\u002F3.blog\u002F23.cloud-act-vs-gdpr",{"title":69,"path":70,"stem":71},"IT-Kosten senken durch Automatisierung: Der größte Hebel","\u002Fde\u002Fblog\u002Freduce-it-costs-automation","de\u002F3.blog\u002F24.reduce-it-costs-automation",{"title":73,"path":74,"stem":75},"NIS2 Compliance für DevOps-Teams: Was jetzt zu tun ist","\u002Fde\u002Fblog\u002Fnis2-compliance-devops","de\u002F3.blog\u002F25.nis2-compliance-devops",{"title":77,"path":78,"stem":79},"Self-Hosted EU Alternativen: LibreOffice & Co. hosten","\u002Fde\u002Fblog\u002Fself-hosted-eu-alternatives","de\u002F3.blog\u002F26.self-hosted-eu-alternatives",{"title":81,"path":82,"stem":83},"DORA Compliance für DevOps: Was der EU-Resilienz-Act bedeutet","\u002Fde\u002Fblog\u002Fdora-compliance-devops","de\u002F3.blog\u002F27.dora-compliance-devops",{"title":85,"path":86,"stem":87},"Cloud TCO: Versteckte Kosten, die AWS, Azure & GCP nicht zeigen","\u002Fde\u002Fblog\u002Fcloud-tco-hidden-costs","de\u002F3.blog\u002F28.cloud-tco-hidden-costs",{"title":89,"path":90,"stem":91},"Datenresidenz vs. Datensouveränität: Wo der Unterschied liegt","\u002Fde\u002Fblog\u002Fdata-residency-vs-data-sovereignty","de\u002F3.blog\u002F29.data-residency-vs-data-sovereignty",{"title":93,"path":94,"stem":95},"n8n selbst hosten auf Hetzner: Komplette Docker-Anleitung","\u002Fde\u002Fblog\u002Fself-hosted-n8n-on-hetzner","de\u002F3.blog\u002F3.self-hosted-n8n-on-hetzner",{"title":97,"path":98,"stem":99},"Manuelle Deployments: Unterschätztes Risiko im Mittelstand","\u002Fde\u002Fblog\u002Fmanual-deployment-risks","de\u002F3.blog\u002F30.manual-deployment-risks",{"title":101,"path":102,"stem":103},"DevOps Tool-Chaos: So entsteht und stoppst du Tool-Sprawl","\u002Fde\u002Fblog\u002Fdevops-tool-sprawl","de\u002F3.blog\u002F31.devops-tool-sprawl",{"title":105,"path":106,"stem":107},"Kubernetes Monitoring: Logs und Metriken richtig einsetzen","\u002Fde\u002Fblog\u002Fkubernetes-monitoring-logs-metrics","de\u002F3.blog\u002F32.kubernetes-monitoring-logs-metrics",{"title":109,"path":110,"stem":111},"OB7 Case Study: Website-Deployment ohne Infrastruktur-Aufwand","\u002Fde\u002Fblog\u002Fob7-case-study-lowcloud-deployment","de\u002F3.blog\u002F33.ob7-case-study-lowcloud-deployment",{"title":113,"path":114,"stem":115},"DevOps in KMU: Warum fehlende Rollen zum echten Risiko werden","\u002Fde\u002Fblog\u002Fmissing-devops-roles-smb","de\u002F3.blog\u002F34.missing-devops-roles-smb",{"title":117,"path":118,"stem":119},"Kubernetes Konfiguration vereinfachen: Human-Readable Cloud","\u002Fde\u002Fblog\u002Fsimplify-kubernetes-configuration","de\u002F3.blog\u002F35.simplify-kubernetes-configuration",{"title":121,"path":122,"stem":123},"Collaborative DevOps: Cloud-Apps gemeinsam bauen","\u002Fde\u002Fblog\u002Fcollaborative-devops-teams","de\u002F3.blog\u002F36.collaborative-devops-teams",{"title":125,"path":126,"stem":127},"Wissensdokumentation in DevOps-Teams: Bus-Faktor senken","\u002Fde\u002Fblog\u002Fdevops-knowledge-documentation-bus-factor","de\u002F3.blog\u002F37.devops-knowledge-documentation-bus-factor",{"title":129,"path":130,"stem":131},"Was ist PaaS? Platform as a Service einfach erklärt","\u002Fde\u002Fblog\u002Fwhat-is-paas","de\u002F3.blog\u002F38.what-is-paas",{"title":133,"path":134,"stem":135},"EU AI Act Hosting: Was sich für KI-Workloads ändert","\u002Fde\u002Fblog\u002Feu-ai-act-hosting","de\u002F3.blog\u002F39.eu-ai-act-hosting",{"title":137,"path":138,"stem":139},"Docker Compose Tutorial: Multi-Container-Apps einfach verwalten","\u002Fde\u002Fblog\u002Fdocker-compose-for-beginners","de\u002F3.blog\u002F4.docker-compose-for-beginners",{"title":141,"path":142,"stem":143},"Full-Stack Developer: Was der Begriff wirklich bedeutet","\u002Fde\u002Fblog\u002Ffull-stack-developer-reality","de\u002F3.blog\u002F40.full-stack-developer-reality",{"title":145,"path":146,"stem":147},"Cloud Egress Fees im Vergleich: AWS vs. Azure vs. GCP Preise","\u002Fde\u002Fblog\u002Fcloud-egress-fees","de\u002F3.blog\u002F41.cloud-egress-fees",{"title":149,"path":150,"stem":151},"Bring Your Own Cloud: Was das Modell bedeutet und warum es Fahrt aufnimmt","\u002Fde\u002Fblog\u002Fbring-your-own-cloud","de\u002F3.blog\u002F42.bring-your-own-cloud",{"title":153,"path":154,"stem":155},"Zero-Config Kubernetes: Warum Einfachheit gewinnt","\u002Fde\u002Fblog\u002Fzero-config-kubernetes","de\u002F3.blog\u002F43.zero-config-kubernetes",{"title":157,"path":158,"stem":159},"Minimalistische Cloud-Architektur: Weniger ist stabiler","\u002Fde\u002Fblog\u002Fminimalist-cloud-architecture","de\u002F3.blog\u002F44.minimalist-cloud-architecture",{"title":161,"path":162,"stem":163},"Software Deployment KMU: Schneller und sicherer ausrollen","\u002Fde\u002Fblog\u002Fsmb-software-deployment","de\u002F3.blog\u002F45.smb-software-deployment",{"title":165,"path":166,"stem":167},"EU Data Act: Was Unternehmen und DevOps-Teams wissen müssen","\u002Fde\u002Fblog\u002Feu-data-act-business-devops","de\u002F3.blog\u002F46.eu-data-act-business-devops",{"title":169,"path":170,"stem":171},"Data Governance Act: Was KMU und DevOps-Teams wissen müssen","\u002Fde\u002Fblog\u002Fdata-governance-act-devops-guide","de\u002F3.blog\u002F47.data-governance-act-devops-guide",{"title":173,"path":174,"stem":175},"Cloud agnostisch: Bedeutung und praktische Umsetzung","\u002Fde\u002Fblog\u002Fcloud-agnostic-architecture","de\u002F3.blog\u002F48.cloud-agnostic-architecture",{"title":177,"path":178,"stem":179},"Kubernetes Migration: Was du wissen musst, bevor du anfängst","\u002Fde\u002Fblog\u002Fkubernetes-migration-guide","de\u002F3.blog\u002F49.kubernetes-migration-guide",{"title":181,"path":182,"stem":183},"Docmost selbst hosten mit Docker Compose und Traefik: Komplette Anleitung","\u002Fde\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik","de\u002F3.blog\u002F5.self-host-docmost-with-docker-and-traefik",{"title":185,"path":186,"stem":187},"AI Agenten Infrastruktur: Was du für Produktion brauchst","\u002Fde\u002Fblog\u002Fai-agent-infrastructure","de\u002F3.blog\u002F50.ai-agent-infrastructure",{"title":189,"path":190,"stem":191},"ROI von Managed Services: Warum Eigenbetrieb oft teurer ist","\u002Fde\u002Fblog\u002Fmanaged-services-roi","de\u002F3.blog\u002F51.managed-services-roi",{"title":193,"path":194,"stem":195},"lowcloud vs. DevOps-as-a-Service-Anbieter im Vergleich","\u002Fde\u002Fblog\u002Flowcloud-vs-devops-service-providers","de\u002F3.blog\u002F52.lowcloud-vs-devops-service-providers",{"title":197,"path":198,"stem":199},"Kubernetes vs. Docker Swarm: Unterschiede und warum K8s gewonnen hat","\u002Fde\u002Fblog\u002Fkubernetes-vs-docker-swarm","de\u002F3.blog\u002F53.kubernetes-vs-docker-swarm",{"title":201,"path":202,"stem":203},"Hetzner Kubernetes Hosting mit lowcloud","\u002Fde\u002Fblog\u002Fhetzner-kubernetes-hosting","de\u002F3.blog\u002F54.hetzner-kubernetes-hosting",{"title":205,"path":206,"stem":207},"MinIO Alternativen im Vergleich: RustFS, SeaweedFS und Garage","\u002Fde\u002Fblog\u002Fminio-alternatives","de\u002F3.blog\u002F55.minio-alternatives",{"title":209,"path":210,"stem":211},"Was ist Docker Swarm? Container-Orchestrierung mit Bordmitteln","\u002Fde\u002Fblog\u002Fwhat-is-docker-swarm","de\u002F3.blog\u002F56.what-is-docker-swarm",{"title":213,"path":214,"stem":215},"Was ist ein Helm Chart? Der Paketmanager für Kubernetes","\u002Fde\u002Fblog\u002Fwhat-is-a-helm-chart","de\u002F3.blog\u002F57.what-is-a-helm-chart",{"title":217,"path":218,"stem":219},"Docker vs Kubernetes: Compose, Swarm und K8s im Vergleich","\u002Fde\u002Fblog\u002Fdocker-vs-kubernetes","de\u002F3.blog\u002F58.docker-vs-kubernetes",{"title":221,"path":222,"stem":223},"Was ist Kustomize? Kubernetes-Configs sauber verwalten","\u002Fde\u002Fblog\u002Fwhat-is-kustomize","de\u002F3.blog\u002F59.what-is-kustomize",{"title":225,"path":226,"stem":227},"Was ist Kubernetes? Container-Orchestrierung verständlich erklärt","\u002Fde\u002Fblog\u002Fwhat-is-kubernetes","de\u002F3.blog\u002F6.what-is-kubernetes",{"title":229,"path":230,"stem":231},"Die besten Heroku-Alternativen 2026","\u002Fde\u002Fblog\u002Fheroku-alternatives","de\u002F3.blog\u002F60.heroku-alternatives",{"title":233,"path":234,"stem":235},"Die Cloud-Illusion: Warum ein Serverstandort in Deutschland noch keine digitale Souveränität macht","\u002Fde\u002Fblog\u002Fcloud-illusion-digitale-souveraenitaet","de\u002F3.blog\u002F7.cloud-illusion-digitale-souveraenitaet",{"title":237,"path":238,"stem":239},"S3-kompatibler Objektspeicher: Die besten Anbieter im Vergleich (2026)","\u002Fde\u002Fblog\u002Fs3-compatible-object-storage","de\u002F3.blog\u002F8.s3-compatible-object-storage",{"title":241,"path":242,"stem":243},"Deployment als Bottleneck: Wenn KI schneller coden kann als du deployen kannst","\u002Fde\u002Fblog\u002Fdeployment-bottleneck","de\u002F3.blog\u002F9.deployment-bottleneck",{"title":245,"path":246,"stem":247,"children":248,"icon":262},"Getting Started","\u002Fde\u002Fdocs\u002Fgetting-started","de\u002F1.docs\u002F1.getting-started\u002F1.index",[249,252,257],{"title":250,"path":246,"stem":247,"icon":251},"Einführung","i-lucide-house",{"title":253,"path":254,"stem":255,"icon":256},"Erste Schritte","\u002Fde\u002Fdocs\u002Fgetting-started\u002Fget-started","de\u002F1.docs\u002F1.getting-started\u002F2.get-started","i-lucide-rocket",{"title":258,"path":259,"stem":260,"icon":261},"Funktionsweise","\u002Fde\u002Fdocs\u002Fgetting-started\u002Fhow-it-works","de\u002F1.docs\u002F1.getting-started\u002F3.how-it-works","i-lucide-lightbulb",false,{"title":264,"path":265,"stem":266,"children":267,"icon":262},"Guides","\u002Fde\u002Fdocs\u002Fguides","de\u002F1.docs\u002F2.guides\u002F1.index",[268,270],{"title":264,"path":265,"stem":266,"icon":269},"i-lucide-book-open",{"title":271,"path":272,"stem":273,"icon":274},"Container Registry verbinden","\u002Fde\u002Fdocs\u002Fguides\u002Fcontainer-registries","de\u002F1.docs\u002F2.guides\u002F2.container-registries","i-lucide-container",{"title":276,"path":277,"stem":278,"children":279,"icon":262},"App Services","\u002Fde\u002Fdocs\u002Fapp-services","de\u002F1.docs\u002F3.app-services\u002F1.index",[280,281,286,291,296,301],{"title":276,"path":277,"stem":278,"icon":256},{"title":282,"path":283,"stem":284,"icon":285},"Build Settings","\u002Fde\u002Fdocs\u002Fapp-services\u002Fbuild-settings","de\u002F1.docs\u002F3.app-services\u002F2.build-settings","i-lucide-settings",{"title":287,"path":288,"stem":289,"icon":290},"Env Variables","\u002Fde\u002Fdocs\u002Fapp-services\u002Fenvironment-variables","de\u002F1.docs\u002F3.app-services\u002F3.environment-variables","i-lucide-key",{"title":292,"path":293,"stem":294,"icon":295},"Custom Domains","\u002Fde\u002Fdocs\u002Fapp-services\u002Fcustom-domains","de\u002F1.docs\u002F3.app-services\u002F4.custom-domains","i-lucide-globe",{"title":297,"path":298,"stem":299,"icon":300},"Health Checks","\u002Fde\u002Fdocs\u002Fapp-services\u002Fhealth-checks","de\u002F1.docs\u002F3.app-services\u002F5.health-checks","i-lucide-heart-pulse",{"title":302,"path":303,"stem":304,"icon":305},"Autoscaling","\u002Fde\u002Fdocs\u002Fapp-services\u002Fautoscaling","de\u002F1.docs\u002F3.app-services\u002F6.autoscaling","i-lucide-scaling",{"title":307,"path":308,"stem":309,"children":310,"icon":262},"Helm Releases","\u002Fde\u002Fdocs\u002Fhelm-releases","de\u002F1.docs\u002F4.helm-releases\u002F1.index",[311,313,318,323,327,332,337,342],{"title":307,"path":308,"stem":309,"icon":312},"i-lucide-package",{"title":314,"path":315,"stem":316,"icon":317},"PostgreSQL deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-postgresql","de\u002F1.docs\u002F4.helm-releases\u002F2.deploy-postgresql","i-lucide-database",{"title":319,"path":320,"stem":321,"icon":322},"Redis deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-redis","de\u002F1.docs\u002F4.helm-releases\u002F3.deploy-redis","i-lucide-zap",{"title":324,"path":325,"stem":326,"icon":322},"Valkey deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-valkey","de\u002F1.docs\u002F4.helm-releases\u002F3.deploy-valkey",{"title":328,"path":329,"stem":330,"icon":331},"n8n deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-n8n","de\u002F1.docs\u002F4.helm-releases\u002F4.deploy-n8n","i-lucide-workflow",{"title":333,"path":334,"stem":335,"icon":336},"RustFS deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-rustfs","de\u002F1.docs\u002F4.helm-releases\u002F5.deploy-rustfs","i-lucide-hard-drive",{"title":338,"path":339,"stem":340,"icon":341},"OpenSearch deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-opensearch","de\u002F1.docs\u002F4.helm-releases\u002F6.deploy-opensearch","i-lucide-search",{"title":343,"path":344,"stem":345,"icon":346},"Keycloak deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-keycloak","de\u002F1.docs\u002F4.helm-releases\u002F7.deploy-keycloak","i-lucide-shield-check",{"title":348,"path":349,"stem":350,"children":351,"icon":262},"Glossar","\u002Fde\u002Fdocs\u002Fglossary","de\u002F1.docs\u002F5.glossary\u002F1.index",[352],{"title":348,"path":349,"stem":350,"icon":353},"i-lucide-book-a",{"id":355,"title":217,"authors":356,"badge":362,"body":363,"date":1120,"description":1121,"extension":1122,"image":1123,"lastUpdated":362,"meta":1125,"navigation":686,"path":218,"published":686,"seo":1126,"stem":219,"tags":362,"__hash__":1127},"posts_de\u002Fde\u002F3.blog\u002F58.docker-vs-kubernetes.md",[357],{"name":358,"to":359,"avatar":360},"Thomas Ens","\u002Fabout\u002Fthomasens",{"src":361},"\u002Fimages\u002Fblog\u002Fauthors\u002Fthomas.jpeg",null,{"type":364,"value":365,"toc":1104},"minimark",[366,389,392,397,404,412,416,421,461,464,469,563,568,572,582,586,761,772,779,785,789,800,834,837,840,846,850,853,860,863,882,888,990,993,997,1004,1023,1034,1039,1055,1059,1062,1065,1068,1072,1075,1097,1100],[367,368,369,370,377,378,382,383,388],"p",{},"Wer mit ",[371,372,376],"a",{"href":373,"rel":374},"https:\u002F\u002Fwww.docker.com\u002F",[375],"nofollow","Docker"," anfängt, startet meistens mit einem einfachen ",[379,380,381],"code",{},"docker run",". Irgendwann kommen mehr Container dazu, dann vielleicht eine Compose-Datei, und spätestens wenn das Team über Produktion redet, fällt das Wort ",[371,384,387],{"href":385,"rel":386},"https:\u002F\u002Fkubernetes.io\u002F",[375],"Kubernetes",". An diesem Punkt herrscht oft Verwirrung darüber, was eigentlich was kann und welches Tool für welchen Zweck gebaut wurde.",[367,390,391],{},"Dieser Artikel stellt Docker, Docker Compose, Docker Swarm und Kubernetes direkt nebeneinander. Nicht mit dem Ziel, einen Gewinner zu küren, sondern um die Entscheidung einfacher zu machen: Welches Tool passt zu welchem Problem?",[393,394,396],"h2",{"id":395},"was-docker-eigentlich-ist-und-was-nicht","Was Docker eigentlich ist und was nicht",[367,398,399,400,403],{},"Docker ist eine ",[371,401,402],{"href":50},"Containerisierungsplattform",". Es sorgt dafür, dass Anwendungen in isolierten, reproduzierbaren Umgebungen laufen – unabhängig davon, ob das der Laptop des Entwicklers oder ein Server im Rechenzentrum ist. Ein Docker-Image enthält den Anwendungscode, alle Abhängigkeiten und die Laufzeitumgebung. Aus einem Image wird ein Container, wenn es gestartet wird.",[367,405,406,407,411],{},"Was Docker von Haus aus ",[408,409,410],"em",{},"nicht"," ist: ein Orchestrierungssystem. Docker selbst kümmert sich nicht darum, wie Container über mehrere Hosts verteilt werden, wie sie bei Ausfall neu gestartet werden oder wie Traffic zwischen ihnen verteilt wird. Dafür braucht man entweder Docker Swarm oder Kubernetes, je nach Anforderung.",[393,413,415],{"id":414},"docker-run-der-direkte-weg-zum-container","docker run – der direkte Weg zum Container",[367,417,418,420],{},[379,419,381],{}," ist der einfachste Weg, einen Container zu starten. Wer ein Image lokal testen will, kommt damit sofort ans Ziel:",[422,423,428],"pre",{"className":424,"code":425,"language":426,"meta":427,"style":427},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker run -d -p 8080:80 --name mein-nginx nginx:latest\n","bash","",[379,429,430],{"__ignoreMap":427},[431,432,435,439,443,446,449,452,455,458],"span",{"class":433,"line":434},"line",1,[431,436,438],{"class":437},"sBMFI","docker",[431,440,442],{"class":441},"sfazB"," run",[431,444,445],{"class":441}," -d",[431,447,448],{"class":441}," -p",[431,450,451],{"class":441}," 8080:80",[431,453,454],{"class":441}," --name",[431,456,457],{"class":441}," mein-nginx",[431,459,460],{"class":441}," nginx:latest\n",[367,462,463],{},"Das startet nginx im Hintergrund, mappt Port 8080 des Hosts auf Port 80 im Container und gibt dem Container einen Namen.",[465,466,468],"h3",{"id":467},"wichtige-flags-im-überblick","Wichtige Flags im Überblick",[470,471,472,485],"table",{},[473,474,475],"thead",{},[476,477,478,482],"tr",{},[479,480,481],"th",{},"Flag",[479,483,484],{},"Bedeutung",[486,487,488,499,509,519,533,543,553],"tbody",{},[476,489,490,496],{},[491,492,493],"td",{},[379,494,495],{},"-d",[491,497,498],{},"Container im Hintergrund starten (detached)",[476,500,501,506],{},[491,502,503],{},[379,504,505],{},"-p host:container",[491,507,508],{},"Port-Mapping",[476,510,511,516],{},[491,512,513],{},[379,514,515],{},"-v host:container",[491,517,518],{},"Volume mounten",[476,520,521,530],{},[491,522,523,526,527],{},[379,524,525],{},"--env"," oder ",[379,528,529],{},"-e",[491,531,532],{},"Umgebungsvariable setzen",[476,534,535,540],{},[491,536,537],{},[379,538,539],{},"--rm",[491,541,542],{},"Container nach dem Stoppen automatisch löschen",[476,544,545,550],{},[491,546,547],{},[379,548,549],{},"--name",[491,551,552],{},"Container einen Namen geben",[476,554,555,560],{},[491,556,557],{},[379,558,559],{},"--network",[491,561,562],{},"Container einem Netzwerk zuweisen",[367,564,565,567],{},[379,566,381],{}," eignet sich für einzelne Container, schnelle Tests und lokale Experimente. Sobald mehrere Container zusammenarbeiten müssen, wird es unhandlich, dann kommt Compose ins Spiel.",[393,569,571],{"id":570},"docker-compose-wenn-ein-container-nicht-reicht","Docker Compose – wenn ein Container nicht reicht",[367,573,574,575,578,579,581],{},"Docker Compose löst das Problem, ",[371,576,577],{"href":138},"mehrere Container als zusammenhängendes System"," zu definieren und zu starten. Statt einer langen Reihe von ",[379,580,381],{},"-Befehlen mit Flags gibt es eine einzige YAML-Datei:",[465,583,585],{"id":584},"ein-typisches-compose-file","Ein typisches Compose-File",[422,587,591],{"className":588,"code":589,"language":590,"meta":427,"style":427},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","services:\n  app:\n    image: meine-app:latest\n    ports:\n      - \"3000:3000\"\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fuser:pass@db:5432\u002Fmydb\n    depends_on:\n      - db\n\n  db:\n    image: postgres:15\n    volumes:\n      - pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    environment:\n      POSTGRES_PASSWORD: pass\n\nvolumes:\n  pgdata:\n","yaml",[379,592,593,603,611,623,631,646,654,665,673,681,688,696,706,714,722,729,740,745,753],{"__ignoreMap":427},[431,594,595,599],{"class":433,"line":434},[431,596,598],{"class":597},"swJcz","services",[431,600,602],{"class":601},"sMK4o",":\n",[431,604,606,609],{"class":433,"line":605},2,[431,607,608],{"class":597},"  app",[431,610,602],{"class":601},[431,612,614,617,620],{"class":433,"line":613},3,[431,615,616],{"class":597},"    image",[431,618,619],{"class":601},":",[431,621,622],{"class":441}," meine-app:latest\n",[431,624,626,629],{"class":433,"line":625},4,[431,627,628],{"class":597},"    ports",[431,630,602],{"class":601},[431,632,634,637,640,643],{"class":433,"line":633},5,[431,635,636],{"class":601},"      -",[431,638,639],{"class":601}," \"",[431,641,642],{"class":441},"3000:3000",[431,644,645],{"class":601},"\"\n",[431,647,649,652],{"class":433,"line":648},6,[431,650,651],{"class":597},"    environment",[431,653,602],{"class":601},[431,655,657,660,662],{"class":433,"line":656},7,[431,658,659],{"class":597},"      DATABASE_URL",[431,661,619],{"class":601},[431,663,664],{"class":441}," postgres:\u002F\u002Fuser:pass@db:5432\u002Fmydb\n",[431,666,668,671],{"class":433,"line":667},8,[431,669,670],{"class":597},"    depends_on",[431,672,602],{"class":601},[431,674,676,678],{"class":433,"line":675},9,[431,677,636],{"class":601},[431,679,680],{"class":441}," db\n",[431,682,684],{"class":433,"line":683},10,[431,685,687],{"emptyLinePlaceholder":686},true,"\n",[431,689,691,694],{"class":433,"line":690},11,[431,692,693],{"class":597},"  db",[431,695,602],{"class":601},[431,697,699,701,703],{"class":433,"line":698},12,[431,700,616],{"class":597},[431,702,619],{"class":601},[431,704,705],{"class":441}," postgres:15\n",[431,707,709,712],{"class":433,"line":708},13,[431,710,711],{"class":597},"    volumes",[431,713,602],{"class":601},[431,715,717,719],{"class":433,"line":716},14,[431,718,636],{"class":601},[431,720,721],{"class":441}," pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[431,723,725,727],{"class":433,"line":724},15,[431,726,651],{"class":597},[431,728,602],{"class":601},[431,730,732,735,737],{"class":433,"line":731},16,[431,733,734],{"class":597},"      POSTGRES_PASSWORD",[431,736,619],{"class":601},[431,738,739],{"class":441}," pass\n",[431,741,743],{"class":433,"line":742},17,[431,744,687],{"emptyLinePlaceholder":686},[431,746,748,751],{"class":433,"line":747},18,[431,749,750],{"class":597},"volumes",[431,752,602],{"class":601},[431,754,756,759],{"class":433,"line":755},19,[431,757,758],{"class":597},"  pgdata",[431,760,602],{"class":601},[367,762,763,764,767,768,771],{},"Mit ",[379,765,766],{},"docker compose up -d"," startet der gesamte Stack. Compose kümmert sich dabei um die Reihenfolge (dank ",[379,769,770],{},"depends_on","), das gemeinsame Netzwerk zwischen den Containern und das Management von Volumes.",[367,773,774,778],{},[775,776,777],"strong",{},"Wo Compose glänzt:"," lokale Entwicklung, CI\u002FCD-Pipelines, kleine Deployments auf einem einzelnen Server. Das Tool ist schnell zu lernen, die Konfiguration ist übersichtlich, und mit einer einzigen Datei hat man die komplette Umgebung beschrieben.",[367,780,781,784],{},[775,782,783],{},"Wo Compose an Grenzen stößt:"," Compose ist auf einen einzelnen Host ausgelegt. Kein automatisches Failover über mehrere Server, kein eingebautes Load Balancing zwischen Hosts, keine automatische Skalierung. Für alles, was über eine Maschine hinausgeht, braucht man etwas anderes.",[393,786,788],{"id":787},"docker-swarm-cluster-ohne-kubernetes-komplexität","Docker Swarm – Cluster ohne Kubernetes-Komplexität",[367,790,791,792,795,796,799],{},"Docker Swarm ist das ",[371,793,794],{"href":210},"native Clustering-Feature von Docker",". Mit einem ",[379,797,798],{},"docker swarm init"," wird eine Maschine zum Manager-Node, weitere Nodes können per Token beitreten. Danach können Services definiert werden – also Container, die über den Cluster verteilt laufen:",[422,801,803],{"className":424,"code":802,"language":426,"meta":427,"style":427},"docker service create --replicas 3 -p 80:80 --name web nginx:latest\n",[379,804,805],{"__ignoreMap":427},[431,806,807,809,812,815,818,822,824,827,829,832],{"class":433,"line":434},[431,808,438],{"class":437},[431,810,811],{"class":441}," service",[431,813,814],{"class":441}," create",[431,816,817],{"class":441}," --replicas",[431,819,821],{"class":820},"sbssI"," 3",[431,823,448],{"class":441},[431,825,826],{"class":441}," 80:80",[431,828,454],{"class":441},[431,830,831],{"class":441}," web",[431,833,460],{"class":441},[367,835,836],{},"Swarm kümmert sich darum, dass zu jedem Zeitpunkt drei Replikas laufen. Fällt ein Node aus, werden die betroffenen Container auf anderen Nodes neu gestartet. Rolling Updates sind ebenfalls eingebaut.",[367,838,839],{},"Das Besondere an Swarm: Wer Compose kennt, kennt auch Swarm fast schon. Compose-Dateien lassen sich mit minimalen Anpassungen als Swarm-Stacks deployen. Das macht den Einstieg sehr niedrigschwellig.",[367,841,842,845],{},[775,843,844],{},"Der Haken:"," Das Swarm-Ökosystem ist in den letzten Jahren deutlich kleiner geworden. Viele Tools, Integrationen und Cloud-Provider haben sich auf Kubernetes konzentriert. Swarm ist technisch solide, aber wer in Richtung Produktion denkt, muss abwägen, ob das langfristig trägt.",[393,847,849],{"id":848},"docker-vs-kubernetes-der-eigentliche-vergleich","Docker vs Kubernetes – der eigentliche Vergleich",[367,851,852],{},"Kubernetes ist heute die Standardantwort auf die Frage nach Container-Orchestrierung in Produktion. Das stimmt, aber es ist kein Tool, das man mal eben nebenbei einführt.",[367,854,855,856,859],{},"Der zentrale Unterschied zu Swarm: Kubernetes ist kein Feature von Docker, sondern ein eigenständiges System mit eigener API, eigenem CLI (",[379,857,858],{},"kubectl",") und einem deutlich umfangreicheren Konzeptmodell. Statt Services gibt es Pods, Deployments, ReplicaSets, StatefulSets, DaemonSets. Statt einfachen Port-Mappings gibt es Services vom Typ ClusterIP, NodePort oder LoadBalancer, plus Ingress-Ressourcen für HTTP-Routing.",[367,861,862],{},"Das klingt erst mal nach Overhead und das ist es auch, wenn man nur einen Stack mit drei Containern betreiben will. Aber Kubernetes zahlt sich aus, sobald folgendes zutrifft:",[864,865,866,870,873,876,879],"ul",{},[867,868,869],"li",{},"Die Infrastruktur läuft über mehrere Nodes",[867,871,872],{},"Automatisches Scaling ist gefragt (Horizontal Pod Autoscaler)",[867,874,875],{},"Komplexes Netzwerk- und Zugriffsmanagement (RBAC, NetworkPolicies)",[867,877,878],{},"CI\u002FCD-Pipelines sollen direkt mit der Infrastruktur interagieren",[867,880,881],{},"Monitoring, Logging und Observability müssen tief integriert sein",[465,883,885],{"id":884},"wann-reicht-swarm-wann-braucht-man-kubernetes",[371,886,887],{"href":198},"Wann reicht Swarm, wann braucht man Kubernetes?",[470,889,890,905],{},[473,891,892],{},[476,893,894,897,900,903],{},[479,895,896],{},"Kriterium",[479,898,899],{},"Docker Compose",[479,901,902],{},"Docker Swarm",[479,904,387],{},[486,906,907,921,935,949,963,977],{},[476,908,909,912,915,918],{},[491,910,911],{},"Anzahl Hosts",[491,913,914],{},"1",[491,916,917],{},"2–10",[491,919,920],{},"beliebig",[476,922,923,926,929,932],{},[491,924,925],{},"Lernkurve",[491,927,928],{},"niedrig",[491,930,931],{},"mittel",[491,933,934],{},"hoch",[476,936,937,940,943,946],{},[491,938,939],{},"Produktionsreife",[491,941,942],{},"begrenzt",[491,944,945],{},"gut für einfache Cases",[491,947,948],{},"sehr gut",[476,950,951,954,957,960],{},[491,952,953],{},"Ökosystem",[491,955,956],{},"groß (lokal)",[491,958,959],{},"kleiner werdend",[491,961,962],{},"sehr groß",[476,964,965,968,971,974],{},[491,966,967],{},"Automatisches Scaling",[491,969,970],{},"nein",[491,972,973],{},"manuell",[491,975,976],{},"ja (HPA)",[476,978,979,982,984,987],{},[491,980,981],{},"Managed-Angebote",[491,983,970],{},[491,985,986],{},"selten",[491,988,989],{},"überall verfügbar",[367,991,992],{},"Für ein kleines Team, das eine Handvoll Services betreibt und keine Lust auf Kubernetes-Komplexität hat, ist Swarm eine valide Wahl. Für alles, was in Richtung Skalierung, Multi-Team-Betrieb oder Cloud-native Architektur geht, ist Kubernetes der realistischere Weg.",[393,994,996],{"id":995},"von-compose-zu-kubernetes-migrieren","Von Compose zu Kubernetes migrieren",[367,998,999,1000,1003],{},"Wenn ein Projekt mit Compose gestartet wurde und irgendwann ",[371,1001,1002],{"href":178},"auf Kubernetes migriert werden"," soll, gibt es mit Kompose ein offizielles Tool, das Compose-Dateien in Kubernetes-Manifeste umwandelt:",[422,1005,1007],{"className":424,"code":1006,"language":426,"meta":427,"style":427},"kompose convert -f docker-compose.yml\n",[379,1008,1009],{"__ignoreMap":427},[431,1010,1011,1014,1017,1020],{"class":433,"line":434},[431,1012,1013],{"class":437},"kompose",[431,1015,1016],{"class":441}," convert",[431,1018,1019],{"class":441}," -f",[431,1021,1022],{"class":441}," docker-compose.yml\n",[367,1024,1025,1026,1029,1030,1033],{},"Das Ergebnis sind ",[379,1027,1028],{},"Deployment","- und ",[379,1031,1032],{},"Service","-Manifeste, die als Ausgangspunkt dienen können. Direkt produktionsreif sind sie meistens nicht – Ressourcenlimits, Liveness Probes, ConfigMaps und Secrets müssen manuell ergänzt werden. Aber als Einstiegspunkt spart Kompose erheblich Zeit.",[367,1035,1036],{},[775,1037,1038],{},"Typische Stolperstellen bei der Migration:",[864,1040,1041,1046,1049,1052],{},[867,1042,1043,1045],{},[379,1044,770],{}," gibt es in Kubernetes nicht, Readiness Probes übernehmen diese Aufgabe",[867,1047,1048],{},"Volumes müssen als PersistentVolumeClaims definiert werden",[867,1050,1051],{},"Umgebungsvariablen sollten in ConfigMaps oder Secrets ausgelagert werden, nicht direkt im Deployment-Manifest stehen",[867,1053,1054],{},"Netzwerkkommunikation zwischen Services läuft über Kubernetes-Service-Namen, nicht über Container-Namen",[393,1056,1058],{"id":1057},"managed-kubernetes-als-alternative-zum-selbstbetrieb","Managed Kubernetes als Alternative zum Selbstbetrieb",[367,1060,1061],{},"Kubernetes selbst zu betreiben ist eine eigene Disziplin. Control Plane hochziehen, etcd-Cluster absichern, Upgrades durchführen, Node-Probleme debuggen, das bindet Kapazitäten, die in vielen Teams besser in die eigentliche Produktentwicklung fließen würden.",[367,1063,1064],{},"Managed Kubernetes, also Kubernetes-Cluster, die von einem Provider betrieben werden, löst dieses Problem zum Teil. GKE, EKS und AKS nehmen einem den Control Plane ab. Die eigentliche Frage ist dann: Wie viel Kubernetes-Wissen und -Betrieb will man trotzdem selbst verantworten?",[367,1066,1067],{},"Wer den Betrieb noch weiter abstrahieren will, kann auf DevOps-as-a-Service-Plattformen (DaaS) setzen, die Kubernetes als Grundlage nutzen, aber eine vereinfachte Oberfläche und einen gemanagten Betrieb bieten. lowcloud zum Beispiel ist eine Kubernetes-basierte DaaS-Plattform, die speziell für Teams gebaut wurde, die von den Vorteilen von Kubernetes profitieren wollen, ohne sich um den Infrastrukturunterbau zu kümmern. Deployments, Skalierung und Networking laufen über die Plattform, das Team fokussiert sich auf den Code.",[393,1069,1071],{"id":1070},"entscheidungshilfe-welches-tool-wann","Entscheidungshilfe: Welches Tool wann?",[367,1073,1074],{},"Kurz zusammengefasst:",[864,1076,1077,1082,1087,1092],{},[867,1078,1079,1081],{},[775,1080,381],{}," – für lokale Tests, einzelne Container, schnelle Experimente",[867,1083,1084,1086],{},[775,1085,899],{}," – für lokale Entwicklung und einfache Ein-Host-Deployments",[867,1088,1089,1091],{},[775,1090,902],{}," – für kleine Cluster mit geringem Komplexitätsbudget",[867,1093,1094,1096],{},[775,1095,387],{}," – für Produktionsumgebungen mit Skalierungsanforderungen, Multi-Team-Betrieb und Cloud-native Architektur",[367,1098,1099],{},"Kein Tool ist für alle Fälle das richtige. Die Frage ist nicht \"Was ist am besten?\", sondern \"Was brauche ich heute – und was werde ich in sechs Monaten brauchen?\". Wer mit Compose startet, schließt Kubernetes nicht aus. Aber wer von Anfang an weiß, dass Skalierung und Hochverfügbarkeit gefragt sein werden, spart sich den Umweg.",[1101,1102,1103],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":427,"searchDepth":605,"depth":605,"links":1105},[1106,1107,1110,1113,1114,1117,1118,1119],{"id":395,"depth":605,"text":396},{"id":414,"depth":605,"text":415,"children":1108},[1109],{"id":467,"depth":613,"text":468},{"id":570,"depth":605,"text":571,"children":1111},[1112],{"id":584,"depth":613,"text":585},{"id":787,"depth":605,"text":788},{"id":848,"depth":605,"text":849,"children":1115},[1116],{"id":884,"depth":613,"text":887},{"id":995,"depth":605,"text":996},{"id":1057,"depth":605,"text":1058},{"id":1070,"depth":605,"text":1071},"2026-04-09","Docker, Docker Compose, Docker Swarm und Kubernetes im direkten Vergleich: Welches Tool passt zu welchem Problem und wann lohnt sich der Umstieg?","md",{"src":1124},"\u002Fimages\u002Fblog\u002Fdocker-vs-kubernetes.jpg",{},{"title":217,"description":1121},"HQTb_kwnJWMVlM456RV9of-p5tfD7kMNMymIpxx8B7I",[1129,1131],{"title":213,"path":214,"stem":215,"description":1130,"children":-1},"Helm Charts bündeln Kubernetes-Ressourcen in ein versioniertes Paket. So sind sie aufgebaut, so funktioniert das Templating und so setzt du sie sinnvoll ein.",{"title":221,"path":222,"stem":223,"description":1132,"children":-1},"Kustomize verwaltet Kubernetes-Konfigurationen über Bases und Overlays – ohne Templates. So bleiben YAML-Dateien lesbar, valide und flexibel anpassbar.",1776079527804]