가상 머신은 hypervisor 위에 guest OS를 실행합니다. 각 VM은 독립된 OS를 가지므로 격리 수준이 높지만 부팅과 resource overhead가 큽니다.
Docker container는 host OS kernel을 공유하고 namespace와 cgroup으로 격리되는 실행 환경입니다. namespace와 cgroup 같은 기능으로 process, network, filesystem, resource를 격리합니다. VM보다 가볍고 빠르게 시작하지만 kernel을 공유한다는 특징이 있습니다.
꼬리질문
조금 더 깊게 물어본다면
답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.
Container가 VM보다 가벼운 이유는?
각 container가 별도 guest OS를 부팅하지 않고 host kernel을 공유하기 때문입니다.
Namespace와 cgroup은 각각 무엇을 하나요?
Namespace는 process, network, mount 같은 view를 격리하고, cgroup은 CPU와 memory 같은 resource 사용량을 제한하고 측정합니다.
Hypervisor란 무엇인가요?
Hypervisor는 하드웨어 위에서 여러 VM을 관리하는 소프트웨어입니다. Type 1(bare-metal)은 하드웨어에서 직접 실행되고(KVM, VMware ESXi), Type 2는 host OS 위에서 실행됩니다(VirtualBox). 각 VM에 가상 CPU, 메모리, 디바이스를 제공합니다.
Container image는 무엇인가요?
application 실행에 필요한 파일, dependency, 설정을 layer 형태로 묶은 읽기 전용 template입니다.
Docker 레이어 구조는 어떻게 동작하나요?
Docker image는 변경 불가능한 읽기 전용 레이어를 쌓아서 만듭니다. Dockerfile의 각 명령(RUN, COPY 등)이 레이어를 만들고, 여러 image가 같은 레이어를 공유할 수 있습니다. 컨테이너 실행 시에는 읽기-쓰기 레이어가 맨 위에 추가됩니다(overlay filesystem).
이미지를 작게 만드는 방법은?
alpine 같은 작은 base image를 쓰거나, multi-stage build로 빌드 도구와 최종 실행 파일을 분리합니다. Dockerfile에서 RUN 명령을 줄여 레이어 수와 중간 파일을 최소화하고, 불필요한 파일은 .dockerignore로 제외합니다.
Container가 보안상 VM과 다른 점은?
Container는 host kernel을 공유하므로 kernel 취약점의 영향 범위를 더 조심해야 합니다. VM은 guest OS 단위 격리가 더 강한 편입니다.
Container escape란 무엇인가요?
컨테이너 내부의 프로세스가 격리를 벗어나 host 시스템이나 다른 컨테이너에 접근하는 공격입니다. 커널 취약점이나 잘못된 권한 설정(privileged mode, 위험한 volume mount 등)이 주요 원인입니다. VM에 비해 커널을 공유하므로 이런 공격 경로가 존재합니다.
부가 설명
Container는 application과 dependency를 image로 묶어 일관된 실행 환경을 제공합니다.
보안 격리가 아주 중요하거나 다른 OS kernel이 필요하면 VM이 적합할 수 있고, 배포와 scale-out 효율이 중요하면 container가 유리할 수 있습니다.