Docker 이해하기: 가상화에서 컨테이너까지

남순식·2026년 4월 29일

1. 운영체제와 메모리 관리

운영체제는 실행 중인 모든 프로세스에 독립적인 메모리 공간을 보장한다. 이때 각 프로세스에 할당되는 메모리는 가상 메모리(Virtual Memory) 다.

가상 메모리는 물리적인 RAM만을 의미하지 않는다. RAM과 HDD/SSD 같은 2차 저장장치를 합쳐 하나의 연속된 메모리 공간처럼 추상화한 개념이다. 덕분에 실제 RAM 용량보다 더 많은 메모리를 사용하는 것처럼 프로세스를 실행할 수 있고, 각 프로세스는 서로의 메모리 공간을 침범하지 않는다.


2. 소프트웨어 계층 구조

컴퓨터는 크게 하드웨어(H/W) 위에 소프트웨어(S/W) 가 올라가는 구조다. 소프트웨어 계층은 다시 두 가지 모드로 나뉜다.

  • 커널 모드(Kernel Mode): 하드웨어 자원(CPU, 메모리, 디스크, 네트워크 등)에 직접 접근할 수 있는 특권 영역이다. 운영체제의 핵심인 커널이 이 영역에서 동작한다.
  • 유저 모드(User Mode): 일반 애플리케이션이 실행되는 영역이다. 하드웨어에 직접 접근할 수 없고, 필요한 경우 커널에 요청(시스템 콜)을 보내는 방식으로 동작한다.

이 구조를 정리하면 다음과 같다.

[ 애플리케이션 (유저 모드) ]
[ 커널 (커널 모드)         ]
[ 하드웨어 (H/W)           ]

3. 가상 머신(VM)의 등장

VM이란?

가상 머신(Virtual Machine) 은 하드웨어를 소프트웨어로 구현한 것이다. VMware, VirtualBox 같은 하이퍼바이저(Hypervisor) 가 실제 하드웨어 위에서 동작하며, 그 위에 가상의 컴퓨터 환경을 만들어낸다. 각 VM은 독립적인 하드웨어 계층과 커널 모드, 유저 모드를 모두 갖춘다.

[ App ]  [ App ]   ← 유저 모드
[ OS ]   [ OS  ]   ← 커널 모드
[  VM  ] [  VM  ]  ← 가상 하드웨어
[    하이퍼바이저    ]
[      실제 H/W     ]

네트워크는 어떻게 처리할까?

물리적인 NIC(Network Interface Card)는 실제로 1개뿐이다. VMware는 가상 NIC(Virtual NIC) 를 생성하고, VMnet0~n이라는 가상 네트워크를 통해 각 VM의 네트워크 트래픽을 실제 NIC로 전달한다. VM 입장에서는 자신만의 네트워크 카드가 있는 것처럼 동작하지만, 실제로는 소프트웨어로 추상화된 것이다.

VM을 왜 쓸까?

결국 VM은 컴퓨터 위에 또 다른 컴퓨터를 올리는 것이다. 목적은 애플리케이션 실행 환경을 격리하는 데 있다. 예를 들어, 하나의 물리 서버에서 Windows 환경과 Linux 환경을 동시에 운영하거나, 서로 다른 버전의 OS가 필요한 애플리케이션을 함께 실행할 수 있다.

그러나 VM에는 단점이 있다. OS 전체를 올려야 하기 때문에 부팅 시간이 길고, 리소스 소모가 크다. 애플리케이션 하나를 실행하기 위해 OS 전체를 띄우는 것은 무겁고 비효율적이다.


4. Docker와 컨테이너

컨테이너의 아이디어

VM의 비효율을 해결하기 위해 등장한 것이 컨테이너(Container) 다. 핵심 아이디어는 이렇다.

"OS를 여러 개 띄울 필요 없이, 하나의 커널을 공유하면서 애플리케이션만 격리해서 실행할 수 있지 않을까?"

이것이 바로 Docker의 접근 방식이다. JVM이 서로 다른 운영체제 위에서 동일한 Java 애플리케이션을 실행할 수 있도록 추상화 계층을 제공하듯, Docker는 컨테이너 런타임(Container Runtime) 으로서 애플리케이션 실행 환경을 추상화한다.

Docker의 구조

Docker Engine은 호스트 OS의 커널을 그대로 공유하면서, 각 컨테이너가 마치 독립된 환경에서 실행되는 것처럼 격리해준다.

[ App A ] [ App B ] [ App C ]  ← 컨테이너 (유저 모드)
[       Docker Engine        ]  ← 커널 공유 + 격리 관리
[       Host OS 커널          ]
[           H/W               ]

VM과 비교하면 차이가 명확하다.

항목VMDocker 컨테이너
OS각 VM마다 독립 OS호스트 OS 커널 공유
부팅 시간수십 초 ~ 수 분수 초 이내
리소스 사용무거움가벼움
격리 수준완전한 하드웨어 격리프로세스 수준 격리

컨테이너는 VM보다 훨씬 빠르고 가볍기 때문에, 마이크로서비스 환경처럼 수십~수백 개의 애플리케이션을 독립적으로 실행해야 하는 현대 아키텍처에 매우 적합하다.


5. 컨테이너의 한계와 쿠버네티스

컨테이너가 가볍고 편리한 것은 사실이지만, 완벽하지는 않다. 다음과 같은 문제들이 생길 수 있다.

  • 컨테이너가 예기치 않게 종료될 수 있다.
  • 컨테이너 수가 늘어날수록 배포, 스케일링, 네트워크 관리가 복잡해진다.
  • 특정 컨테이너에 장애가 생겼을 때 자동으로 재시작하거나 다른 서버로 옮기는 작업이 필요하다.

이런 문제를 해결하기 위해 등장한 것이 쿠버네티스(Kubernetes, K8s) 다. 쿠버네티스는 컨테이너들을 자동으로 관리해주는 컨테이너 오케스트레이션 플랫폼이다. 컨테이너가 죽으면 자동으로 재시작하고, 트래픽에 따라 컨테이너 수를 자동으로 늘리거나 줄이는 등 대규모 컨테이너 환경을 안정적으로 운영할 수 있게 해준다.


정리

H/W → OS(커널) → VM(무겁고 느림) → 컨테이너(가볍고 빠름) → 쿠버네티스(관리 자동화)

Docker는 단순히 "가벼운 VM"이 아니다. OS 가상화가 아닌 프로세스 격리 방식으로 애플리케이션 실행 환경을 추상화함으로써, 개발 환경과 운영 환경의 차이를 없애고 배포를 표준화하는 현대 인프라의 핵심 기술이다.

profile
응집력있는 시간을 보내기 위한 블로그

0개의 댓글