<?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>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;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;하드웨어-지원&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;함정&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;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;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;공식: &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;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;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;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;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;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><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>Thu, 25 Jun 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&amp;#x3C;br/&gt;(격리)&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&amp;#x3C;br/&gt;(자원 제한)&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&amp;#x3C;br/&gt;(layered FS)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;namespaces-격리&quot;&gt;Namespaces (격리)&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Namespace&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;/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;/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;/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;/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;/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;/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;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;&lt;td&gt;clock&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;/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[/sys/fs/cgroup/]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Root --&gt; ContainerA[container-a/]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Root --&gt; ContainerB[container-b/]&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&amp;#x3C;br/&gt;(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[memory.max = 512M]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerA --&gt; IO[io.max = read 100MB/s]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerB --&gt; CPU2[cpu.max = 200000 100000]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    ContainerB --&gt; Mem2[memory.max = 2G]&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;/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;/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;/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;/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;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;network&lt;/code&gt; (BPF)&lt;/td&gt;&lt;td&gt;NIC bandwidth&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;/tr&gt;&lt;/tbody&gt;&lt;/table&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&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;계층&lt;/td&gt;&lt;td&gt;controller 별 다수&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;legacy&lt;/td&gt;&lt;td&gt;&lt;em&gt;모든 현대 distro&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;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;    Container-&gt;&gt;OS: allocate memory (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;Container: ENOMEM 또는 OOM kill&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Note over 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;Container: SIGKILL (즉시)&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;. 애플리케이션이 &lt;em&gt;준비 안 됨&lt;/em&gt;. limit 보수적으로.&lt;/p&gt;
&lt;/blockquote&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 내부 root (uid 0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;host: uid 100000 (제한된 일반 사용자)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&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;/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&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&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;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;blockquote&gt;
&lt;p&gt;Layered FS 의 &lt;em&gt;append-only&lt;/em&gt; 동작 직관 (Linked list 의 &lt;em&gt;읽기 시 위에서 아래로&lt;/em&gt; 와 유사).&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;--privileged&lt;/code&gt;&lt;/strong&gt; = 모든 namespace 해제. 컨테이너 의미 없음. &lt;em&gt;capabilities&lt;/em&gt; 만 추가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;호스트 PID/IPC/Network 공유&lt;/strong&gt; = 컨테이너 = host process. 격리 없음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU limit 의 throttle&lt;/strong&gt; = container 가 &lt;em&gt;느려짐&lt;/em&gt; (kill 아님). 메트릭으로 확인.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory limit 너무 작음&lt;/strong&gt; = OOM kill 반복. 측정.&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;[[oci-image]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;li&gt;[[container-image-best-practices]]&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>Thu, 25 Jun 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;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&amp;#x3C;br/&gt;(큰 dependency)&quot;] --&gt;|결과물만 복사| Stage2[&quot;Stage 2: runtime&amp;#x3C;br/&gt;(작은 base)&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;빌드 도구는 final image 에 안 들어감&lt;/em&gt;. 최종 image 가 &lt;em&gt;작고 안전&lt;/em&gt;.&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&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GHCR (GitHub)&lt;/td&gt;&lt;td&gt;github 통합&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ECR (AWS)&lt;/td&gt;&lt;td&gt;IAM 통합&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&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;build-vs-buildx-buildkit&quot;&gt;Build vs Buildx (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;# 옛 docker build&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; 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&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Buildx (멀티 아키 + 캐시 + 병렬)&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; --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; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; myapp&lt;/span&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;/code&gt;&lt;/pre&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;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;/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.&lt;/p&gt;
&lt;/blockquote&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;# ❌ 의존성과 코드 같이 복사 → 코드 변경 시 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 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;# ✅ 의존성 먼저&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;/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;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; 명시.&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;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;관련-위키&quot;&gt;관련 위키&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[oci-image]]&lt;/li&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><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>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&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[1. 작게]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Sec[2. 안전하게]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Cache[3. Layer cache 활용]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Repro[4. Reproducible]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Q --&gt; Sign[5. Sign + Scan]&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;적합&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;개발 / 디버깅 친화&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;일반&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 libc (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;Go / Rust 정적 binary&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;Node, 안전&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;Java&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;정적 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 없음&lt;/em&gt;. 공격 면 감소. Google 권장.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2-multi-stage-build&quot;&gt;2. Multi-stage build&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;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 /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;blockquote&gt;
&lt;p&gt;&lt;em&gt;최종 image 에 빌드 도구 없음&lt;/em&gt;. 수십 MB → 수 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;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# ❌ 모든 코드 복사 후 install&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 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;# ✅ 의존성 파일만 먼저&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;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;코드 변경&lt;/em&gt; 시 &lt;em&gt;npm ci layer 캐시 활용&lt;/em&gt;. 빌드 시간 &lt;em&gt;수배 단축&lt;/em&gt;.&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:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; addgroup -g 1000 app &amp;#x26;&amp;#x26; adduser -D -u 1000 -G 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; 1000:1000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는 distroless 의 &lt;code&gt;:nonroot&lt;/code&gt;.&lt;/p&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 (image 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 cp /run/secrets/npmrc ~/.npmrc \&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; npm ci&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; --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:#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 로 secret 전달 절대 금지&lt;/em&gt;. layer 에 &lt;em&gt;영구 남음&lt;/em&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;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;.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;/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;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;K8s 에서는 Liveness/Readiness probe 가 우선이지만 &lt;em&gt;docker run&lt;/em&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:#B392F0&quot;&gt;trivy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; image&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:#6A737D&quot;&gt;# CVE 검사&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:#B392F0&quot;&gt;cosign&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; sign&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:#9ECBFF&quot;&gt; myapp:1.0&lt;/span&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&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 style=&quot;color:#6A737D&quot;&gt;# SBOM 생성&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;Trivy&lt;/td&gt;&lt;td&gt;CVE / misconfig scan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Grype&lt;/td&gt;&lt;td&gt;CVE scan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cosign&lt;/td&gt;&lt;td&gt;서명 + verify&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Syft&lt;/td&gt;&lt;td&gt;SBOM 생성&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Notary&lt;/td&gt;&lt;td&gt;image trust&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;9-reproducible-build&quot;&gt;9. Reproducible Build&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;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;/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;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; 한 줄로&lt;/strong&gt; = layer 작아짐. 별도 RUN 이면 &lt;em&gt;clean 효과 없음&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;COPY . /app&lt;/code&gt;&lt;/strong&gt; = .dockerignore 없으면 &lt;em&gt;.git, node_modules 까지&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latest&lt;/code&gt; tag&lt;/strong&gt; = build 마다 다른 결과.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;root 사용자 + privileged&lt;/strong&gt; = 컨테이너 의미 없음.&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;[[oci-image]]&lt;/li&gt;
&lt;li&gt;[[cgroups-namespaces]]&lt;/li&gt;
&lt;li&gt;[[k8s-pod]]&lt;/li&gt;
&lt;li&gt;[[aws-secrets-manager]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>container</category><category>docker</category><category>security</category><category>best-practices</category><category>cloud</category><author>koa (김신건)</author></item></channel></rss>