<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Docker on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/docker/</link><description>Recent content in Docker on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 03 Aug 2026 05:15:40 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Docker vs Kubernetes: Containers vs Orchestration</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-docker-vs-kubernetes-containers-vs-orchestration/</link><pubDate>Mon, 03 Aug 2026 05:15:40 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-docker-vs-kubernetes-containers-vs-orchestration/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;strong class="kw"&gt;Docker&lt;/strong&gt; packages an application and its dependencies into a portable container image and runs it on a single host, while &lt;strong class="kw"&gt;Kubernetes&lt;/strong&gt; schedules, scales, and heals many containers across a cluster of machines. They aren&amp;rsquo;t direct substitutes — Kubernetes typically runs containers built by Docker (or another OCI-compatible tool), sitting one layer above it.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="32" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Docker&lt;/text&gt;&lt;text x="480" y="32" text-anchor="middle" font-size="18" style="fill:var(--primary)"&gt;Kubernetes&lt;/text&gt;&lt;rect x="40" y="55" width="240" height="270" rx="8" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="160" y="78" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Single Host&lt;/text&gt;&lt;rect x="65" y="95" width="70" height="60" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="100" y="130" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;app A&lt;/text&gt;&lt;rect x="150" y="95" width="70" height="60" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="185" y="130" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;app B&lt;/text&gt;&lt;rect x="65" y="170" width="70" height="60" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="100" y="205" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;app C&lt;/text&gt;&lt;rect x="150" y="170" width="70" height="60" rx="6" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="4"/&gt;&lt;text x="185" y="205" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;idle&lt;/text&gt;&lt;text x="160" y="265" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;docker run&lt;/text&gt;&lt;text x="160" y="282" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;manual, per-host&lt;/text&gt;&lt;text x="160" y="310" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;if host dies, all lost&lt;/text&gt;&lt;rect x="400" y="55" width="160" height="36" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="78" text-anchor="middle" font-size="11" style="fill:var(--content)"&gt;Control Plane&lt;/text&gt;&lt;line x1="440" y1="91" x2="400" y2="120" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3"/&gt;&lt;line x1="480" y1="91" x2="480" y2="120" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3"/&gt;&lt;line x1="520" y1="91" x2="560" y2="120" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3"/&gt;&lt;rect x="360" y="120" width="80" height="90" rx="6" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="400" y="135" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;Node 1&lt;/text&gt;&lt;rect x="370" y="145" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="404" y="145" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="370" y="178" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="440" y="120" width="80" height="90" rx="6" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="135" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;Node 2&lt;/text&gt;&lt;rect x="450" y="145" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="484" y="145" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="520" y="120" width="80" height="90" rx="6" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="560" y="135" text-anchor="middle" font-size="10" style="fill:var(--secondary)"&gt;Node 3&lt;/text&gt;&lt;rect x="530" y="145" width="26" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="564" y="145" width="26" height="26" rx="4" style="fill:none;stroke:var(--border)" stroke-width="1.5" stroke-dasharray="3"/&gt;&lt;text x="480" y="235" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;scheduler places pods&lt;/text&gt;&lt;text x="480" y="252" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;auto-reschedules on failure&lt;/text&gt;&lt;text x="480" y="280" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;declarative, cluster-wide&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Docker&lt;/th&gt;
&lt;th&gt;Kubernetes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core purpose&lt;/td&gt;
&lt;td&gt;Build, package, and run containers from a single image spec&lt;/td&gt;
&lt;td&gt;Orchestrate and manage many containers across a fleet of machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit of work&lt;/td&gt;
&lt;td&gt;Container, defined by a Dockerfile and run via docker run&lt;/td&gt;
&lt;td&gt;Pod, a group of one or more containers scheduled together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment scope&lt;/td&gt;
&lt;td&gt;Single host (or manually scripted across hosts)&lt;/td&gt;
&lt;td&gt;Multi-node cluster with a control plane scheduling workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration model&lt;/td&gt;
&lt;td&gt;Imperative CLI commands or docker-compose.yml&lt;/td&gt;
&lt;td&gt;Declarative YAML manifests reconciled continuously toward desired state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Networking &amp;amp; discovery&lt;/td&gt;
&lt;td&gt;User-defined bridge networks and container name resolution&lt;/td&gt;
&lt;td&gt;Cluster-wide Services, DNS, and Ingress across nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Manual — start more containers or use docker-compose scale&lt;/td&gt;
&lt;td&gt;Automated via ReplicaSets and Horizontal Pod Autoscaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure recovery&lt;/td&gt;
&lt;td&gt;No built-in restart across host failure; relies on restart policies per host&lt;/td&gt;
&lt;td&gt;Self-healing — reschedules pods automatically if a node or container fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollouts &amp;amp; updates&lt;/td&gt;
&lt;td&gt;Rebuild image and manually restart containers&lt;/td&gt;
&lt;td&gt;Rolling updates and rollbacks managed declaratively per Deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker operates at the level of a single &lt;strong class="kw"&gt;container&lt;/strong&gt;; Kubernetes operates at the level of a &lt;strong class="kw"&gt;cluster&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Kubernetes doesn&amp;rsquo;t replace Docker — it typically schedules containers that Docker (or another &lt;strong class="kw"&gt;container runtime&lt;/strong&gt;) built and runs.&lt;/li&gt;
&lt;li&gt;Docker&amp;rsquo;s model is largely &lt;strong class="kw"&gt;imperative&lt;/strong&gt;, while Kubernetes is fundamentally &lt;strong class="kw"&gt;declarative&lt;/strong&gt;, continuously reconciling actual state to desired state.&lt;/li&gt;
&lt;li&gt;Kubernetes adds &lt;strong class="kw"&gt;self-healing&lt;/strong&gt; and autoscaling that plain Docker has no native concept of.&lt;/li&gt;
&lt;li&gt;For a single app on one machine, Kubernetes&amp;rsquo; &lt;strong class="kw"&gt;control plane&lt;/strong&gt; overhead is often unjustified complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>