<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>김신건의 로그 - 위키 / virtualization</title><description>&apos;virtualization&apos; 카테고리 위키 페이지 최신 업데이트</description><link>https://shinkeonkim.com/</link><language>ko-KR</language><item><title>[Container] cgroups + namespaces: 컨테이너의 두 기둥</title><link>https://shinkeonkim.com/wiki/virtualization/cgroups-namespaces/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/cgroups-namespaces/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;컨테이너 = &lt;em&gt;namespaces + cgroups + 파일시스템 (overlay)&lt;/em&gt;. &lt;em&gt;VM 이 아니라 host 의 프로세스&lt;/em&gt; + &lt;em&gt;격리&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Container[Container]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Container --&gt; NS[&quot;Namespaces (격리)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Container --&gt; CG[&quot;cgroups (자원 제한)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Container --&gt; FS[&quot;Overlay FS (layered FS)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;VM 은 &lt;em&gt;hypervisor + 별도 커널&lt;/em&gt;, 컨테이너는 &lt;em&gt;host 커널 공유&lt;/em&gt;. 시작 속도 수 ms vs 수 초.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;컨테이너-생성-과정&quot;&gt;컨테이너 생성 과정&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant CLI as docker run&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant D as containerd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Runc as runc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant OS as Linux Kernel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CLI-&gt;&gt;D: 컨테이너 생성 요청&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    D-&gt;&gt;Runc: OCI bundle (config.json + rootfs)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Runc-&gt;&gt;OS: clone(CLONE_NEWPID|CLONE_NEWNET|CLONE_NEWNS|...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OS--&gt;&gt;Runc: 새 namespace pid=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Runc-&gt;&gt;OS: cgroup 설정 (memory.max, cpu.max)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Runc-&gt;&gt;OS: mount overlay filesystem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Runc-&gt;&gt;OS: exec (container entrypoint)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OS--&gt;&gt;CLI: 컨테이너 실행 중&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;namespaces-격리&quot;&gt;Namespaces (격리)&lt;/h2&gt;
&lt;p&gt;Linux 8가지 namespace 로 컨테이너 격리:&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Namespace&lt;/th&gt;&lt;th&gt;격리 대상&lt;/th&gt;&lt;th&gt;커널 버전&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;프로세스 ID (안에서 PID=1)&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;mnt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;파일시스템 마운트&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;net&lt;/code&gt;&lt;/td&gt;&lt;td&gt;네트워크 인터페이스, 라우팅, 방화벽&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;uts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;hostname, domain&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ipc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;System V IPC, POSIX msg queue&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;&lt;td&gt;UID/GID 매핑 (root in container ≠ root in host)&lt;/td&gt;&lt;td&gt;3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cgroup&lt;/code&gt;&lt;/td&gt;&lt;td&gt;cgroup root&lt;/td&gt;&lt;td&gt;4.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;&lt;td&gt;clock (monotonic, boot time)&lt;/td&gt;&lt;td&gt;5.6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 새 namespace 에서 명령 실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;unshare&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --pid&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mount&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --net&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --fork&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 컨테이너 namespace 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ls&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -la&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /proc/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; inspect&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{.State.Pid}}&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-container&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/ns/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# namespace 종류별 ID (같은 숫자 = 공유)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lsns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; inspect&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{.State.Pid}}&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-container&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pid-namespace-심화&quot;&gt;PID Namespace 심화&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host                 Container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;------               ----------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PID 1: systemd       PID 1: nginx (container init)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PID 2: kthread       PID 2: nginx worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PID 100: dockerd     (host PIDs 불가시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PID 234: nginx       (동일 프로세스, host 는 234로 봄)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;컨테이너 안 PID 1&lt;/em&gt; 이 종료되면 &lt;em&gt;컨테이너 전체 종료&lt;/em&gt;. &lt;code&gt;SIGTERM&lt;/code&gt; 핸들러 필수.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# PID 1 문제 해결: init process 사용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:22-alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apk add --no-cache tini&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ENTRYPOINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/sbin/tini&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;--&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;server.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;tini/dumb-init&lt;/em&gt; = zombie reaping + SIGTERM 전파. 직접 &lt;code&gt;CMD [&quot;node&quot;]&lt;/code&gt; 하면 zombie process 누적.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;network-namespace-심화&quot;&gt;Network Namespace 심화&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host network namespace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  eth0: 192.168.1.10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  docker0 (bridge): 172.17.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Container network namespace:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  eth0 (veth pair): 172.17.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  lo: 127.0.0.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# container 의 network namespace 진입&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;nsenter&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --target&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; inspect&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --format=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;{{.State.Pid}}&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; c1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        --net&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; show&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# veth pair 확인 (host side)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ip&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; link&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; show&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; veth&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cgroups-자원-제한&quot;&gt;cgroups (자원 제한)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Root[&quot;/sys/fs/cgroup/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Root --&gt; ContainerA[&quot;container-a/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Root --&gt; ContainerB[&quot;container-b/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerA --&gt; CPU[&quot;cpu.max = 50000 100000 (50% CPU)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerA --&gt; Mem[&quot;memory.max = 512M&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerA --&gt; IO[&quot;io.max = read 100MB/s&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerB --&gt; CPU2[&quot;cpu.max = 200000 100000 (200%)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerB --&gt; Mem2[&quot;memory.max = 2G&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Controller&lt;/th&gt;&lt;th&gt;제한 대상&lt;/th&gt;&lt;th&gt;파일&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cpu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CPU 시간&lt;/td&gt;&lt;td&gt;&lt;code&gt;cpu.max&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/td&gt;&lt;td&gt;RAM + swap&lt;/td&gt;&lt;td&gt;&lt;code&gt;memory.max&lt;/code&gt;, &lt;code&gt;memory.swap.max&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;io&lt;/code&gt;&lt;/td&gt;&lt;td&gt;block I/O&lt;/td&gt;&lt;td&gt;&lt;code&gt;io.max&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;프로세스 수&lt;/td&gt;&lt;td&gt;&lt;code&gt;pids.max&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cpuset&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CPU core 지정&lt;/td&gt;&lt;td&gt;&lt;code&gt;cpuset.cpus&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;hugetlb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;huge pages&lt;/td&gt;&lt;td&gt;&lt;code&gt;hugetlb.*.max&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# cgroup v2 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /sys/fs/cgroup/cgroup.controllers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# output: cpuset cpu io memory hugetlb pids rdma misc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# container cgroup 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /sys/fs/cgroup/system.slice/docker-&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.scope/memory.current&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /sys/fs/cgroup/system.slice/docker-&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.scope/cpu.stat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cgroup-v1-vs-v2&quot;&gt;cgroup v1 vs v2&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;v1&lt;/th&gt;&lt;th&gt;v2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;출시&lt;/td&gt;&lt;td&gt;2007&lt;/td&gt;&lt;td&gt;2016 (kernel 4.5)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;계층&lt;/td&gt;&lt;td&gt;&lt;em&gt;controller 별 다수 트리&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;단일 통합 계층&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;파일시스템&lt;/td&gt;&lt;td&gt;&lt;code&gt;/sys/fs/cgroup/{cpu,memory,...}/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/sys/fs/cgroup/&lt;/code&gt; 하나&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;thread granularity&lt;/td&gt;&lt;td&gt;없음&lt;/td&gt;&lt;td&gt;thread-level 제어 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;권장&lt;/td&gt;&lt;td&gt;legacy&lt;/td&gt;&lt;td&gt;&lt;em&gt;모든 현대 distro 기본&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;K8s 지원&lt;/td&gt;&lt;td&gt;deprecated (1.25+)&lt;/td&gt;&lt;td&gt;&lt;em&gt;기본 (1.25+)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ubuntu 22.04+, Fedora 31+, K8s 1.25+&lt;/em&gt; 가 cgroup v2 기본.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;cgroup-v2-cpu-제한-예시&quot;&gt;cgroup v2 CPU 제한 예시&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CPU 50% 제한 (50ms / 100ms period)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;50000 100000&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /sys/fs/cgroup/mycontainer/cpu.max&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Docker 설정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --cpus=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;0.5&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --memory=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;512m&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# K8s 설정 (내부적으로 cgroup 설정)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;resources:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  limits:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    cpu:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;500m&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    memory:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;512Mi&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;oci-runtime-spec-에서&quot;&gt;OCI Runtime spec 에서&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;linux&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;namespaces&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pid&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;network&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ipc&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;uts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mount&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;resources&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;memory&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;limit&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;536870912&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;cpu&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;shares&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1024&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;quota&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;50000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;period&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;100000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;oom-kill-cgroup-memory&quot;&gt;OOM kill (cgroup memory)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant App as Container App&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant OS as Linux Kernel&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    App-&gt;&gt;OS: malloc() (RAM 부족)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OS--&gt;&gt;OS: cgroup memory.max 초과 감지&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    OS-&gt;&gt;App: SIGKILL (즉시)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over App,OS: OOM Killer 발동, graceful shutdown 없음&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;em&gt;Memory limit 초과 = SIGKILL (graceful 없음)&lt;/em&gt;. K8s 는 &lt;code&gt;OOMKilled&lt;/code&gt; 로 표시. limit 을 &lt;em&gt;측정 후 여유 있게&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# OOM kill 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dmesg&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;oom&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mypod&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -A5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;OOMKilled&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;user-namespace&quot;&gt;User Namespace&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Container:           Host:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;root (uid 0)    =&gt;  uid 100000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user1 (uid 1)   =&gt;  uid 100001&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;컨테이너 내부 root 가 host root 아님&lt;/em&gt;. 보안 강화. &lt;em&gt;rootless container&lt;/em&gt; (Podman) 의 토대.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# rootless Podman (host uid 1000 사용자로 실행)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;podman&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# uid=0(root) gid=0(root) ... (container 내부는 root 처럼 보임)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 실제 host 에서 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /proc/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pgrep&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/status&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Uid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Uid: 100000  100000 ...  (실제 제한된 uid)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Docker 는 userns-remap 설정 필요. Podman 은 기본 지원.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;overlayfs&quot;&gt;OverlayFS&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;lowerdir (read-only): image layers (L1, L2, L3 ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;upperdir (read-write): container 변경사항&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;merged:               통합 view (container 가 보는 FS)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;workdir:              OverlayFS 내부 작업 디렉토리&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# OverlayFS 마운트 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mount&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; overlay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# overlay on /var/lib/docker/overlay2/&amp;#x3C;id&gt;/merged type overlay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#   (lowerdir=&amp;#x3C;L3&gt;:&amp;#x3C;L2&gt;:&amp;#x3C;L1&gt;,upperdir=&amp;#x3C;upper&gt;,workdir=&amp;#x3C;work&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# container 에서 파일 수정 시&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# → upperdir 에만 기록 (lowerdir 불변)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# → 삭제는 whiteout 파일로 표시&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--privileged&lt;/code&gt;&lt;/strong&gt; = 모든 namespace 해제 + 모든 capability. 컨테이너 = host process. &lt;em&gt;capabilities 만 추가 (&lt;code&gt;--cap-add&lt;/code&gt;)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;호스트 PID/IPC/Network 공유&lt;/strong&gt; = &lt;code&gt;--pid=host&lt;/code&gt; 등. 격리 완전히 없어짐.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU limit 의 throttle&lt;/strong&gt; = container 가 &lt;em&gt;느려짐&lt;/em&gt; (kill 아님). &lt;code&gt;cpu_throttled_seconds&lt;/code&gt; 메트릭 확인.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory limit 너무 작음&lt;/strong&gt; = OOM kill 반복. 실제 사용량 측정 후 설정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PID 1 에 signal 핸들러 없음&lt;/strong&gt; = SIGTERM 무시, K8s graceful shutdown 실패. tini 사용.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[docker]]&lt;/li&gt;
&lt;li&gt;[[container-image-best-practices]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>linux</category><category>cgroups</category><category>namespaces</category><category>container</category><category>kernel</category><author>koa (김신건)</author></item><item><title>[Container] Docker: image, layer, registry</title><link>https://shinkeonkim.com/wiki/virtualization/docker/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/docker/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; = 컨테이너 &lt;em&gt;빌드 + 실행 + 배포&lt;/em&gt; 의 표준 도구. 2013 출시 → &lt;em&gt;컨테이너 시대&lt;/em&gt; 의 시작. 현재는 &lt;em&gt;OCI 표준&lt;/em&gt; 으로 진화 (&lt;code&gt;containerd&lt;/code&gt;, &lt;code&gt;runc&lt;/code&gt;, &lt;code&gt;podman&lt;/code&gt; 등 호환).&lt;/p&gt;
&lt;h2 id=&quot;컨테이너-런타임-생태계&quot;&gt;컨테이너 런타임 생태계&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Docker[&quot;Docker CLI / Compose&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Podman[&quot;Podman CLI&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    K8s[&quot;Kubernetes kubelet&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Docker --&gt; DockerD[&quot;dockerd (daemon)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Podman --&gt; PodmanLib[&quot;libpod (daemonless)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    K8s --&gt; CRI[&quot;CRI (Container Runtime Interface)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    DockerD --&gt; Containerd[&quot;containerd&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PodmanLib --&gt; Containerd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CRI --&gt; Containerd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Containerd --&gt; Runc[&quot;runc (OCI Runtime)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Containerd --&gt; GVisor[&quot;gVisor (sandboxed)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Containerd --&gt; Kata[&quot;Kata Containers (VM)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Runc --&gt; Linux[&quot;Linux kernel (namespaces + cgroups)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;런타임&lt;/th&gt;&lt;th&gt;특징&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;dockerd&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;전통 Docker daemon, 개발 환경 표준&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;containerd&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CNCF graduated, K8s 표준 CRI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Podman&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;daemonless, rootless 지원, systemd 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;gVisor&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;사용자 공간 커널, 보안 강화 (Google Cloud Run)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Kata Containers&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;VM 기반 격리, 강한 보안&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;2026 시점 &lt;em&gt;프로덕션 K8s = containerd&lt;/em&gt;. 개발 편의는 Docker. 보안 우선 = Podman.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;oci-표준&quot;&gt;OCI 표준&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Open Container Initiative&lt;/em&gt; = image + runtime 표준화.&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;스펙&lt;/th&gt;&lt;th&gt;내용&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OCI Image Spec&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;image manifest, config, layer (tar.gz)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OCI Runtime Spec&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;container 생성/실행 (runc 구현)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OCI Distribution Spec&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;registry API (push/pull)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// OCI Image Manifest (요약)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;schemaVersion&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.manifest.v1+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;config&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.config.v1+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1234&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;layers&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.layer.v1.tar+gzip&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;7023&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:abc...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;mediaType&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/vnd.oci.image.layer.v1.tar+gzip&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1234&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sha256:def...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;OCI 표준 덕분에 &lt;em&gt;Docker build&lt;/em&gt; 로 만든 image 를 &lt;em&gt;Podman run / K8s&lt;/em&gt; 가 그대로 실행.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;layered-filesystem&quot;&gt;Layered Filesystem&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Base[&quot;base: ubuntu:24.04&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Base --&gt; L1[&quot;L1: apt install nginx&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L1 --&gt; L2[&quot;L2: COPY config /etc/nginx/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L2 --&gt; L3[&quot;L3: COPY app /var/www/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    L3 --&gt; Image[Final Image]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Image --&gt; RW[&quot;R/W layer (container 실행 시)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;각 &lt;em&gt;Dockerfile instruction&lt;/em&gt; = &lt;em&gt;별도 layer&lt;/em&gt;. &lt;em&gt;불변&lt;/em&gt; + &lt;em&gt;재사용 (cache)&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;dockerfile&quot;&gt;Dockerfile&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 멀티 스테이지 빌드&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:22-alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm run build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nginx:alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; runtime&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /app/dist /usr/share/nginx/html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;EXPOSE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;nginx&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;-g&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;daemon off;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;instruction&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;&lt;td&gt;base image&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;WORKDIR&lt;/code&gt;&lt;/td&gt;&lt;td&gt;작업 디렉토리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;COPY&lt;/code&gt; / &lt;code&gt;ADD&lt;/code&gt;&lt;/td&gt;&lt;td&gt;파일 복사&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/td&gt;&lt;td&gt;빌드 시 실행&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;CMD&lt;/code&gt; / &lt;code&gt;ENTRYPOINT&lt;/code&gt;&lt;/td&gt;&lt;td&gt;컨테이너 시작 명령&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;EXPOSE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;포트 (문서화, 자동 노출 아님)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ENV&lt;/code&gt;&lt;/td&gt;&lt;td&gt;환경 변수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ARG&lt;/code&gt;&lt;/td&gt;&lt;td&gt;빌드 시 변수&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;VOLUME&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mount point&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;USER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;실행 사용자&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;HEALTHCHECK&lt;/code&gt;&lt;/td&gt;&lt;td&gt;health probe&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;멀티-스테이지-빌드&quot;&gt;멀티 스테이지 빌드&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Stage1[&quot;Stage 1: builder (큰 dependency)&quot;] --&gt;|&quot;결과물만 COPY --from&quot;| Stage2[&quot;Stage 2: runtime (작은 base)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;빌드 도구는 final image 에 안 들어감&lt;/em&gt;. 최종 image 가 &lt;em&gt;작고 안전&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Go: 정적 binary → distroless&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; golang:1.23 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; go.* ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; go mod download&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CGO_ENABLED=0 go build -o /bin/server ./cmd/server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gcr.io/distroless/static:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /bin/server /server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nonroot:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ENTRYPOINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/server&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;buildkit-현대-빌드&quot;&gt;BuildKit (현대 빌드)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# BuildKit 활성화 (Docker 23+ 기본)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;DOCKER_BUILDKIT&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 멀티 아키텍처 빌드&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; buildx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --platform&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; linux/amd64,linux/arm64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:latest&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 캐시 마운트 (apt / npm 캐시 재사용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mount=type=cache,target=/var/cache/apt&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apt-get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build-essential&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Secret 마운트 (layer 에 안 남음)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mount=type=secret,id=npmrc&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    cp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /run/secrets/npmrc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.npmrc&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ci&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;BuildKit 기능&lt;/th&gt;&lt;th&gt;효과&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;캐시 마운트&lt;/td&gt;&lt;td&gt;apt/npm 캐시 재사용, 빌드 수분 → 수초&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Secret 마운트&lt;/td&gt;&lt;td&gt;평문 secret 이 layer 에 안 남음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;멀티 아키&lt;/td&gt;&lt;td&gt;ARM + x86 동시 빌드&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;병렬 stage&lt;/td&gt;&lt;td&gt;독립 stage 병렬 실행&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;BuildKit 가 2026 표준&lt;/em&gt;. ARM/x86 &lt;em&gt;멀티 아키 동시 build&lt;/em&gt; + 효율적 cache.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;image-registry&quot;&gt;Image Registry&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Registry&lt;/th&gt;&lt;th&gt;특징&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Docker Hub&lt;/td&gt;&lt;td&gt;공식, rate limit (anonymous 100 pulls/6h)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GHCR (GitHub)&lt;/td&gt;&lt;td&gt;github 통합, free for public&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ECR (AWS)&lt;/td&gt;&lt;td&gt;IAM 통합, 동일 region 무료&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Artifact Registry (GCP)&lt;/td&gt;&lt;td&gt;GCP 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Harbor&lt;/td&gt;&lt;td&gt;self-host, RBAC + 취약점 스캔&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;podman-daemonless-대안&quot;&gt;Podman: daemonless 대안&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Docker 대체 명령 (거의 동일 CLI)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;podman&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;podman&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 8080:80&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;podman&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# rootless: root 없이 컨테이너 실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;podman&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --userns=keep-id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Docker&lt;/th&gt;&lt;th&gt;Podman&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Daemon&lt;/td&gt;&lt;td&gt;있음 (dockerd)&lt;/td&gt;&lt;td&gt;없음 (fork-exec)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rootless&lt;/td&gt;&lt;td&gt;제한적&lt;/td&gt;&lt;td&gt;&lt;em&gt;완전 지원&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;systemd 통합&lt;/td&gt;&lt;td&gt;수동&lt;/td&gt;&lt;td&gt;&lt;code&gt;podman generate systemd&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;K8s 호환&lt;/td&gt;&lt;td&gt;containerd shim&lt;/td&gt;&lt;td&gt;동일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Windows/Mac&lt;/td&gt;&lt;td&gt;Docker Desktop&lt;/td&gt;&lt;td&gt;가상화 (Podman Machine)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;docker-networking&quot;&gt;Docker Networking&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 기본 bridge network&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 8080:80&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 사용자 정의 bridge (컨테이너간 DNS 이름 해석)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mynet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mynet&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; api&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mynet&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; postgres&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# host network (Linux only, 포트 매핑 없이 직접)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; host&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Network 모드&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;bridge&lt;/code&gt;&lt;/td&gt;&lt;td&gt;기본, 격리된 가상 LAN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;host 네트워크 공유 (Linux, 성능 최적)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;&lt;td&gt;네트워크 없음 (완전 격리)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;overlay&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Docker Swarm 멀티 호스트&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;docker-compose&quot;&gt;Docker Compose&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# compose.yml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;services&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  api&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    ports&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;8080:8080&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;DATABASE_URL=postgresql://db:5432/app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    depends_on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      db&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        condition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;service_healthy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    restart&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  db&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;postgres:16-alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    volumes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    healthcheck&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      test&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CMD-SHELL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pg_isready -U postgres&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      interval&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;10s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      timeout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;5s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      retries&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;volumes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  pgdata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; api&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; down&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -v&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # volume 포함 삭제&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;layer-cache-활용&quot;&gt;Layer Cache 활용&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 의존성 파일만 먼저 복사 → cache hit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci              # package.json 변경 시에만 재실행&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 이후 소스 복사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# BuildKit cache 마운트로 npm cache 재사용&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mount=type=cache,target=/root/.npm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ci&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dockerignore&quot;&gt;.dockerignore&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;**/*.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;coverage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.DS_Store&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.vscode&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;.gitignore 같은&lt;/em&gt;. &lt;em&gt;build context 작게&lt;/em&gt; → 빠른 build + context 전송 감소.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latest&lt;/code&gt; tag&lt;/strong&gt; = build 마다 다른 결과. &lt;em&gt;명시 tag 또는 digest sha256&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;root 사용자&lt;/strong&gt; = 보안 위험. &lt;code&gt;USER 1000&lt;/code&gt; 명시. K8s PodSecurityPolicy 도 차단.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;secret 을 ENV / ARG&lt;/strong&gt; = image layer 에 평문 남음. BuildKit &lt;code&gt;--secret&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;거대한 image&lt;/strong&gt; = transfer 느림. distroless / scratch / alpine 활용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COPY . . 를 의존성 이전에&lt;/strong&gt; = 코드 변경 시 의존성 재설치. 순서 중요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RUN 여러 줄 분리&lt;/strong&gt; = 각각 layer. &lt;code&gt;&amp;#x26;&amp;#x26; \&lt;/code&gt; 로 하나의 RUN 으로 합치기.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[cgroups-namespaces]]&lt;/li&gt;
&lt;li&gt;[[container-image-best-practices]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>docker</category><category>container</category><category>oci</category><category>cloud</category><category>buildkit</category><category>podman</category><author>koa (김신건)</author></item><item><title>[Container] Image Best Practices: 작게, 안전하게</title><link>https://shinkeonkim.com/wiki/virtualization/container-image-best-practices/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/container-image-best-practices/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;컨테이너 image best practices = &lt;em&gt;작고 (small), 안전하고 (secure), 재현 가능하고 (reproducible), 서명된 (signed)&lt;/em&gt; image 를 만드는 원칙.&lt;/p&gt;
&lt;h2 id=&quot;5가지-원칙&quot;&gt;5가지 원칙&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q[Image Best Practices]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Small[&quot;1. 작게 (distroless / alpine)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Sec[&quot;2. 안전하게 (non-root, secret)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Cache[&quot;3. Layer cache 활용&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Repro[&quot;4. Reproducible (pin version)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Sign[&quot;5. Sign + Scan (Cosign, Trivy)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;1-base-image-선택&quot;&gt;1. Base Image 선택&lt;/h2&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Base&lt;/th&gt;&lt;th&gt;크기&lt;/th&gt;&lt;th&gt;musl/glibc&lt;/th&gt;&lt;th&gt;적합&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ubuntu:24.04&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~70 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;개발 / 디버깅 친화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;debian:12-slim&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~40 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;일반 범용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;alpine:3.20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~5 MB&lt;/td&gt;&lt;td&gt;musl&lt;/td&gt;&lt;td&gt;작음, glibc 의존성 주의&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;distroless/static&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~2 MB&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;Go / Rust 정적 binary&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;distroless/cc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~20 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;C 라이브러리 필요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;distroless/nodejs22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~150 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;Node.js, 안전&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;distroless/java21&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~200 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;Java (JRE 포함)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;distroless/python3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~50 MB&lt;/td&gt;&lt;td&gt;glibc&lt;/td&gt;&lt;td&gt;Python&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;scratch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;정적 binary 전용&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Distroless&lt;/em&gt; = &lt;em&gt;shell / package manager / OS 유틸 없음&lt;/em&gt;. 공격 면 감소. CVE 도 줄어듦. Google 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 크기 비교&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu:24.04&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; gcr.io/distroless/static:nonroot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; gcr.io/distroless/static&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-multi-stage-build&quot;&gt;2. Multi-stage build&lt;/h2&gt;
&lt;h3 id=&quot;go--distroless&quot;&gt;Go + distroless&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; golang:1.23 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; go.* ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; go mod download&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; CGO_ENABLED=0 GOOS=linux go build -o /app ./cmd/server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gcr.io/distroless/static:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /app /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nonroot:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ENTRYPOINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/app&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;nodejs--distroless&quot;&gt;Node.js + distroless&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:22-alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; deps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci --only=production&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:22-alpine &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm run build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gcr.io/distroless/nodejs22:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=deps /app/node_modules ./node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /app/dist ./dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nonroot:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;dist/server.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;java--distroless&quot;&gt;Java + distroless&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gradle:8.5-jdk21 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;AS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gradle bootJar --no-daemon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gcr.io/distroless/java21:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=builder /src/build/libs/app.jar /app.jar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nonroot:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ENTRYPOINT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;java&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;-jar&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/app.jar&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;최종 image 에 빌드 도구 없음&lt;/em&gt;. JDK 대신 JRE / distroless 사용으로 수백 MB 절감.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;3-layer-cache-최적화&quot;&gt;3. Layer Cache 최적화&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Bad[&quot;COPY . .\nRUN npm ci\n(코드 1줄 변경 = npm ci 재실행)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Good[&quot;COPY package*.json ./\nRUN npm ci\nCOPY . .\n(package.json 변경 시에만 npm ci)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Bad --&gt;|&quot;최적화&quot;| Good&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ✅ 의존성 파일 먼저, 소스 나중&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ✅ BuildKit 캐시 마운트 (패키지 캐시 영속)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --mount=type=cache,target=/root/.npm \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    npm ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ✅ apt 캐시 마운트&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --mount=type=cache,target=/var/cache/apt \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    apt-get update &amp;#x26;&amp;#x26; apt-get install -y --no-install-recommends \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    build-essential \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x26;&amp;#x26; rm -rf /var/lib/apt/lists/*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;BuildKit 캐시 마운트&lt;/em&gt; = npm / pip / apt 캐시를 &lt;em&gt;build 간 재사용&lt;/em&gt;. CI 에서 수분 단축.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-non-root-user&quot;&gt;4. Non-root User&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Alpine 방식&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; addgroup -g 1000 appuser &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    adduser -D -u 1000 -G appuser appuser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; appuser:appuser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Debian/Ubuntu 방식&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; groupadd -g 1000 appuser &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    useradd -r -u 1000 -g appuser appuser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; appuser:appuser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# distroless 내장&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; gcr.io/distroless/static:nonroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; nonroot:nonroot   # uid 65532&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# K8s PodSecurityContext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;securityContext&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  runAsNonRoot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  runAsUser&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  runAsGroup&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  readOnlyRootFilesystem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  allowPrivilegeEscalation&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;K8s 1.23+ &lt;em&gt;Restricted PodSecurityStandard&lt;/em&gt; = &lt;code&gt;runAsNonRoot: true&lt;/code&gt; 강제. 미리 맞춰야 배포 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;5-secret-처리&quot;&gt;5. Secret 처리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# BuildKit secret (layer 에 절대 안 남음)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --mount=type=secret,id=npmrc \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cp /run/secrets/npmrc ~/.npmrc &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    npm ci &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    rm -f ~/.npmrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# pip private index&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --mount=type=secret,id=pip_conf \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    PIP_CONFIG_FILE=/run/secrets/pip_conf pip install -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; buildx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id=npmrc,src=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.npmrc&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --secret&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id=pip_conf,src=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/.pip/pip.conf&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;em&gt;ARG / ENV / COPY 로 secret 전달 절대 금지&lt;/em&gt;. &lt;code&gt;docker history&lt;/code&gt; 로 layer 평문 확인 가능. BuildKit &lt;code&gt;--secret&lt;/code&gt; 만 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;6-dockerignore&quot;&gt;6. .dockerignore&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# 불필요 파일 제외 (build context 최소화)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env.*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;**/*.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.DS_Store&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;coverage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.vscode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.idea&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;*.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;docs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;7-healthcheck&quot;&gt;7. HEALTHCHECK&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;HEALTHCHECK&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --interval=30s --timeout=3s --start-period=10s --retries=3 \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; curl -f http://localhost:8080/health || exit 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# wget 사용 (curl 없는 경우)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;HEALTHCHECK&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --interval=30s --timeout=5s \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; wget -qO- http://localhost:8080/health || exit 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;K8s 에서는 Liveness/Readiness probe 가 우선이지만 &lt;code&gt;docker run&lt;/code&gt; 환경에서는 HEALTHCHECK 가 유용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;8-image-scan--서명&quot;&gt;8. Image Scan + 서명&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CVE 스캔 (Trivy)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;trivy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --severity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HIGH,CRITICAL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Grype 스캔&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;grype&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 서명 (Cosign + Sigstore)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sign&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cosign.key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; verify&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cosign.pub&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SBOM 생성 (Syft)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;syft&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; spdx-json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SBOM 취약점 검사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;grype&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sbom:sbom.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;도구&lt;/th&gt;&lt;th&gt;용도&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Trivy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CVE / misconfig / secret scan (가장 많이 씀)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Grype&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CVE scan (Anchore)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cosign&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;image 서명 + verify (keyless 지원)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Syft&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;SBOM 생성 (SPDX, CycloneDX)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Notary v2&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;image trust, CNCF 표준&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;9-dive-layer-분석&quot;&gt;9. Dive: Layer 분석&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 설치&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# image layer 분석 (크기 + 파일 변화)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CI 모드: efficiency &amp;#x3C; 90% 이면 실패&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;CI&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dive&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --ci-config&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .dive-ci.yml&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# .dive-ci.yml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;rules&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  lowestEfficiency&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  highestWastedBytes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;20MB&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  highestUserWastedPercent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dive&lt;/em&gt; = 각 layer 에서 추가/삭제된 파일 시각화. &lt;em&gt;불필요 파일 찾기 최고 도구&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;10-reproducible-build--oci-labels&quot;&gt;10. Reproducible Build + OCI Labels&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ARG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; BUILD_DATE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ARG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; GIT_SHA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ARG&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; VERSION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LABEL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org.opencontainers.image.created=$BUILD_DATE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LABEL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org.opencontainers.image.revision=$GIT_SHA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LABEL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org.opencontainers.image.version=$VERSION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LABEL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org.opencontainers.image.source=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://github.com/myorg/myapp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;LABEL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; org.opencontainers.image.licenses=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Apache-2.0&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; buildx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --build-arg&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; BUILD_DATE=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +&quot;%Y-%m-%dT%H:%M:%SZ&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --build-arg&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GIT_SHA=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; rev-parse&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HEAD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --build-arg&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; VERSION=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1.2.3&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp:1.2.3&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;같은 입력 → 같은 output. &lt;em&gt;supply chain security&lt;/em&gt; 의 토대.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;빌드-최적화-체크리스트&quot;&gt;빌드 최적화 체크리스트&lt;/h2&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;확인&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Multi-stage build 사용&lt;/td&gt;&lt;td&gt;빌드 도구 final image 에 없음&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Base image pin (&lt;code&gt;:22-alpine@sha256:...&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;digest 고정&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;.dockerignore&lt;/code&gt; 작성&lt;/td&gt;&lt;td&gt;context &amp;#x3C; 10MB 목표&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;의존성 파일 먼저 COPY&lt;/td&gt;&lt;td&gt;layer cache 활용&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Non-root USER&lt;/td&gt;&lt;td&gt;uid 1000 이상&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Secret = &lt;code&gt;--mount=type=secret&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ARG/ENV 금지&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;apt-get clean&lt;/code&gt; 같은 RUN 줄&lt;/td&gt;&lt;td&gt;별도 layer 아님&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Trivy scan CI 통합&lt;/td&gt;&lt;td&gt;HIGH/CRITICAL 0건 목표&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cosign 서명&lt;/td&gt;&lt;td&gt;supply chain&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;흔한-함정&quot;&gt;흔한 함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;apt install ... &amp;#x26;&amp;#x26; apt clean&lt;/code&gt; 여러 RUN&lt;/strong&gt; = &lt;code&gt;clean&lt;/code&gt; 이 별도 layer. &lt;em&gt;하나의 RUN + &lt;code&gt;&amp;#x26;&amp;#x26;&lt;/code&gt;&lt;/em&gt; 으로 합치기.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;COPY . /app&lt;/code&gt;&lt;/strong&gt; = &lt;code&gt;.dockerignore&lt;/code&gt; 없으면 &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt; 까지 포함. context 폭발.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latest&lt;/code&gt; tag&lt;/strong&gt; = build 마다 다른 결과. digest 또는 명시 tag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;root 사용자 + privileged&lt;/strong&gt; = K8s Restricted Policy 거부. 미리 non-root.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;base image 를 자주 갱신 안 함&lt;/strong&gt; = CVE 누적. 자동 Renovate / Dependabot 으로 주기 갱신.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[docker]]&lt;/li&gt;
&lt;li&gt;[[cgroups-namespaces]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>container</category><category>docker</category><category>security</category><category>best-practices</category><category>cloud</category><category>buildkit</category><author>koa (김신건)</author></item><item><title>Hypervisor: Type 1 (bare metal) vs Type 2 (hosted)</title><link>https://shinkeonkim.com/wiki/virtualization/hypervisor/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/hypervisor/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hypervisor&lt;/strong&gt; (Virtual Machine Monitor, VMM) 는 여러 [[virtual-machine|VM]] 을 한 물리 머신 위에서 실행하도록 하드웨어를 가상화하는 소프트웨어입니다. CPU 시간, 메모리 페이지, I/O 디바이스를 게스트 OS 들에게 분배 및 격리합니다.&lt;/p&gt;
&lt;p&gt;용어의 어원: &lt;strong&gt;hyper (넘어서는) + supervisor&lt;/strong&gt;. 원래 IBM 의 CP-67 (1968) 에서 “supervisor 위에서 supervisor 를 감독한다” 는 의미로 명명되었습니다.&lt;/p&gt;
&lt;h2 id=&quot;popek--goldberg-정리-1974&quot;&gt;Popek &amp;#x26; Goldberg 정리 (1974)&lt;/h2&gt;
&lt;p&gt;가상화 가능한 아키텍처의 조건을 처음 정형화한 논문. 세 가지 성질이 필요합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;동등성 (Equivalence)&lt;/strong&gt;: VM 에서 실행한 프로그램이 실물 하드웨어에서와 같은 결과를 낸다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자원 제어 (Resource Control)&lt;/strong&gt;: hypervisor 가 물리 자원을 완전히 통제한다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;효율성 (Efficiency)&lt;/strong&gt;: 대다수 명령은 하드웨어에서 직접 실행되어야 한다 (인터프리트 X)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;핵심 결과: &lt;strong&gt;모든 sensitive instruction (자원 상태 변경) 이 privileged instruction (특권 실행 필요) 의 부분집합&lt;/strong&gt; 이어야 가상화 가능. x86 은 원래 이 조건을 만족하지 않았고, 그래서 2005 년 이전 x86 가상화는 이진 재작성 (binary translation, VMware ESX 초기) 을 썼습니다. &lt;strong&gt;Intel VT-x / AMD-V&lt;/strong&gt; 가 이 조건을 하드웨어로 만족시켰습니다.&lt;/p&gt;
&lt;h2 id=&quot;type-1-vs-type-2&quot;&gt;Type 1 vs Type 2&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph T1[&quot;Type 1: Bare Metal&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HW1[&quot;물리 하드웨어&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HW1 --&gt; HV1[&quot;Hypervisor&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HV1 --&gt; G1[&quot;Guest VM 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HV1 --&gt; G2[&quot;Guest VM 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph T2[&quot;Type 2: Hosted&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HW2[&quot;물리 하드웨어&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HW2 --&gt; OS2[&quot;Host OS (macOS, Windows, Linux)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        OS2 --&gt; HV2[&quot;Hypervisor App (VirtualBox, VMware Fusion)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HV2 --&gt; G3[&quot;Guest VM 1&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        HV2 --&gt; G4[&quot;Guest VM 2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;type-1-bare-metal-hypervisor&quot;&gt;Type 1: Bare Metal Hypervisor&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;하드웨어 위에 직접&lt;/strong&gt; 올라갑니다. 그 자체가 OS 역할.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;오버헤드 작음 (host OS 층이 없음)&lt;/li&gt;
&lt;li&gt;관리 도구는 별도 (관리 VM 또는 원격 접속)&lt;/li&gt;
&lt;li&gt;대상: 데이터센터, 서버, 프로덕션 클라우드&lt;/li&gt;
&lt;li&gt;대표: &lt;strong&gt;VMware ESXi&lt;/strong&gt;, &lt;strong&gt;Xen&lt;/strong&gt;, &lt;strong&gt;KVM (일부 시각)&lt;/strong&gt;, &lt;strong&gt;Microsoft Hyper-V&lt;/strong&gt;, &lt;strong&gt;Nutanix AHV&lt;/strong&gt;, &lt;strong&gt;Proxmox VE&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;strong&gt;KVM 은 Type 1 인가 Type 2 인가&lt;/strong&gt;? 두 시각이 공존합니다. KVM 은 Linux 커널 모듈로 동작하고 Linux 자체가 host OS 역할을 하지만, KVM 은 Linux 를 hypervisor 로 “승격” 시켜 게스트를 직접 관리합니다. VMware, Red Hat 등은 KVM 을 Type 1 으로 분류하는 경향이 있고, 학술 텍스트는 Type 2 로 보는 경향이 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;type-2-hosted-hypervisor&quot;&gt;Type 2: Hosted Hypervisor&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Host OS 위에 애플리케이션으로&lt;/strong&gt; 올라갑니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host OS 층이 있어 오버헤드 다소 큼&lt;/li&gt;
&lt;li&gt;대신 설치가 간단, 데스크톱에서 편함&lt;/li&gt;
&lt;li&gt;대상: 개발자 로컬 환경, 학습, 크로스-OS 테스트&lt;/li&gt;
&lt;li&gt;대표: &lt;strong&gt;Oracle VirtualBox&lt;/strong&gt;, &lt;strong&gt;VMware Workstation / Fusion&lt;/strong&gt;, &lt;strong&gt;Parallels Desktop&lt;/strong&gt;, &lt;strong&gt;QEMU (일반 모드)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;주요-hypervisor-상세&quot;&gt;주요 hypervisor 상세&lt;/h2&gt;
&lt;h3 id=&quot;kvm-kernel-based-virtual-machine&quot;&gt;KVM (Kernel-based Virtual Machine)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2007 년 Linux 커널에 병합 (Avi Kivity)&lt;/li&gt;
&lt;li&gt;Linux 커널 모듈 형태, &lt;code&gt;/dev/kvm&lt;/code&gt; 인터페이스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QEMU 와 조합&lt;/strong&gt; 하는 것이 표준 (QEMU 가 device emulation, KVM 이 CPU/메모리)&lt;/li&gt;
&lt;li&gt;오픈소스, 무료, 성능 좋음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;libvirt&lt;/strong&gt; 로 관리, virt-manager, virsh CLI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RHEL, Ubuntu 등 리눅스 클라우드/서버 기본&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;사용처: AWS Nitro (일부), Google Cloud, DigitalOcean, OpenStack&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;xen&quot;&gt;Xen&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2003 년 케임브리지 대학 발원, paravirtualization 개척&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dom0&lt;/strong&gt; (관리 도메인) + &lt;strong&gt;DomU&lt;/strong&gt; (게스트) 아키텍처&lt;/li&gt;
&lt;li&gt;AWS EC2 초기 세대가 Xen 기반 (~2017)&lt;/li&gt;
&lt;li&gt;현재는 KVM 에 밀려 점유율 감소, Citrix Hypervisor (XenServer) 로 상용&lt;/li&gt;
&lt;li&gt;임베디드, 자동차 (Xen ARM) 등 특수 영역에서는 여전히 강함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vmware-esxi&quot;&gt;VMware ESXi&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;VMware 상용 hypervisor, 데이터센터 최강자 (오랫동안)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vSphere&lt;/strong&gt; 는 ESXi 를 관리하는 상위 스택 (vCenter, vMotion, HA)&lt;/li&gt;
&lt;li&gt;Broadcom 인수 (2023) 후 라이선싱 변경으로 대안 검토가 늘어남&lt;/li&gt;
&lt;li&gt;Type 1, 마이크로커널 기반&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VMFS&lt;/strong&gt; 클러스터 파일시스템, live migration (vMotion) 유명&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;microsoft-hyper-v&quot;&gt;Microsoft Hyper-V&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server 및 Windows 10/11 Pro 에 내장&lt;/li&gt;
&lt;li&gt;Type 1 (기술적으로), 다만 Windows 는 parent partition 이라 UI 상 Type 2 처럼 보임&lt;/li&gt;
&lt;li&gt;Azure 의 기반 hypervisor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WSL2&lt;/strong&gt; 도 내부적으로 Hyper-V 를 이용해 경량 Linux VM 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;oracle-virtualbox&quot;&gt;Oracle VirtualBox&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;무료, GPL, 크로스플랫폼 (Windows / macOS / Linux)&lt;/li&gt;
&lt;li&gt;Type 2, 데스크톱 개발자 표준&lt;/li&gt;
&lt;li&gt;Vagrant 와 조합해서 개발 환경 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qemu&quot;&gt;QEMU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;에뮬레이터&lt;/strong&gt; 이자 hypervisor&lt;/li&gt;
&lt;li&gt;순수 QEMU: 소프트웨어 에뮬레이션 (느림, 하지만 다른 아키텍처 실행 가능, 예: ARM → x86)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QEMU + KVM&lt;/strong&gt;: 하드웨어 가속 (Linux 표준)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QEMU + HVF&lt;/strong&gt;: macOS 하드웨어 가속&lt;/li&gt;
&lt;li&gt;Firecracker, Cloud Hypervisor 등이 QEMU 의 subset 을 fork&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;firecracker&quot;&gt;Firecracker&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS 가 2018 년 오픈소스로 공개&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;microVM&lt;/strong&gt;: 극도로 slim 한 hypervisor (수백 KB)&lt;/li&gt;
&lt;li&gt;Rust 로 작성, KVM 기반&lt;/li&gt;
&lt;li&gt;부팅 125ms 이하&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Lambda, AWS Fargate&lt;/strong&gt; 의 기반&lt;/li&gt;
&lt;li&gt;컨테이너 편의 + VM 격리의 조합이 목표&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;기타&quot;&gt;기타&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud Hypervisor&lt;/strong&gt; (Intel + Rust community): Firecracker 계열, 더 많은 기능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bhyve&lt;/strong&gt; (FreeBSD 기반)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;z/VM&lt;/strong&gt; (IBM 메인프레임)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerVM&lt;/strong&gt; (IBM POWER)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;trap-and-emulate-가상화-핵심-메커니즘&quot;&gt;Trap-and-Emulate (가상화 핵심 메커니즘)&lt;/h2&gt;
&lt;p&gt;게스트 OS 가 특권 명령 (privileged instruction) 을 실행하려 할 때:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CPU 가 &lt;strong&gt;trap&lt;/strong&gt; 을 발생시켜 hypervisor 로 제어 이전&lt;/li&gt;
&lt;li&gt;Hypervisor 가 해당 명령을 &lt;strong&gt;에뮬레이트&lt;/strong&gt; (실제 효과를 시뮬레이션)&lt;/li&gt;
&lt;li&gt;결과를 게스트에게 돌려주고 게스트 실행 재개&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;비특권 명령은 하드웨어에서 &lt;strong&gt;직접 실행&lt;/strong&gt; (Popek &amp;#x26; Goldberg “효율성” 조건).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Guest[&quot;Guest OS\n(Ring 3 or Ring 1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Guest --&gt;|&quot;일반 명령&quot;| HW[&quot;하드웨어 직접 실행&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Guest --&gt;|&quot;특권 명령 시도&quot;| Trap[&quot;CPU Trap (VM-Exit)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Trap --&gt; HV[&quot;Hypervisor (Ring -1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt;|&quot;에뮬레이트 후&quot;| VMEntry[&quot;VM-Entry (게스트 복귀)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VMEntry --&gt; Guest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;VT-x/AMD-V 가 없던 시절 x86 은 일부 sensitive instruction 이 trap 을 발생시키지 않아 &lt;strong&gt;binary translation&lt;/strong&gt; (실행 전 코드를 재작성) 이 필요했습니다.&lt;/p&gt;
&lt;h2 id=&quot;하드웨어-지원&quot;&gt;하드웨어 지원&lt;/h2&gt;
&lt;p&gt;Hypervisor 성능은 CPU 의 가상화 지원에 크게 의존합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VT-x / AMD-V&lt;/strong&gt;: Ring -1 이라는 새로운 특권 레벨을 만들어 hypervisor 를 여기서 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EPT / RVI (Nested Paging)&lt;/strong&gt;: 게스트 물리 → 호스트 물리 변환을 하드웨어로&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VT-d / AMD-Vi (IOMMU)&lt;/strong&gt;: PCI passthrough 안전화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SR-IOV&lt;/strong&gt;: NIC 을 VF (Virtual Function) 로 나누어 게스트가 직접 접근&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APICv&lt;/strong&gt;: 인터럽트 가상화 오버헤드 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 모두가 켜져 있으면 컴퓨트/메모리 오버헤드는 몇% 수준, I/O 는 virtio + SR-IOV 로 near-native.&lt;/p&gt;
&lt;h2 id=&quot;nested-virtualization&quot;&gt;Nested Virtualization&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VM 안에서 다시 hypervisor 를 돌리는 것&lt;/strong&gt;. 예:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클라우드에서 개발자가 로컬처럼 KVM 을 돌리고 싶을 때&lt;/li&gt;
&lt;li&gt;WSL2 (Windows 안에서 Hyper-V, 그 안에서 Linux)&lt;/li&gt;
&lt;li&gt;학습/랩 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;문제점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;성능 오버헤드가 커짐 (트랩 두 번)&lt;/li&gt;
&lt;li&gt;L1 hypervisor 가 nested 를 명시적으로 지원해야 함 (Intel VMCS shadowing 등)&lt;/li&gt;
&lt;li&gt;AWS EC2 는 특정 metal 인스턴스만 nested 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;주요-기능&quot;&gt;주요 기능&lt;/h2&gt;
&lt;h3 id=&quot;live-migration&quot;&gt;Live Migration&lt;/h3&gt;
&lt;p&gt;실행 중인 VM 을 &lt;strong&gt;중단 없이&lt;/strong&gt; 다른 물리 서버로 이동:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;메모리 페이지를 백그라운드로 복사 (pre-copy 방식)&lt;/li&gt;
&lt;li&gt;Dirty page 만 반복 복사&lt;/li&gt;
&lt;li&gt;마지막에 잠깐 (수십 ms) freeze 후 CPU 상태 전송&lt;/li&gt;
&lt;li&gt;VMware vMotion, KVM libvirt migration, Xen live migration&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;snapshot&quot;&gt;Snapshot&lt;/h3&gt;
&lt;p&gt;특정 시점 상태 (메모리 + 디스크) 저장. 롤백, 백업.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;디스크: qcow2 의 CoW 스냅샷&lt;/li&gt;
&lt;li&gt;메모리: RAM 을 파일로 dump&lt;/li&gt;
&lt;li&gt;주의: 프로덕션에서 스냅샷 유지는 성능/공간 부담&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;overcommit&quot;&gt;Overcommit&lt;/h3&gt;
&lt;p&gt;물리 자원보다 더 많은 자원을 게스트에 할당:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory overcommit&lt;/strong&gt;: KSM (Kernel Same-page Merging) 으로 동일 페이지 공유, ballooning 으로 회수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU overcommit&lt;/strong&gt;: 물리 코어보다 많은 vCPU (스케줄링으로 시분할)&lt;/li&gt;
&lt;li&gt;위험: 오버커밋 후 실제 사용량이 급증하면 성능 붕괴, 최악의 경우 OOM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pci-passthrough&quot;&gt;PCI Passthrough&lt;/h3&gt;
&lt;p&gt;특정 PCI 디바이스 (GPU, NIC) 를 특정 게스트에게 독점 할당. VFIO (Linux) 로 구현. GPU 가상 데스크톱, HFT 등에 사용.&lt;/p&gt;
&lt;h2 id=&quot;hypervisor-비교&quot;&gt;Hypervisor 비교&lt;/h2&gt;





































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;KVM&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Xen&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;ESXi&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Hyper-V&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;VirtualBox&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;유형&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Type 1 (일부 시각 Type 2)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Type 1&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Type 1&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Type 1&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Type 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;라이선스&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GPL (무료)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GPL / 상용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;상용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;상용 (Windows 포함)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GPL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;주 사용처&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;클라우드, Linux 서버&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;임베디드, 특수 클라우드&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;엔터프라이즈 DC&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Windows DC, Azure&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;데스크톱, 개발&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;관리 도구&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;libvirt, virt-manager&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;xm/xl, XenCenter&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;vSphere Client, vCenter&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Hyper-V Manager, SCVMM&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VirtualBox GUI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;live migration&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원 (libvirt)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원 (vMotion)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;지원 안 함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수 (하드웨어 가속 잘 활용)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수 (paravirt 특히)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최상&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;우수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;학습 곡선&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;높음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음~중간 (UI 좋음)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;매우 낮음&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;microvm-트렌드-firecracker--gvisor&quot;&gt;microVM 트렌드 (Firecracker / gVisor)&lt;/h2&gt;
&lt;p&gt;전통적인 VM 은 부팅에 수십 초가 걸려 서버리스/컨테이너 밀도에 적합하지 않았습니다. 이를 해결하기 위해 &lt;strong&gt;microVM&lt;/strong&gt; 이 등장했습니다.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;제품&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;기반&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;부팅&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;격리&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;사용처&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Firecracker&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM + Rust&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~125ms&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VM 수준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;AWS Lambda, Fargate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Cloud Hypervisor&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM + Rust&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~150ms&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VM 수준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Intel, MS Azure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;gVisor&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;시스템콜 인터셉트&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;즉시&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OS 수준 (일부)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Google Cloud Run&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Kata Containers&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM / QEMU&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~1s&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VM 수준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OCI 호환 컨테이너 런타임&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Firecracker&lt;/strong&gt; 의 핵심 설계:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;디바이스 에뮬레이션 최소화 (virtio-net, virtio-blk 만)&lt;/li&gt;
&lt;li&gt;네트워크, 스토리지, 직렬 포트 외 미지원 (대신 가볍고 빠름)&lt;/li&gt;
&lt;li&gt;Rust 로 작성해 메모리 안전성 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kata Containers&lt;/strong&gt; 는 OCI/CRI 인터페이스를 그대로 사용하므로 Kubernetes 와 바로 통합됩니다.&lt;/p&gt;
&lt;h2 id=&quot;hypervisor-선택-가이드&quot;&gt;Hypervisor 선택 가이드&lt;/h2&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;상황&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;권장&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Linux 서버 / 클라우드 기반 구성&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;KVM + libvirt&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;엔터프라이즈 데이터센터, vMotion 필요&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VMware ESXi / vSphere&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Windows 서버 / Azure 연동&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Hyper-V&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;개발자 로컬 (데스크톱)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VirtualBox&lt;/strong&gt; 또는 &lt;strong&gt;Parallels (macOS)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;서버리스, 컨테이너 격리 강화&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Firecracker&lt;/strong&gt; 또는 &lt;strong&gt;Kata Containers&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;크로스 아키텍처 에뮬레이션 (ARM on x86)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;QEMU&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QEMU-only vs KVM&lt;/strong&gt;: &lt;code&gt;qemu-system-x86_64&lt;/code&gt; 만 실행하면 순수 에뮬레이션으로 느립니다. &lt;code&gt;-enable-kvm&lt;/code&gt; 이나 &lt;code&gt;-accel kvm&lt;/code&gt; 을 명시해야 하드웨어 가속됩니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오버커밋&lt;/strong&gt;: 넉넉해 보인다고 무한정 게스트를 얹으면 실제 부하 급증 시 붕괴합니다. 프로덕션은 물리 자원의 80% 정도까지만.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NUMA&lt;/strong&gt;: 대규모 VM 이 NUMA 노드를 넘어가면 성능 저하. &lt;code&gt;numa&lt;/code&gt; 옵션으로 게스트가 NUMA 를 인지하게 하거나 pinning 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 세대 mismatch&lt;/strong&gt;: live migration 대상 서버가 CPU 명령어 셋이 다르면 게스트가 죽을 수 있음. &lt;strong&gt;cluster 내 CPU 마스킹&lt;/strong&gt; (EVC in VMware) 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timekeeping&lt;/strong&gt;: 게스트 시계가 자주 어긋남. &lt;code&gt;kvm-clock&lt;/code&gt; (Linux 게스트) 또는 NTP 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[virtualization|가상화 전체]]&lt;/li&gt;
&lt;li&gt;관련 [[virtual-machine|Virtual Machine]]&lt;/li&gt;
&lt;li&gt;관련 [[vm-vs-container|VM vs Container 비교]]&lt;/li&gt;
&lt;li&gt;Popek &amp;#x26; Goldberg 정리: &lt;a href=&quot;https://dl.acm.org/doi/10.1145/361011.361073&quot;&gt;Formal Requirements for Virtualizable Third Generation Architectures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Firecracker paper: &lt;a href=&quot;https://www.usenix.org/system/files/nsdi20-paper-agache.pdf&quot;&gt;Firecracker: Lightweight Virtualization for Serverless Applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>virtualization</category><category>hypervisor</category><category>vm</category><category>kvm</category><category>esxi</category><category>vmm</category><author>koa (김신건)</author></item><item><title>LXC / LXD: System Containers, Docker 이전의 컨테이너</title><link>https://shinkeonkim.com/wiki/virtualization/lxc-system-containers/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/lxc-system-containers/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;LXC (Linux Containers)&lt;/strong&gt; 는 Linux 커널의 [[cgroups-namespaces|namespaces + cgroups]] 를 이용해 &lt;strong&gt;완전한 리눅스 시스템 (init, 서비스, 파일시스템) 을 컨테이너로 실행&lt;/strong&gt; 하는 도구입니다. [[docker|Docker]] 가 등장하기 전 (2008 년) 부터 있었으며, “&lt;strong&gt;system container&lt;/strong&gt;” 접근의 대표 주자입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LXD&lt;/strong&gt; 는 Canonical (Ubuntu) 이 만든 LXC 위 관리 레이어로, REST API + 이미지 관리 + 클러스터링을 추가합니다. 2023 년 Canonical 이 라이선스를 변경하자 커뮤니티가 &lt;strong&gt;Incus&lt;/strong&gt; 로 fork 하여 현재 두 갈래로 발전 중입니다.&lt;/p&gt;
&lt;h2 id=&quot;system-container-vs-application-container&quot;&gt;System Container vs Application Container&lt;/h2&gt;
&lt;p&gt;컨테이너를 사용하는 두 관점입니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    K[&quot;Linux Kernel&amp;#x3C;br/&gt;namespaces + cgroups&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    K --&gt; SC[&quot;System Container (LXC)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    K --&gt; AC[&quot;Application Container (Docker)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph SC[&quot;System Container (LXC)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Init[&quot;init / systemd (PID 1)&quot;] --&gt; Nginx[&quot;nginx&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Init --&gt; Rails[&quot;rails app&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Init --&gt; Cron[&quot;crond&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Init --&gt; SSH[&quot;sshd&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph AC[&quot;Application Container (Docker)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Proc[&quot;앱 프로세스 (PID 1)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;system-container-lxc-계열&quot;&gt;System Container (LXC 계열)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;미니 VM 처럼 사용&lt;/strong&gt;: &lt;code&gt;init&lt;/code&gt; 프로세스 + &lt;code&gt;systemd&lt;/code&gt; + 여러 서비스 실행&lt;/li&gt;
&lt;li&gt;안에 여러 프로세스 (nginx + rails + cron 등)&lt;/li&gt;
&lt;li&gt;로그인 (ssh) 가능한 완전한 리눅스 환경&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오래 살아있는&lt;/strong&gt; 인스턴스, VM 을 대체하는 감각으로 배포&lt;/li&gt;
&lt;li&gt;대표: LXC, LXD, Incus, systemd-nspawn, OpenVZ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;application-container-docker-계열&quot;&gt;Application Container (Docker 계열)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하나의 프로세스가 하나의 컨테이너&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Immutable: 로그인해서 고치는 게 아니라 이미지를 새로 빌드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일회용, 짧은 수명&lt;/strong&gt; (crash 나면 restart)&lt;/li&gt;
&lt;li&gt;Kubernetes 등 오케스트레이터가 대량 실행&lt;/li&gt;
&lt;li&gt;대표: [[docker|Docker]], Podman, containerd, CRI-O&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;같은 커널 기술 (namespaces + cgroups) 위에 서 있지만, &lt;strong&gt;사용 철학이 다릅니다&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;lxc-의-특징&quot;&gt;LXC 의 특징&lt;/h2&gt;
&lt;h3 id=&quot;vm-을-대체할-수-있는-컨테이너&quot;&gt;VM 을 대체할 수 있는 컨테이너&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 컨테이너 생성 (Ubuntu 24.04 시스템)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; download&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dist&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --release&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; noble&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --arch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amd64&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 시작&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-start&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 안에서 shell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-attach&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 안에서 systemctl 사용 가능&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;컨테이너 안에 systemd 가 PID 1 로 뜹니다.&lt;/strong&gt; 여러 서비스, cron, syslog 등 완전한 리눅스 시스템이 그 안에서 돕니다.&lt;/p&gt;
&lt;h3 id=&quot;privileged-vs-unprivileged&quot;&gt;Privileged vs Unprivileged&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unprivileged (기본)&lt;/strong&gt;: 컨테이너의 root 가 호스트의 일반 유저에 매핑됨 → 탈출해도 root 권한 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privileged&lt;/strong&gt;: 컨테이너의 root 가 호스트 root 와 같음 → 성능 우위, 보안 약함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;user namespace 를 활용한 unprivileged 모드가 LXC 의 강점입니다. Docker 는 default 로 privileged 이라 (rootless docker 는 별도 설정) LXC 가 이 면에서 오랫동안 앞서 있었습니다.&lt;/p&gt;
&lt;h2 id=&quot;lxd--incus&quot;&gt;LXD / Incus&lt;/h2&gt;
&lt;p&gt;LXC 위에 얹은 관리 레이어.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt;: &lt;code&gt;lxc launch ubuntu:24.04 web&lt;/code&gt;, &lt;code&gt;lxc list&lt;/code&gt;, &lt;code&gt;lxc exec web bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REST API&lt;/strong&gt;: 로컬 소켓 또는 HTTPS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이미지 서버&lt;/strong&gt;: &lt;code&gt;images:ubuntu/24.04&lt;/code&gt; 로 원격 이미지 자동 다운로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스토리지 백엔드&lt;/strong&gt;: dir / zfs / btrfs / lvm / ceph&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;네트워크&lt;/strong&gt;: 브릿지, macvlan, ovn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클러스터&lt;/strong&gt;: 여러 호스트 묶어서 배포&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live migration&lt;/strong&gt;: CRIU 로 실행 중 컨테이너 이동&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VM 지원&lt;/strong&gt;: LXD 4.0+ 는 QEMU 백엔드로 VM 도 관리 (컨테이너와 통합 UI)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 서버에서 “미니 클라우드” 를 구축하는 표준 방식이었습니다. 2023 년 Canonical 이 CLA 요구 등 라이선스를 강화하자 원 개발자 Stéphane Graber 등이 &lt;strong&gt;Incus&lt;/strong&gt; 로 fork. 현재 Incus 가 커뮤니티 주류입니다.&lt;/p&gt;
&lt;h2 id=&quot;다른-시스템-컨테이너-도구&quot;&gt;다른 시스템 컨테이너 도구&lt;/h2&gt;
&lt;h3 id=&quot;systemd-nspawn&quot;&gt;systemd-nspawn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;systemd 에 내장된 최소 컨테이너 러너&lt;/li&gt;
&lt;li&gt;완전한 리눅스 시스템 이미지를 빠르게 부팅&lt;/li&gt;
&lt;li&gt;개발/테스트에 유용, 프로덕션 관리는 별도 도구 필요&lt;/li&gt;
&lt;li&gt;&lt;code&gt;machinectl&lt;/code&gt; 로 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; systemd-nspawn&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -bD&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /var/lib/machines/ubuntu-noble/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;openvz--virtuozzo&quot;&gt;OpenVZ / Virtuozzo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;러시아의 Parallels 가 개발한 시스템 컨테이너&lt;/li&gt;
&lt;li&gt;LXC 이전부터 있었음 (2005~)&lt;/li&gt;
&lt;li&gt;커널 패치 필요 (mainline 이 아님)&lt;/li&gt;
&lt;li&gt;러시아/CIS 지역의 저가 VPS 호스팅에서 자주 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;freebsd-jails&quot;&gt;FreeBSD Jails&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;FreeBSD 4.0 (2000) 부터 지원&lt;/li&gt;
&lt;li&gt;컨테이너의 원조에 가까움&lt;/li&gt;
&lt;li&gt;chroot 확장 + 프로세스/네트워크/사용자 격리&lt;/li&gt;
&lt;li&gt;Linux 컨테이너의 개념적 조상&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;solaris-zones&quot;&gt;Solaris Zones&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sun Solaris 10 (2005) 부터 지원&lt;/li&gt;
&lt;li&gt;Solaris 서버 통합에서 강력&lt;/li&gt;
&lt;li&gt;Oracle 인수 후 사용 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lxc-와-docker-비교&quot;&gt;LXC 와 Docker 비교&lt;/h2&gt;























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;LXC (system container)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Docker (application container)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;철학&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;미니 VM&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;프로세스 격리&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;PID 1&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;systemd&lt;/code&gt; 또는 &lt;code&gt;init&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;애플리케이션 프로세스&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;수명&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;오래 (일/주/월)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;짧게 (초/분/시간)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;이미지&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;완전한 배포판 tarball&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;앱 중심 layered image&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;네트워킹&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;브릿지, VLAN, macvlan&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;bridge, host, overlay (Docker network)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;로그인&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ssh 로 접속 자연스러움&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;원칙적으로 지양 (&lt;code&gt;docker exec&lt;/code&gt; 로만)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;불변성&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;컨테이너 내부 변경 흔함&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;이미지 재빌드로만 변경&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;오케스트레이션&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;LXD 클러스터, 손수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kubernetes (&lt;code&gt;[[k8s-pod]]&lt;/code&gt; 참조) 등 발달&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;주 사용처&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VPS, 개발 환경, 레거시 이관&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;마이크로서비스, CI/CD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;언제-lxc-를-쓰는가&quot;&gt;언제 LXC 를 쓰는가&lt;/h2&gt;
&lt;h3 id=&quot;lxc-가-잘-맞는-케이스&quot;&gt;LXC 가 잘 맞는 케이스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPS 대체&lt;/strong&gt;: 기존에 VM 으로 돌리던 워크로드를 더 가볍게&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;레거시 앱 이관&lt;/strong&gt;: Docker 로 옮기기 어려운 다중 프로세스 모놀리스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연구/실험&lt;/strong&gt;: 여러 배포판을 로컬에서 병렬로&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI 러너&lt;/strong&gt;: 완전한 시스템 환경이 필요한 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;저비용 격리&lt;/strong&gt;: OpenVZ 시대의 저가 VPS 호스팅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;docker-가-나은-케이스&quot;&gt;Docker 가 나은 케이스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;마이크로서비스&lt;/strong&gt;: 하나의 프로세스 = 하나의 컨테이너&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불변 인프라&lt;/strong&gt;: 재빌드/재배포 파이프라인 잘 되어 있는 조직&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오케스트레이션&lt;/strong&gt;: Kubernetes 생태계 활용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;표준 이미지&lt;/strong&gt;: Docker Hub 의 방대한 이미지 재사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;성능&quot;&gt;성능&lt;/h2&gt;
&lt;p&gt;LXC 와 Docker 는 &lt;strong&gt;커널이 같기 때문에 런타임 성능은 거의 동일&lt;/strong&gt; 합니다. 차이는 다음에서 옵니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;부팅&lt;/strong&gt;: LXC 는 init/systemd 를 시작 (수초), Docker 는 프로세스만 (수백 ms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이미지&lt;/strong&gt;: LXC 는 전체 배포판 tarball (수백 MB), Docker 는 layered slim image (수십 MB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;격리&lt;/strong&gt;: LXC 는 unprivileged 로 user namespace 활용, Docker 는 rootless docker 나 podman 이 뒤늦게 따라잡음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;실전-명령어-참고&quot;&gt;실전 명령어 참고&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# LXC (native)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; download&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-start&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-attach&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-stop&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# LXD / Incus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; launch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu:24.04&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # incus 는 incus launch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; local.conf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web/etc/nginx/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; backup-2026&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; restore&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; backup-2026&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# systemd-nspawn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;machinectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list-images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;machinectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu-noble&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;machinectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; shell&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu-noble&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;보안-모델-상세&quot;&gt;보안 모델 상세&lt;/h2&gt;
&lt;h3 id=&quot;unprivileged-vs-privileged-심층&quot;&gt;Unprivileged vs Privileged 심층&lt;/h3&gt;
&lt;p&gt;LXC 의 &lt;strong&gt;unprivileged container&lt;/strong&gt; 는 Linux user namespace 를 활용합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;호스트 관점          컨테이너 관점&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;UID 100000 (일반 유저) → UID 0 (root)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;UID 100001           → UID 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;컨테이너 안에서 root 로 실행되더라도, 호스트에서는 UID 100000 (권한 없는 유저) 입니다. 컨테이너가 탈출해도 호스트 root 권한을 얻지 못합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# /etc/subuid, /etc/subgid 설정 확인&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/subuid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# myuser:100000:65536&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# unprivileged 컨테이너 생성 (기본값)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc-create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myct&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; download&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dist&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --release&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; noble&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --arch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; amd64&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# /etc/lxc/lxc-usernet 에 bridge 권한 필요&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;apparmor--selinux-프로파일&quot;&gt;AppArmor / SELinux 프로파일&lt;/h3&gt;
&lt;p&gt;LXC 는 AppArmor (Ubuntu 기본) 또는 SELinux 프로파일로 컨테이너의 호스트 접근을 추가 제한합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/apparmor.d/usr.bin.lxc-start&lt;/code&gt; 에 기본 프로파일 포함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/proc&lt;/code&gt;, &lt;code&gt;/sys&lt;/code&gt; 의 민감한 하위 경로 마운트 제한&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SYS_ADMIN&lt;/code&gt; 같은 위험 capability 기본 박탈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;capability-관리&quot;&gt;Capability 관리&lt;/h3&gt;
&lt;p&gt;컨테이너 시작 시 불필요한 Linux capability 를 드롭합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# config 에서 capability 제한&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc.cap.drop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sys_admin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc.cap.drop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sys_rawio&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lxc.cap.drop&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; net_admin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;Privileged container 는 root 탈출 위험&lt;/strong&gt;. &lt;code&gt;lxc-create&lt;/code&gt; 기본값은 unprivileged 이지만, 구버전 문서나 튜토리얼이 privileged 를 전제하는 경우가 있습니다. 프로덕션에서는 항상 unprivileged 확인.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
&lt;strong&gt;nested container 는 추가 설정 필요&lt;/strong&gt;. LXD 컨테이너 안에서 Docker 를 쓰려면 &lt;code&gt;security.nesting: true&lt;/code&gt; 설정 필요. 설정 없이는 docker 가 커널 기능을 사용하지 못합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;이미지 파일시스템 크기 기본값이 작을 수 있습니다&lt;/strong&gt;. 기본 루트 파티션이 수 GB 인 경우 패키지 설치 중 공간 부족. 생성 시 크기를 명시하거나 ZFS/btrfs 백엔드로 동적 확장 구성.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
&lt;strong&gt;Live migration (CRIU)&lt;/strong&gt; 은 실험적 기능입니다. 특정 syscall / device 를 쓰는 프로세스는 checkpoint 실패. 중요 서비스 migration 전 충분한 테스트.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[docker|Docker]] (application container)&lt;/li&gt;
&lt;li&gt;관련 [[cgroups-namespaces|cgroups + namespaces]] (LXC 의 근간)&lt;/li&gt;
&lt;li&gt;관련 [[virtualization|가상화 전체]]&lt;/li&gt;
&lt;li&gt;관련 [[vm-vs-container|VM vs Container 비교]]&lt;/li&gt;
&lt;li&gt;관련 [[k8s-pod|Kubernetes Pod]] (쿠버네티스에서의 컨테이너 단위)&lt;/li&gt;
&lt;li&gt;공식: &lt;a href=&quot;https://linuxcontainers.org/&quot;&gt;linuxcontainers.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Incus: &lt;a href=&quot;https://linuxcontainers.org/incus/&quot;&gt;https://linuxcontainers.org/incus/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu 튜토리얼: &lt;a href=&quot;https://ubuntu.com/tutorials/how-to-run-docker-inside-lxd-containers&quot;&gt;https://ubuntu.com/tutorials/how-to-run-docker-inside-lxd-containers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>linux</category><category>container</category><category>lxc</category><category>lxd</category><category>cgroups</category><category>namespaces</category><author>koa (김신건)</author></item><item><title>Virtual Machine (VM): guest OS, 스냅샷, 마이그레이션</title><link>https://shinkeonkim.com/wiki/virtualization/virtual-machine/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/virtual-machine/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Virtual Machine (VM)&lt;/strong&gt; 은 [[hypervisor|hypervisor]] 위에 실행되는 &lt;strong&gt;완전한 가상 컴퓨터&lt;/strong&gt; 입니다. 가상 CPU (vCPU), 가상 메모리 (vRAM), 가상 디스크, 가상 NIC 을 갖고, 그 위에 게스트 OS 를 부팅합니다. 게스트 OS 는 자기가 물리 컴퓨터 위에 있다고 착각합니다.&lt;/p&gt;
&lt;p&gt;VM 은 [[docker|container]] 와 달리 &lt;strong&gt;자체 커널&lt;/strong&gt; 을 실행합니다. 이것이 VM 의 강한 격리와 큰 오버헤드의 근본 이유입니다.&lt;/p&gt;
&lt;h2 id=&quot;계층-구조&quot;&gt;계층 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HW[&quot;물리 하드웨어\n(CPU, RAM, NIC, Disk)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HW --&gt; HV[&quot;Hypervisor (KVM, ESXi, Hyper-V)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt; VM1[&quot;VM 1\nGuest OS: Ubuntu 24.04&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt; VM2[&quot;VM 2\nGuest OS: Windows Server 2022&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt; VM3[&quot;VM 3\nGuest OS: RHEL 9&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VM1 --&gt; App1[&quot;App: nginx&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VM2 --&gt; App2[&quot;App: IIS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VM3 --&gt; App3[&quot;App: Oracle DB&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 VM 은 독립 커널을 갖고, hypervisor 가 물리 자원을 시분할/격리합니다.&lt;/p&gt;
&lt;h2 id=&quot;구성-요소&quot;&gt;구성 요소&lt;/h2&gt;
&lt;h3 id=&quot;vcpu&quot;&gt;vCPU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hypervisor 가 물리 코어를 시분할하여 여러 vCPU 를 제공&lt;/li&gt;
&lt;li&gt;게스트에게는 완전한 CPU 처럼 보임&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU pinning&lt;/strong&gt;: 특정 vCPU 를 특정 물리 코어에 고정 (성능/일관성 향상)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NUMA topology&lt;/strong&gt;: 게스트에도 NUMA 를 노출하여 큰 워크로드가 지역성 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vram&quot;&gt;vRAM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;게스트 물리 메모리는 hypervisor 관점에서는 그냥 메모리 풀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EPT (Extended Page Tables)&lt;/strong&gt; 로 게스트 물리 → 호스트 물리 이중 변환을 하드웨어가 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ballooning&lt;/strong&gt;: hypervisor 가 게스트에게 “회수 요청” 을 보내 유휴 메모리를 다시 가져옴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KSM (Kernel Same-page Merging)&lt;/strong&gt;: 여러 게스트가 같은 페이지 (예: 같은 배포판 커널) 를 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;가상-디스크&quot;&gt;가상 디스크&lt;/h3&gt;
&lt;p&gt;파일 또는 볼륨 형태:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;포맷&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;특징&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Hypervisor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;qcow2&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;QEMU CoW, 스냅샷, thin provisioning&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM/QEMU&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VMDK&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VMware 표준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;ESXi, Workstation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VHD / VHDX&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Microsoft 표준&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Hyper-V&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;raw&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;헤더 없이 그대로, 성능 최고&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;모든 hypervisor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;VDI&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VirtualBox 자체 포맷&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VirtualBox&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;가상-nic-vnic&quot;&gt;가상 NIC (vNIC)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;에뮬레이션&lt;/strong&gt;: e1000, rtl8139 (게스트가 물리 카드처럼 인식, 느림)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;virtio-net&lt;/strong&gt;: 게스트가 virtio 를 알고 있어 직접 hypervisor 와 통신 (paravirtual, 훨씬 빠름)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SR-IOV&lt;/strong&gt;: 물리 NIC 을 나누어 게스트가 하드웨어 레벨로 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;virtio&quot;&gt;virtio&lt;/h3&gt;
&lt;p&gt;Rusty Russell (Linux 커널) 이 2008 년 발표한 &lt;strong&gt;paravirtual I/O 프레임워크&lt;/strong&gt;. 게스트와 hypervisor 가 공유하는 링 버퍼 (vring) 로 통신.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;virtio-blk&lt;/code&gt;, &lt;code&gt;virtio-scsi&lt;/code&gt;: 디스크&lt;/li&gt;
&lt;li&gt;&lt;code&gt;virtio-net&lt;/code&gt;: 네트워크&lt;/li&gt;
&lt;li&gt;&lt;code&gt;virtio-balloon&lt;/code&gt;: 메모리 회수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;virtio-gpu&lt;/code&gt;: 그래픽&lt;/li&gt;
&lt;li&gt;&lt;code&gt;virtio-fs&lt;/code&gt;: 파일시스템 (호스트 디렉토리 공유)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;virtio 는 오늘날 KVM/QEMU 뿐 아니라 대부분의 hypervisor 가 지원하는 사실상 표준입니다.&lt;/p&gt;
&lt;h2 id=&quot;부팅-흐름&quot;&gt;부팅 흐름&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;hypervisor 가 VM 프로세스를 시작&lt;/strong&gt; (QEMU 프로세스 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가상 펌웨어 실행&lt;/strong&gt; (SeaBIOS 또는 OVMF/UEFI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부트로더&lt;/strong&gt; (GRUB 등) 가 커널 이미지 로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;게스트 커널 부팅&lt;/strong&gt; (수백 MB 메모리 초기화, 디바이스 검색)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;init/systemd 시작&lt;/strong&gt;, 서비스 부트&lt;/li&gt;
&lt;li&gt;최종적으로 login 프롬프트 또는 앱 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Full boot 은 30~60 초 걸리는 게 흔합니다. [[docker|Container]] 가 수초 안에 뜨는 것과 대조됩니다.&lt;/p&gt;
&lt;h2 id=&quot;cloud-init&quot;&gt;Cloud-init&lt;/h2&gt;
&lt;p&gt;퍼블릭 클라우드에서 같은 이미지에서 여러 VM 을 띄우려면 &lt;strong&gt;인스턴스별 커스터마이징&lt;/strong&gt; 이 필요합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;호스트네임 설정&lt;/li&gt;
&lt;li&gt;SSH 키 주입&lt;/li&gt;
&lt;li&gt;사용자 계정 생성&lt;/li&gt;
&lt;li&gt;패키지 설치&lt;/li&gt;
&lt;li&gt;초기 스크립트 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;cloud-init&lt;/strong&gt; 이 이를 자동화합니다. 클라우드 provider 의 metadata service (예: AWS &lt;code&gt;http://169.254.169.254/&lt;/code&gt;) 에서 정보를 읽어 부팅 시 적용. &lt;strong&gt;user-data&lt;/strong&gt; 로 shell script 나 YAML (cloud-config) 를 지정할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#cloud-config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;hostname&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;web01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;users&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    sudo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ALL=(ALL) NOPASSWD:ALL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    ssh_authorized_keys&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ssh-ed25519 AAAA... deploy@laptop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;packages&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;postgresql-client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;runcmd&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;systemctl enable --now nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;스냅샷-snapshot&quot;&gt;스냅샷 (Snapshot)&lt;/h2&gt;
&lt;p&gt;특정 시점의 VM 상태 (메모리 + 디스크) 를 저장하여 나중에 그 상태로 되돌릴 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;종류&quot;&gt;종류&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;디스크 스냅샷&lt;/strong&gt;: 파일시스템 시점 저장 (qcow2, ZFS, LVM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 스냅샷&lt;/strong&gt;: RAM 을 dump (VM 이 정지되어 있어야 하거나 live 지원 필요)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full snapshot&lt;/strong&gt;: 디스크 + 메모리 + 장치 상태 모두 (VMware, VirtualBox 지원)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;사용처&quot;&gt;사용처&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;업그레이드 전 백업, 실패 시 롤백&lt;/li&gt;
&lt;li&gt;개발/테스트 환경 재현&lt;/li&gt;
&lt;li&gt;짧은 기간 (몇 분~시간)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
&lt;strong&gt;프로덕션에서 스냅샷을 오래 유지하면 안 됩니다.&lt;/strong&gt; qcow2 는 스냅샷이 쌓일수록 CoW 체인이 길어져 I/O 성능이 크게 저하됩니다. VMware 도 스냅샷 delta 파일이 커지면 문제. 스냅샷은 짧게 쓰고 지우거나 백업 파일로 export 하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;성능-오버헤드&quot;&gt;성능 오버헤드&lt;/h2&gt;
&lt;p&gt;현대 VM (KVM + virtio) 의 실제 오버헤드는 생각보다 낮습니다.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;자원&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;오버헤드&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;원인 및 완화&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;1-5%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VT-x 로 대부분 직접 실행. 잦은 VM-exit 는 tune 가능&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;메모리&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;2-8%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;EPT 로 하드웨어 변환. 대규모 페이지 (hugepage) 로 TLB miss 감소&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;네트워크 (virtio)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~5%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;virtio-net. SR-IOV 쓰면 near-native&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;디스크 (qcow2)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10-20%&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;CoW 오버헤드. raw 포맷 또는 직접 블록 디바이스 사용 시 개선&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;고성능이 필요한 DB 워크로드에는 raw 디스크 + 대용량 페이지 (2MB hugepage) 조합이 효과적.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;live-migration&quot;&gt;Live Migration&lt;/h2&gt;
&lt;p&gt;실행 중인 VM 을 &lt;strong&gt;거의 무중단&lt;/strong&gt; 으로 다른 물리 서버로 옮기는 기술.&lt;/p&gt;
&lt;h3 id=&quot;pre-copy-방식-표준&quot;&gt;Pre-copy 방식 (표준)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;sequenceDiagram&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Src as 원본 서버&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant VM as VM (실행 중)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    participant Dst as 대상 서버&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Src-&gt;&gt;Dst: 메모리 페이지 bulk copy 시작&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    loop dirty page 반복 복사&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        VM-&gt;&gt;Src: 페이지 write (dirty)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Src-&gt;&gt;Dst: dirty page 재전송&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over Src,Dst: dirty rate 낮아지면&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Src-&gt;&gt;VM: VM 일시 중지 (수십 ms)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Src-&gt;&gt;Dst: 남은 메모리 + CPU 상태&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Dst-&gt;&gt;VM: VM 재개&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Src-&gt;&gt;VM: 원본 VM 종료&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;원본 서버에서 메모리 페이지를 백그라운드로 대상 서버에 복사 시작&lt;/li&gt;
&lt;li&gt;VM 계속 실행 중이므로 dirty page 발생&lt;/li&gt;
&lt;li&gt;dirty page 만 다시 복사, 반복&lt;/li&gt;
&lt;li&gt;dirty rate 가 충분히 낮아지면 마지막 stop-and-copy&lt;/li&gt;
&lt;li&gt;VM 을 원본에서 잠깐 (수십 ms) 멈추고 남은 페이지 + CPU 상태 전송&lt;/li&gt;
&lt;li&gt;대상에서 VM 재개&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;post-copy-방식&quot;&gt;Post-copy 방식&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;VM 을 대상으로 옮겨서 즉시 재개&lt;/li&gt;
&lt;li&gt;메모리 접근 시 원본에서 page fault 로 가져옴&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Post-copy 는 다운타임이 더 짧지만 원본 실패 시 VM 이 죽습니다. VMware vMotion, KVM libvirt migration, Xen 모두 지원합니다.&lt;/p&gt;
&lt;h3 id=&quot;요구-조건&quot;&gt;요구 조건&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 서버가 공유 스토리지 (NFS, iSCSI, Ceph) 를 봐야 함 (또는 storage migration 병행)&lt;/li&gt;
&lt;li&gt;CPU 모델이 호환 가능해야 함 (EVC / CPU masking 으로 완화)&lt;/li&gt;
&lt;li&gt;네트워크 대역폭 (특히 대용량 VM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vm-관리-cli-예시-libvirt--kvm&quot;&gt;VM 관리 CLI 예시 (libvirt / KVM)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 새 VM 생성 (cloud image 사용)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virt-install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --memory&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 4096&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --vcpus&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --disk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; path=/var/lib/libvirt/images/web01.qcow2,size=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --cdrom&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /iso/ubuntu-24.04-server.iso&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --network&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; network=default&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --graphics&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --console&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pty,target_type=serial&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 실행/정지&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; shutdown&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;     # 정중한 종료&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; destroy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      # 강제 종료&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 스냅샷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot-create-as&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pre-upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot-list&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; snapshot-revert&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pre-upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Live migration (공유 스토리지 전제)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; migrate&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --live&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; qemu+ssh://target-host/system&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 콘솔 접속&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;virsh&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; console&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; web01&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;이미지-관리-qcow2-체인-주의&quot;&gt;이미지 관리 (qcow2 체인 주의)&lt;/h2&gt;
&lt;p&gt;qcow2 는 스냅샷을 CoW (Copy-on-Write) 체인으로 구현합니다. 스냅샷이 쌓이면 읽기 시 체인을 순회해 성능이 저하됩니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 체인 병합 (단일 파일로 평탄화)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;qemu-img&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; qcow2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -O&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; qcow2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vm-with-snapshots.qcow2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vm-flat.qcow2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 디스크 정보 확인 (backing file 체인 확인)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;qemu-img&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; info&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --backing-chain&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vm.qcow2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 사용 실제 크기 vs 가상 크기&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;qemu-img&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; info&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vm.qcow2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -E&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;virtual|disk&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
프로덕션에서 스냅샷을 주기적으로 flatten 하거나, 백업은 &lt;code&gt;qemu-img convert&lt;/code&gt; 로 별도 파일로 내보내세요. 스냅샷은 임시 수단입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;vm-이-컨테이너보다-유리한-경우&quot;&gt;VM 이 컨테이너보다 유리한 경우&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;다른 커널 필요&lt;/strong&gt;: Linux 위에서 Windows 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커널 수준 튜닝&lt;/strong&gt;: 실시간 커널, 커스텀 모듈 로드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;강한 격리 필요&lt;/strong&gt;: 규제 산업 (금융, 의료), 멀티테넌트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 에뮬레이션&lt;/strong&gt;: 다른 CPU 아키텍처, 특수 디바이스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;레거시 앱&lt;/strong&gt;: 오래된 OS 그대로 유지 (Windows Server 2003 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vm-이-잘-안-맞는-경우&quot;&gt;VM 이 잘 안 맞는 경우&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;마이크로서비스 (수백~수천 인스턴스): 부팅/이미지 부담이 큼&lt;/li&gt;
&lt;li&gt;짧은 수명 워크로드 (배치 잡): 부팅에 몇 분 걸리면 잡보다 오래 걸릴 수 있음&lt;/li&gt;
&lt;li&gt;개발자 로컬 반복 (edit-restart): container 대비 반복 사이클이 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이런 경우 [[docker|container]] 가 자연스러운 선택입니다.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[virtualization|가상화 전체]]&lt;/li&gt;
&lt;li&gt;관련 [[hypervisor|Hypervisor]]&lt;/li&gt;
&lt;li&gt;관련 [[vm-vs-container|VM vs Container 심층 비교]]&lt;/li&gt;
&lt;li&gt;관련 [[docker|Docker]]&lt;/li&gt;
&lt;li&gt;Cloud-init: &lt;a href=&quot;https://cloudinit.readthedocs.io/&quot;&gt;https://cloudinit.readthedocs.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;libvirt: &lt;a href=&quot;https://libvirt.org/&quot;&gt;https://libvirt.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rusty Russell, &lt;a href=&quot;https://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf&quot;&gt;virtio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>virtualization</category><category>vm</category><category>guest-os</category><category>virtio</category><category>cloud</category><author>koa (김신건)</author></item><item><title>VM vs Container: 층 구조, 성능, 격리 완벽 비교</title><link>https://shinkeonkim.com/wiki/virtualization/vm-vs-container/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/vm-vs-container/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VM 과 Container 는 같은 문제 (하나의 물리 서버에 여러 워크로드 격리) 를 다른 방식으로 푸는 두 접근&lt;/strong&gt; 입니다. VM 은 하드웨어를 가상화하고, Container 는 OS 를 가상화합니다. 이 근본적 차이가 성능, 격리, 이미지 크기, 부팅 시간 모두를 결정합니다.&lt;/p&gt;
&lt;p&gt;이 문서는 두 접근을 시각화 세 개로 완전 해부합니다.&lt;/p&gt;
&lt;h2 id=&quot;층-구조&quot;&gt;층 구조&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;vm-스택-왼쪽&quot;&gt;VM 스택 (왼쪽)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hardware&lt;/strong&gt; → &lt;strong&gt;Host OS&lt;/strong&gt; (Type 2) 또는 없음 (Type 1) → &lt;strong&gt;Hypervisor&lt;/strong&gt; → &lt;strong&gt;Guest Kernel × N&lt;/strong&gt; → &lt;strong&gt;libs / bins × N&lt;/strong&gt; → &lt;strong&gt;App × N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;각 VM 이 &lt;strong&gt;자체 커널 인스턴스&lt;/strong&gt; 를 실행&lt;/li&gt;
&lt;li&gt;게스트가 물리 하드웨어를 착각하도록 hypervisor 가 CPU/메모리/디바이스를 가상화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;container-스택-오른쪽&quot;&gt;Container 스택 (오른쪽)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hardware&lt;/strong&gt; → &lt;strong&gt;Host Kernel (공유!)&lt;/strong&gt; → &lt;strong&gt;Container Runtime&lt;/strong&gt; → &lt;strong&gt;libs / bins × N&lt;/strong&gt; → &lt;strong&gt;App × N&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;모든 컨테이너가 &lt;strong&gt;하나의 host 커널을 공유&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;커널의 [[cgroups-namespaces|namespaces]] 로 프로세스/파일시스템/네트워크 뷰를 격리&lt;/li&gt;
&lt;li&gt;[[cgroups-namespaces|cgroups]] 로 CPU/메모리 사용량 상한 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;핵심-요점&quot;&gt;핵심 요점&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;“어디까지 공유하는가”&lt;/strong&gt; 가 모든 차이를 만듭니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM: 하드웨어까지만 공유 → 각자 커널, 강한 격리, 큰 오버헤드&lt;/li&gt;
&lt;li&gt;Container: 커널까지 공유 → 얇은 격리, 낮은 오버헤드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;왜-container-가-빠른가&quot;&gt;왜 Container 가 빠른가&lt;/h2&gt;
&lt;h3 id=&quot;1-커널-부팅-없음&quot;&gt;1. 커널 부팅 없음&lt;/h3&gt;
&lt;p&gt;VM 부팅: BIOS/UEFI → 부트로더 → 커널 초기화 (수십 초) → init/systemd → 앱&lt;/p&gt;
&lt;p&gt;Container 부팅: 프로세스 fork → namespace 설정 → chroot → 앱 실행 (수백 ms)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;커널을 부팅하지 않는다는 것 자체가 최대 이득&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;h3 id=&quot;2-시스템콜-직접-실행&quot;&gt;2. 시스템콜 직접 실행&lt;/h3&gt;
&lt;p&gt;VM 의 앱이 시스템콜을 하면: 게스트 커널로 → hypervisor 트랩 (VT-x 도움) → 필요시 에뮬레이션 → 게스트 커널이 응답 → 앱&lt;/p&gt;
&lt;p&gt;Container 의 앱이 시스템콜을 하면: &lt;strong&gt;host 커널로 직접&lt;/strong&gt;. 트랩도 게스트 커널도 없음.&lt;/p&gt;
&lt;p&gt;virtio, EPT 등 하드웨어 가속으로 VM 오버헤드는 많이 줄었지만, syscall 밀집형 워크로드 (파일 I/O, 네트워크) 에서는 여전히 container 가 유리합니다.&lt;/p&gt;
&lt;h3 id=&quot;3-메모리-오버헤드가-작다&quot;&gt;3. 메모리 오버헤드가 작다&lt;/h3&gt;
&lt;p&gt;VM 하나: 게스트 커널 자체가 100~500MB, glibc/systemd 등 기본 서비스 포함하면 GB 단위 시작&lt;/p&gt;
&lt;p&gt;Container 하나: libs + app 만, MB~수십 MB&lt;/p&gt;
&lt;p&gt;같은 하드웨어에 VM 수십 개 vs Container 수천 개가 물리적 한계입니다.&lt;/p&gt;
&lt;h3 id=&quot;4-이미지-크기가-작다&quot;&gt;4. 이미지 크기가 작다&lt;/h3&gt;
&lt;p&gt;VM 이미지: 전체 배포판 (수 GB)&lt;/p&gt;
&lt;p&gt;Container 이미지: 앱 + 필요한 libs 만 (수십 MB)&lt;/p&gt;
&lt;p&gt;특히 [[docker|Docker]] 의 layered filesystem 은 여러 컨테이너가 read-only 레이어를 공유해 저장 공간을 크게 절약합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;왜-vm-이-강한가&quot;&gt;왜 VM 이 강한가&lt;/h2&gt;
&lt;h3 id=&quot;1-완전한-격리&quot;&gt;1. 완전한 격리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;각자 커널이므로 &lt;strong&gt;한 게스트에서 커널을 아무리 만져도 다른 게스트는 무영향&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Container 는 host 커널 취약점이 있으면 모든 컨테이너에 영향&lt;/li&gt;
&lt;li&gt;규제/보안 감사 요구가 강한 도메인에서 VM 이 선호되는 이유&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-다른-os-실행&quot;&gt;2. 다른 OS 실행&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linux 위에서 Windows 실행 가능 (또는 반대)&lt;/li&gt;
&lt;li&gt;Container 는 host 커널과 같은 OS 계열만 가능 (Windows container 는 Windows host, Linux container 는 Linux host)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-커널-수준-조작&quot;&gt;3. 커널 수준 조작&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;실시간 커널, 커스텀 커널 모듈, 특정 커널 버전 고정 등&lt;/li&gt;
&lt;li&gt;Container 는 host 커널 그대로 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-하드웨어-에뮬레이션&quot;&gt;4. 하드웨어 에뮬레이션&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다른 CPU 아키텍처 (예: x86 호스트에서 ARM 게스트, QEMU 로)&lt;/li&gt;
&lt;li&gt;특수 디바이스, 레거시 하드웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-live-migration&quot;&gt;5. Live Migration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;실행 중 VM 을 다른 서버로 무중단 이동 (VMware vMotion 등)&lt;/li&gt;
&lt;li&gt;Container 도 CRIU 기반 migration 있지만 성숙도 낮음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;성능-벤치마크-felter-et-al-ibm-2015&quot;&gt;성능 벤치마크 (Felter et al., IBM 2015)&lt;/h2&gt;
&lt;p&gt;고전적 비교. Docker vs KVM.&lt;/p&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;워크로드&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Native&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Docker&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;KVM&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;차이&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CPU (LINPACK)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;하드웨어 가속 덕에 거의 동일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;메모리 (STREAM)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;동일&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;디스크 (fio random)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;99&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;92&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM 이 다소 손해, virtio 로 완화&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;네트워크 (TCP)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;96&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;92&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Docker bridge 오버헤드, KVM virtio-net&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;DB (MySQL)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;100&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;98&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;82&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;통합 오버헤드, KVM 이 크게 뒤짐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;부팅 시간&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;1s&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;45s&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;순서가 다름&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;요약&lt;/strong&gt;: 순수 CPU/메모리는 거의 무료, 디스크/네트워크는 각 5~10% 손해, 부팅/이미지 는 container 압승.&lt;/p&gt;
&lt;p&gt;이 벤치마크는 2015 년 것이고, 이후 하드웨어 가속과 virtio 개선으로 VM 이 상당히 따라잡았습니다. 오늘날 프로덕션 워크로드에서 순수 성능 차이는 미미하며, &lt;strong&gt;주된 차이는 부팅 속도, 이미지 크기, 밀도&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;h2 id=&quot;격리-강도-스펙트럼&quot;&gt;격리 강도 스펙트럼&lt;/h2&gt;
&lt;p&gt;가장 약한 격리 → 가장 강한 격리:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;프로세스 (chroot) &amp;#x3C; Container (namespaces+cgroups) &amp;#x3C; gVisor / Kata &amp;#x3C; VM (Type 2) &amp;#x3C; VM (Type 1) &amp;#x3C; 물리 분리&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;중간층-기술&quot;&gt;중간층 기술&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gVisor&lt;/strong&gt; (Google): 컨테이너와 host 사이에 &lt;strong&gt;사용자 공간 커널&lt;/strong&gt; 을 넣어 syscall 을 격리. Container 편의 + VM 에 근접한 격리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kata Containers&lt;/strong&gt;: 각 컨테이너를 &lt;strong&gt;microVM&lt;/strong&gt; 안에서 실행. OCI 호환. Firecracker 등 hypervisor 활용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firecracker&lt;/strong&gt;: AWS Lambda 의 기반. 125ms 부팅 microVM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Nitro Enclaves&lt;/strong&gt;: 완전 격리된 microVM, 심지어 host 도 접근 불가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 기술들은 “container 처럼 쓰고 VM 처럼 격리” 를 목표로 합니다.&lt;/p&gt;
&lt;h2 id=&quot;언제-무엇을-쓸까&quot;&gt;언제 무엇을 쓸까&lt;/h2&gt;
&lt;h3 id=&quot;vm-선호&quot;&gt;VM 선호&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;규제 산업 (금융, 의료, 정부)&lt;/li&gt;
&lt;li&gt;멀티테넌트 클라우드 (테넌트간 강한 격리 필수)&lt;/li&gt;
&lt;li&gt;서로 다른 OS 필요&lt;/li&gt;
&lt;li&gt;레거시 앱 (오래된 Windows 등)&lt;/li&gt;
&lt;li&gt;커널 수준 튜닝 (실시간 시스템)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;container-선호&quot;&gt;Container 선호&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;마이크로서비스 (수백~수천 개 서비스)&lt;/li&gt;
&lt;li&gt;CI/CD 파이프라인 (빠른 빌드/테스트/배포)&lt;/li&gt;
&lt;li&gt;자원 밀도 (더 많이 얹기)&lt;/li&gt;
&lt;li&gt;개발/운영 환경 일치 (dev = staging = prod)&lt;/li&gt;
&lt;li&gt;빠른 스케일링&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;하이브리드-현대-클라우드-표준&quot;&gt;하이브리드 (현대 클라우드 표준)&lt;/h3&gt;
&lt;p&gt;물리 서버 → EC2 VM 여러 대 → 각 VM 안에 Docker 컨테이너 수십 개.&lt;/p&gt;
&lt;p&gt;또는 &lt;strong&gt;AWS Fargate / Google Cloud Run&lt;/strong&gt;: 컨테이너를 사용하지만 내부적으로는 microVM 안에서 격리 (Firecracker + gVisor).&lt;/p&gt;
&lt;h2 id=&quot;상세-비교표&quot;&gt;상세 비교표&lt;/h2&gt;































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Virtual Machine&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Container&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;가상화 대상&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;하드웨어&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OS (namespaces + cgroups)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;커널&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;게스트 각자&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;host 공유&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;하드웨어 지원&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;VT-x, EPT, IOMMU 활용&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;없음 (커널 기능만)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;부팅 시간&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;30~60 초&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;100~500 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;이미지 크기&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GB (전체 OS)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수십 MB (앱 중심)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;메모리 오버헤드&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GB (게스트 커널 포함)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;MB (프로세스만)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;CPU 오버헤드&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~5% (하드웨어 가속 후)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~1%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;디스크 I/O&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;90~95% (virtio)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~99%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;네트워크&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;90~95% (virtio-net, SR-IOV)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;~99% (host mode 시)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;격리 강도&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;강함 (커널 분리)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간 (커널 공유)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;밀도 (서버당)&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수십 개&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수백~수천 개&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;다른 OS 실행&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;가능&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;불가 (같은 커널 계열만)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;관리 도구&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;libvirt, vSphere, Hyper-V Mgr&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Docker, Podman, Kubernetes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;오케스트레이션&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OpenStack, VMware vRealize&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kubernetes, Nomad, Docker Swarm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;live migration&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;성숙 (vMotion, KVM libvirt)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;미성숙 (CRIU)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;이미지 포맷&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;qcow2, VMDK, VHD, OVF&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OCI (Docker/Docker Hub)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;주요 hypervisor / runtime&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM, Xen, ESXi, Hyper-V&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;containerd, runc, CRI-O&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;혼동하기-쉬운-지점&quot;&gt;혼동하기 쉬운 지점&lt;/h2&gt;
&lt;h3 id=&quot;container-는-프로세스일-뿐&quot;&gt;”Container 는 프로세스일 뿐?”&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;절반 맞습니다.&lt;/strong&gt; 컨테이너 안의 프로세스는 host 커널 관점에서 그냥 다른 프로세스와 동등합니다. &lt;code&gt;ps aux&lt;/code&gt; 를 host 에서 실행하면 컨테이너의 프로세스가 보입니다. 다만 컨테이너 안에서 &lt;code&gt;ps&lt;/code&gt; 를 실행하면 자기 [[cgroups-namespaces|PID namespace]] 만 보이므로 다른 컨테이너의 프로세스는 안 보입니다.&lt;/p&gt;
&lt;h3 id=&quot;vm-도-container-도-부팅한다&quot;&gt;”VM 도 container 도 부팅한다?”&lt;/h3&gt;
&lt;p&gt;용어 오해입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM 은 &lt;strong&gt;게스트 커널을 부팅&lt;/strong&gt;합니다 (BIOS → 부트로더 → 커널 초기화)&lt;/li&gt;
&lt;li&gt;Container 는 &lt;strong&gt;프로세스를 시작&lt;/strong&gt;할 뿐, 부팅이 없습니다. &lt;code&gt;docker run alpine echo hi&lt;/code&gt; 는 그냥 새 프로세스 fork 후 namespace 격리한 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;docker-는-vm-이다&quot;&gt;”Docker 는 VM 이다?”&lt;/h3&gt;
&lt;p&gt;macOS 나 Windows 에서 Docker Desktop 을 쓰면 &lt;strong&gt;내부적으로는 Linux VM 을 하나 띄우고 그 안에 Docker 를 실행&lt;/strong&gt; 합니다. Linux 커널이 없는 host 에서 Linux container 를 돌리려면 어쩔 수 없습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS: HyperKit 또는 QEMU 기반&lt;/li&gt;
&lt;li&gt;Windows: WSL2 (Hyper-V 기반)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux host 에서는 순수 컨테이너입니다.&lt;/p&gt;
&lt;h3 id=&quot;container-는-안전한가&quot;&gt;”Container 는 안전한가?”&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Container escape&lt;/strong&gt; 은 실존하는 위협입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2019-5736 (runc): 호스트 runc 바이너리를 컨테이너가 덮어써서 escape&lt;/li&gt;
&lt;li&gt;CVE-2022-0492 (cgroups v1): rogue cgroup 으로 root 상승&lt;/li&gt;
&lt;li&gt;Kernel 취약점 → 모든 컨테이너 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;기본 방어층: &lt;strong&gt;seccomp&lt;/strong&gt; (syscall 화이트리스트), &lt;strong&gt;AppArmor / SELinux&lt;/strong&gt;, &lt;strong&gt;user namespace&lt;/strong&gt; (rootless), &lt;strong&gt;capabilities drop&lt;/strong&gt;, &lt;strong&gt;read-only filesystem&lt;/strong&gt;. 이 방어층을 다 켜면 실용적 격리 강도는 상당히 올라갑니다. 그래도 VM 만큼은 아닙니다.&lt;/p&gt;
&lt;h2 id=&quot;예제-성능-실측-감각&quot;&gt;예제 성능 (실측 감각)&lt;/h2&gt;
&lt;p&gt;로컬 노트북 기준 (M1 Pro, macOS + Docker Desktop):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alpine container &lt;code&gt;docker run --rm alpine echo hi&lt;/code&gt;: ~250ms&lt;/li&gt;
&lt;li&gt;Ubuntu container &lt;code&gt;docker run --rm ubuntu:24.04 echo hi&lt;/code&gt;: ~400ms (첫 실행 이미지 pull 제외)&lt;/li&gt;
&lt;li&gt;KVM Ubuntu 24.04 부팅 (&lt;code&gt;virsh start&lt;/code&gt;): ~40s&lt;/li&gt;
&lt;li&gt;VirtualBox Ubuntu 부팅: ~50s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이미지 크기:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;alpine:latest&lt;/code&gt;: ~8 MB&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu:24.04&lt;/code&gt;: ~80 MB&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx:latest&lt;/code&gt;: ~190 MB&lt;/li&gt;
&lt;li&gt;Ubuntu 24.04 cloud-image qcow2: ~600 MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;메모리 사용 (idle):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alpine container: ~2 MB&lt;/li&gt;
&lt;li&gt;nginx container: ~10 MB&lt;/li&gt;
&lt;li&gt;KVM Ubuntu 최소 설치: ~500 MB&lt;/li&gt;
&lt;li&gt;KVM Ubuntu desktop: ~2 GB&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[virtualization|가상화 전체]]&lt;/li&gt;
&lt;li&gt;관련 [[hypervisor|Hypervisor]]&lt;/li&gt;
&lt;li&gt;관련 [[virtual-machine|Virtual Machine]]&lt;/li&gt;
&lt;li&gt;관련 [[docker|Docker]]&lt;/li&gt;
&lt;li&gt;관련 [[lxc-system-containers|LXC]]&lt;/li&gt;
&lt;li&gt;관련 [[cgroups-namespaces|cgroups + namespaces]]&lt;/li&gt;
&lt;li&gt;관련 [[k8s-pod|Kubernetes Pod]]&lt;/li&gt;
&lt;li&gt;벤치마크: &lt;a href=&quot;https://dominoweb.draco.res.ibm.com/reports/rc25482.pdf&quot;&gt;Felter et al. 2015, IBM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gVisor: &lt;a href=&quot;https://gvisor.dev/&quot;&gt;https://gvisor.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kata Containers: &lt;a href=&quot;https://katacontainers.io/&quot;&gt;https://katacontainers.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>virtualization</category><category>vm</category><category>container</category><category>docker</category><category>comparison</category><author>koa (김신건)</author></item><item><title>가상화 (Virtualization): 하드웨어, OS, 컨테이너 계층 전체 정리</title><link>https://shinkeonkim.com/wiki/virtualization/virtualization/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/virtualization/virtualization/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;가상화 (Virtualization)&lt;/strong&gt; 는 물리 자원 (CPU, RAM, 디스크, NIC) 을 소프트웨어 계층으로 감싸 &lt;strong&gt;여러 논리 인스턴스로 분할&lt;/strong&gt; 하거나 &lt;strong&gt;하나로 통합&lt;/strong&gt; 하는 기술 전반입니다. “한 대의 머신을 여러 대처럼”, 또는 “여러 대를 한 대처럼” 보이게 만드는 것이 목적입니다.&lt;/p&gt;
&lt;p&gt;가상화는 크게 다음 세 층에서 일어납니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 가상화&lt;/strong&gt;: hypervisor 가 CPU/메모리를 나눠 [[virtual-machine|VM]] 을 만듭니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS 수준 가상화&lt;/strong&gt;: 커널이 프로세스 그룹을 격리해 [[docker|container]] 를 만듭니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 가상화&lt;/strong&gt;: JVM, WebAssembly 등 언어 런타임이 앱을 격리합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;왜-가상화하는가&quot;&gt;왜 가상화하는가&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;자원 활용률&lt;/strong&gt;: 물리 서버 한 대의 CPU 가 5% 만 쓰이는 것이 흔합니다. 가상화로 여러 워크로드를 밀집시키면 30~70% 까지 올릴 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;격리&lt;/strong&gt;: 워크로드 A 의 크래시가 B 에 영향 주지 않음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이식성&lt;/strong&gt;: 이미지 형태로 다른 하드웨어에 옮길 수 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재현성&lt;/strong&gt;: 개발 환경과 운영 환경을 동일하게 만들 수 있음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;관리성&lt;/strong&gt;: 스냅샷, 라이브 마이그레이션, 자동 스케일링이 가능해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;가상화-분류-taxonomy&quot;&gt;가상화 분류 (taxonomy)&lt;/h2&gt;
&lt;h3 id=&quot;1-하드웨어-가상화-full-virtualization&quot;&gt;1. 하드웨어 가상화 (Full Virtualization)&lt;/h3&gt;
&lt;p&gt;Hypervisor 가 CPU/메모리/디바이스를 완전히 에뮬레이션하여, &lt;strong&gt;게스트 OS 는 자기가 실물 하드웨어 위에 있다고 착각&lt;/strong&gt; 하도록 만듭니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;게스트 OS 커널을 &lt;strong&gt;수정 없이&lt;/strong&gt; 그대로 실행&lt;/li&gt;
&lt;li&gt;대신 CPU 의 특권 명령 (privileged instruction) 을 hypervisor 가 가로채 처리 → 오버헤드 발생&lt;/li&gt;
&lt;li&gt;Intel &lt;strong&gt;VT-x&lt;/strong&gt;, AMD &lt;strong&gt;AMD-V&lt;/strong&gt; 같은 하드웨어 지원이 나오면서 오버헤드가 크게 감소했습니다 (2005~)&lt;/li&gt;
&lt;li&gt;예: KVM, VMware ESXi, VirtualBox, Hyper-V&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-paravirtualization&quot;&gt;2. Paravirtualization&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;게스트 OS 를 수정&lt;/strong&gt; 하여, 성능이 중요한 명령을 hypervisor 에 직접 hypercall 로 요청하게 합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특권 명령 트랩이 없어 오버헤드가 작음&lt;/li&gt;
&lt;li&gt;게스트 OS 소스에 접근할 수 있어야 하므로 폐쇄 OS (오래된 Windows) 에는 부적합&lt;/li&gt;
&lt;li&gt;원조: &lt;strong&gt;Xen&lt;/strong&gt; (2003 년 케임브리지)&lt;/li&gt;
&lt;li&gt;오늘날 순수 paravirt 는 드물고, 하이브리드 (하드웨어 지원 + paravirt 드라이버) 형태가 표준&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-os-level-virtualization-containers&quot;&gt;3. OS-Level Virtualization (Containers)&lt;/h3&gt;
&lt;p&gt;Hypervisor 가 아니라 &lt;strong&gt;커널 자체가 여러 격리된 실행 환경&lt;/strong&gt; 을 제공합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;같은 커널을 공유하지만 [[cgroups-namespaces|namespaces]] 로 프로세스/파일시스템/네트워크 뷰를 분리&lt;/li&gt;
&lt;li&gt;[[cgroups-namespaces|cgroups]] 로 CPU/메모리 사용량 제한&lt;/li&gt;
&lt;li&gt;커널 부팅 없음 → &lt;strong&gt;부팅이 순식간&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;예: [[docker|Docker]], [[lxc-system-containers|LXC/LXD]], Podman, systemd-nspawn, FreeBSD Jails, Solaris Zones&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-application-virtualization&quot;&gt;4. Application Virtualization&lt;/h3&gt;
&lt;p&gt;앱 자체를 언어 런타임이나 샌드박스로 격리합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JVM&lt;/strong&gt; (Java): 바이트코드를 어느 OS/CPU 에서도 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt;: 브라우저 및 서버 (Wasmtime, Wasmer) 에서 안전한 실행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firecracker&lt;/strong&gt;: AWS 가 만든 초경량 hypervisor (Lambda 에서 사용), 애플리케이션 가상화라기보다 microVM 이지만 경계에 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;계층-비교&quot;&gt;계층 비교&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;핵심은 &lt;strong&gt;“어디까지 공유하는가”&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM: &lt;strong&gt;하드웨어만 공유&lt;/strong&gt; (커널, libs, app 모두 게스트 각자)&lt;/li&gt;
&lt;li&gt;Container: &lt;strong&gt;커널까지 공유&lt;/strong&gt; (libs, app 만 각자)&lt;/li&gt;
&lt;li&gt;Application VM: &lt;strong&gt;OS 까지 공유&lt;/strong&gt; (런타임과 앱만 격리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;공유 범위가 넓을수록 가볍고 빠르지만, 격리 강도는 약해집니다. &lt;strong&gt;가벼움 vs 격리&lt;/strong&gt; 트레이드오프.&lt;/p&gt;
&lt;h2 id=&quot;종합-비교표&quot;&gt;종합 비교표&lt;/h2&gt;




































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;축&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Full Virtualization (VM)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Paravirtualization&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Container (OS-level)&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;App VM&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;격리 대상&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;하드웨어&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;하드웨어 (수정된 게스트)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;프로세스 그룹&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;프로세스&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;커널&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;게스트 각자&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;게스트 각자 (hypercall)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;host 공유&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;host 공유&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;부팅 시간&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;분 단위&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;수초 ~ 분&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;초 단위&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;밀리초&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;오버헤드&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간 (하드웨어 가속으로 완화)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;매우 낮음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;최저&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;격리 강도&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;강함&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;강함&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;중간 (커널 취약점 공유)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;약함&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;밀도&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서버당 수십 개&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서버당 수십 개&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;서버당 수백~수천 개&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;프로세스만큼&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;이미지 크기&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GB 단위&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;GB 단위&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;MB 단위&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KB ~ MB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;대표&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;KVM, ESXi, Hyper-V&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Xen, KVM+virtio&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Docker, LXC&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;JVM, Wasm&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;언제-무엇을-쓰는가&quot;&gt;언제 무엇을 쓰는가&lt;/h2&gt;
&lt;h3 id=&quot;vm-이-유리한-경우&quot;&gt;VM 이 유리한 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다른 커널이 필요할 때 (Linux 위에서 Windows 실행)&lt;/li&gt;
&lt;li&gt;강한 격리가 필수 (멀티테넌트 클라우드, 규제 산업)&lt;/li&gt;
&lt;li&gt;커널 수준 튜닝이 필요할 때 (실시간 커널, 커스텀 모듈)&lt;/li&gt;
&lt;li&gt;이식 대상이 다른 CPU 아키텍처 (QEMU 로 x86 → ARM 에뮬레이션)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;container-가-유리한-경우&quot;&gt;Container 가 유리한 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;개발/운영 환경 일치 (dev = staging = prod)&lt;/li&gt;
&lt;li&gt;마이크로서비스 (하나에 수십~수백 서비스 배포)&lt;/li&gt;
&lt;li&gt;빠른 스케일링 (몇 초 안에 새 인스턴스)&lt;/li&gt;
&lt;li&gt;자원 밀도가 중요 (같은 하드웨어에 더 많이)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;하이브리드&quot;&gt;하이브리드&lt;/h3&gt;
&lt;p&gt;현대 클라우드는 두 층 모두 씁니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;물리 서버 → 여러 [[virtual-machine|VM]] (예: EC2 인스턴스)&lt;/li&gt;
&lt;li&gt;각 VM 안에 여러 [[docker|Container]] (예: 쿠버네티스 파드)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS Fargate, Google Cloud Run 은 &lt;strong&gt;하나의 컨테이너를 microVM 안에 실행&lt;/strong&gt; 하는 방식으로 컨테이너의 편의와 VM 의 격리를 결합합니다 (Firecracker, gVisor).&lt;/p&gt;
&lt;h2 id=&quot;하드웨어-지원&quot;&gt;하드웨어 지원&lt;/h2&gt;
&lt;p&gt;CPU 가 가상화를 도와주는 기능들:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intel VT-x / AMD-V&lt;/strong&gt;: 특권 명령 트랩을 하드웨어 수준에서 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intel EPT / AMD RVI&lt;/strong&gt;: 게스트-호스트 페이지 테이블 이중 관리를 하드웨어로 (nested paging)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VT-d / AMD-Vi (IOMMU)&lt;/strong&gt;: 게스트가 특정 PCI 디바이스를 직접 접근하도록 안전하게 매핑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SR-IOV&lt;/strong&gt;: NIC 하나를 여러 게스트가 하드웨어 레벨로 나누어 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APICv, GICv3&lt;/strong&gt;: 인터럽트 가상화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 지원들 덕에 오늘날 VM 오버헤드는 대부분의 워크로드에서 5% 미만입니다.&lt;/p&gt;
&lt;h2 id=&quot;성능-오버헤드가-발생하는-지점&quot;&gt;성능 오버헤드가 발생하는 지점&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VM 이 왜 느린가&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CPU 특권 명령 트랩&lt;/strong&gt;: 하드웨어 지원으로 크게 완화됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 접근&lt;/strong&gt;: 게스트 물리 → 호스트 물리 이중 변환 (EPT 도움)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I/O&lt;/strong&gt;: 디스크/네트워크가 hypervisor 를 경유 (virtio 로 완화)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;부팅 시간&lt;/strong&gt;: 게스트 커널을 매번 부팅해야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Container 가 왜 빠른가&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;커널 공유&lt;/strong&gt;: 게스트 커널 부팅 자체가 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;직접 시스템콜&lt;/strong&gt;: 게스트 커널 트랩이 없어 syscall 오버헤드 최소&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이미지 크기&lt;/strong&gt;: MB 단위, 다운로드/실행 빠름&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CoW 파일시스템&lt;/strong&gt;: 여러 컨테이너가 read-only 레이어를 공유&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;함정과-오해&quot;&gt;함정과 오해&lt;/h2&gt;
&lt;h3 id=&quot;container-는-항상-빠르다&quot;&gt;”Container 는 항상 빠르다”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Startup 은 확실히 빠릅니다&lt;/li&gt;
&lt;li&gt;하지만 &lt;strong&gt;런타임 CPU/메모리 성능&lt;/strong&gt; 은 VM 과 큰 차이 없습니다 (하드웨어 가속으로 VM 도 빠름)&lt;/li&gt;
&lt;li&gt;밀도 (같은 하드웨어에 몇 개 얹을 수 있는가) 관점에서 컨테이너가 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;vm-은-격리가-완벽하다&quot;&gt;”VM 은 격리가 완벽하다”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;이론적으로는 강한 격리&lt;/li&gt;
&lt;li&gt;하지만 &lt;strong&gt;Spectre, Meltdown&lt;/strong&gt; 같은 CPU-level 취약점은 VM 경계를 넘습니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row Hammer&lt;/strong&gt; 같은 DRAM 공격도 이론적으로 가능&lt;/li&gt;
&lt;li&gt;완벽한 격리는 없음, “충분히 강한 격리” 만 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;container-는-격리가-약하다&quot;&gt;”Container 는 격리가 약하다”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker default 로는 root capability, seccomp filter, AppArmor 등 여러 방어층이 이미 켜져 있습니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gVisor&lt;/strong&gt; (Google) 나 &lt;strong&gt;Kata Containers&lt;/strong&gt; 는 컨테이너를 microVM 안에서 실행하여 격리를 강화합니다&lt;/li&gt;
&lt;li&gt;Firecracker (AWS Lambda) 도 이 계열&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;가상화는-오버헤드가-크다&quot;&gt;”가상화는 오버헤드가 크다”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2005 년 이전에는 사실이었습니다&lt;/li&gt;
&lt;li&gt;하드웨어 지원 이후 대부분의 워크로드에서 5% 미만&lt;/li&gt;
&lt;li&gt;예외: CPU 밀집형 (HFT), GPU 가상화 (NVIDIA vGPU 는 여전히 특수한 기술)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;가상화-레이어-스택&quot;&gt;가상화 레이어 스택&lt;/h2&gt;
&lt;p&gt;현대 클라우드의 2단 계층 구조를 시각화합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HW[&quot;물리 하드웨어&amp;#x3C;br/&gt;CPU / RAM / NIC / Disk&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HW --&gt; HV[&quot;Type 1 Hypervisor&amp;#x3C;br/&gt;KVM, ESXi, Hyper-V&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt; VM1[&quot;VM 1&amp;#x3C;br/&gt;게스트 커널 + OS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    HV --&gt; VM2[&quot;VM 2&amp;#x3C;br/&gt;게스트 커널 + OS&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VM1 --&gt; CRT[&quot;Container Runtime&amp;#x3C;br/&gt;Docker, containerd&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CRT --&gt; C1[&quot;Container A&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    CRT --&gt; C2[&quot;Container B&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    VM2 --&gt; App[&quot;직접 실행 앱&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;물리 하드웨어 → Type 1 하이퍼바이저 → VM → 컨테이너 런타임 → 컨테이너 순서로 쌓이는 것이 AWS EC2 + ECS/EKS 구성의 실제 모습입니다.&lt;/p&gt;
&lt;h2 id=&quot;최신-동향-microvm&quot;&gt;최신 동향: microVM&lt;/h2&gt;
&lt;p&gt;일반 VM 보다 훨씬 가벼운 &lt;em&gt;microVM&lt;/em&gt; 이 서버리스 / FaaS 의 테넌트 격리 계층이 되었습니다.&lt;/p&gt;
&lt;h3 id=&quot;firecracker-aws-lambda-fargate&quot;&gt;Firecracker (AWS Lambda, Fargate)&lt;/h3&gt;
&lt;p&gt;AWS 가 Rust 로 작성한 초경량 KVM hypervisor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부팅 시간 &lt;strong&gt;125 ms 이하&lt;/strong&gt; (일반 VM 수십 초 대비)&lt;/li&gt;
&lt;li&gt;메모리 오버헤드 &lt;strong&gt;약 5 MB&lt;/strong&gt; (일반 hypervisor 수백 MB)&lt;/li&gt;
&lt;li&gt;Lambda 는 각 함수 호출을 별도 microVM 에서 실행해 테넌트 격리&lt;/li&gt;
&lt;li&gt;KVM 위에서 동작, x86-64 / aarch64 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;gvisor-google-gke-sandbox&quot;&gt;gVisor (Google GKE Sandbox)&lt;/h3&gt;
&lt;p&gt;컨테이너의 syscall 을 사용자 공간 커널이 처리하는 샌드박스.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너가 host 커널을 직접 호출하지 않음 → 커널 취약점 공격면 축소&lt;/li&gt;
&lt;li&gt;Go 로 작성, &lt;code&gt;runsc&lt;/code&gt; OCI 런타임으로 containerd / CRI-O 와 통합&lt;/li&gt;
&lt;li&gt;GKE Sandbox 옵션으로 활성화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kata-containers&quot;&gt;Kata Containers&lt;/h3&gt;
&lt;p&gt;OCI 컨테이너 이미지를 경량 VM 안에서 실행하는 CNCF 프로젝트.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“컨테이너 API + VM 격리”를 함께 제공&lt;/li&gt;
&lt;li&gt;QEMU / Firecracker / Cloud Hypervisor 백엔드 선택 가능&lt;/li&gt;
&lt;li&gt;containerd + &lt;code&gt;kata-containers&lt;/code&gt; shim 으로 기존 쿠버네티스 클러스터에 통합&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
microVM 은 “컨테이너의 편의 + VM 의 격리”를 결합합니다. 멀티테넌트 FaaS 와 공개 클라우드에서 점점 표준이 되고 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;numa-와-가상화&quot;&gt;NUMA 와 가상화&lt;/h2&gt;
&lt;p&gt;대용량 서버에서 VM 을 배치할 때 NUMA (Non-Uniform Memory Access) 를 무시하면 성능 저하가 큽니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NUMA 노드&lt;/strong&gt;: CPU 와 해당 CPU 가 빠르게 접근하는 RAM 의 묶음&lt;/li&gt;
&lt;li&gt;VM 이 여러 NUMA 노드에 걸치면 원격 메모리 접근 지연 발생&lt;/li&gt;
&lt;li&gt;KVM / ESXi 는 NUMA topology 를 VM 에 반영하는 &lt;em&gt;pinning&lt;/em&gt; 기능 제공&lt;/li&gt;
&lt;li&gt;컨테이너 수준: &lt;code&gt;numactl&lt;/code&gt; 또는 쿠버네티스 Topology Manager 로 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[hypervisor|Hypervisor Type 1 vs Type 2]]&lt;/li&gt;
&lt;li&gt;관련 [[virtual-machine|Virtual Machine 개념]]&lt;/li&gt;
&lt;li&gt;관련 [[docker|Docker]]&lt;/li&gt;
&lt;li&gt;관련 [[lxc-system-containers|LXC / LXD]]&lt;/li&gt;
&lt;li&gt;관련 [[cgroups-namespaces|cgroups + namespaces]]&lt;/li&gt;
&lt;li&gt;관련 [[vm-vs-container|VM vs Container 심층 비교]]&lt;/li&gt;
&lt;li&gt;Xen 논문: &lt;a href=&quot;https://www.cl.cam.ac.uk/research/srg/netos/papers/2003-xensosp.pdf&quot;&gt;Xen and the Art of Virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipedia: &lt;a href=&quot;https://en.wikipedia.org/wiki/Hardware_virtualization&quot;&gt;Hardware virtualization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>virtualization</category><category>vm</category><category>container</category><category>hypervisor</category><category>cloud</category><author>koa (김신건)</author></item></channel></rss>