Docker를 어느 정도 사용하다 보면 한 번쯤 이런 생각이 든다.
“컨테이너는 알겠는데… 이게 실제로 내부에서 어떻게 돌아가는 거지?”
나도 처음에는 그냥 “가볍게 실행되는 가상환경” 정도로만 이해했다. 그런데 구조를 한 번 제대로 보면, 왜 Docker가 빠르고 효율적인지 확실히 이해된다.
결론부터 말하면 Docker는 가상머신처럼 새로운 컴퓨터를 만드는 게 아니라, 운영체제의 기능을 활용해서 프로세스를 분리하는 방식으로 동작한다.

Docker는 새로운 OS를 만드는 게 아니다
많은 사람들이 처음에 착각하는 부분이다.
Docker는 가상머신처럼 운영체제를 따로 실행하지 않는다.
대신 하나의 운영체제를 그대로 사용하면서, 그 안에서 프로그램들을 분리해서 실행한다.
즉:
- VM = OS까지 따로 실행
- Docker = OS는 공유하고 프로그램만 분리
그래서 Docker는 훨씬 가볍고 빠르다.
핵심은 2가지다: Namespace와 Cgroups
Docker 내부 구조를 이해하려면 딱 2가지만 알면 된다.
- Namespace → 공간을 나누는 기술
- Cgroups → 자원을 나누는 기술
이 두 개가 컨테이너를 만드는 핵심이다.
1. Namespace는 “공간 분리” 역할
Namespace는 하나의 시스템 안에서 서로 보이지 않게 공간을 나누는 기능이다.
예를 들어 컨테이너 A와 B가 있다면:
- A에서는 B가 안 보이고
- B에서는 A가 안 보인다
각자 자기만의 환경처럼 보이게 만든다.
Namespace는 여러 종류가 있다.
- PID → 프로세스 분리
- NET → 네트워크 분리
- MOUNT → 파일 시스템 분리
그래서 각 컨테이너는:
- 자기만의 프로세스 목록
- 자기만의 네트워크
- 자기만의 파일 구조
를 가진 것처럼 동작한다.
2. Cgroups는 “자원 제한” 역할
Cgroups는 CPU, 메모리 같은 자원을 나누는 기능이다.
예를 들어 컨테이너가 여러 개 있을 때:
- 컨테이너 A → CPU 50%
- 컨테이너 B → 메모리 1GB 제한
이렇게 설정할 수 있다.
그래서 하나의 컨테이너가 자원을 다 먹어버리는 것을 막는다.
즉, 서버를 안정적으로 운영할 수 있게 해준다.
이미지는 어떻게 실행될까
Docker는 이미지를 바로 실행하지 않는다.
이미지를 기반으로 컨테이너를 만든다.
이 과정은 이렇게 진행된다.
이미지 → 읽기 전용 레이어 → 쓰기 가능한 레이어 추가 → 컨테이너 실행
이미지는 여러 개의 레이어(layer)로 구성되어 있다.
예를 들어:
- OS 레이어
- 라이브러리 레이어
- 앱 코드 레이어
이런 식으로 쌓여 있다.
컨테이너를 실행하면, 그 위에 “쓰기 가능한 레이어” 하나를 더 얹는다.
그래서:
- 이미지는 그대로 유지되고
- 컨테이너에서만 변경이 발생한다
이 구조 덕분에 속도가 빠르고, 여러 개를 동시에 실행할 수 있다.
Docker 엔진은 무슨 역할을 할까
Docker를 실행하면 실제로는 Docker Engine이라는 프로그램이 동작한다.
이 엔진이 하는 일은:
- 이미지 관리
- 컨테이너 생성
- 네트워크 연결
- 자원 관리
를 전부 처리하는 것이다.
즉, Docker Engine은 컨테이너를 관리하는 “중앙 관리자” 역할이다.
왜 Docker는 빠를까
Docker가 빠른 이유는 간단하다.
- 운영체제를 새로 부팅하지 않고
- 기존 OS 위에서 바로 실행하기 때문이다
그래서:
- 몇 초 안에 실행되고
- 메모리 사용량도 적고
- 여러 개를 동시에 돌릴 수 있다
이게 바로 VM보다 훨씬 효율적인 이유다.
정리하면 이런 구조다
Docker는 이렇게 동작한다.
- 하나의 운영체제 위에서
- Namespace로 공간을 나누고
- Cgroups로 자원을 나누고
- 이미지를 기반으로 컨테이너를 실행한다
그래서 가볍고 빠르면서도, 서로 영향을 주지 않는 환경을 만들 수 있다.
한 줄로 정리하면
Docker는 운영체제를 새로 만드는 것이 아니라, Namespace와 Cgroups를 사용해 프로세스를 분리하고 자원을 나누어 컨테이너를 실행하는 기술이다.