Kubernetes(쿠버네티스)와 Docker(도커)의 관계는 **“경쟁 관계"가 아니라 “상호 보완적인 관계”**입니다. 이 둘의 차이를 명확히 이해하기 위해 가장 쉬운 비유를 들어 설명해 드리겠습니다.
1. 핵심 비유: 화물선과 항만 시스템
이 두 기술의 관계를 물류 시스템에 비유하면 아주 명확해집니다.
-
Docker (컨테이너): **‘규격화된 화물 컨테이너 박스’**입니다.
-
물건(애플리케이션 코드, 라이브러리 등)을 박스에 담아 포장하는 기술입니다.
-
이 박스만 있으면 어떤 배(서버)나 트럭(노트북)에 실어도 내용물이 안전하게 전달됩니다.
-
Kubernetes (조타수/항만 관리자): **‘수천 개의 컨테이너를 관리하는 시스템’**입니다.
-
컨테이너가 배에 잘 실렸는지, 배가 흔들려 컨테이너가 떨어지면(에러 발생) 다시 실어주는지, 화물이 많아지면 배를 더 부를지(스케일링)를 결정합니다.
한마디로 정리하면: Docker는 애플리케이션을 **‘포장’**하고 **‘실행’**하는 역할을 하고, Kubernetes는 그 포장된 애플리케이션들을 대규모로 **‘관리’**하고 **‘지휘’**하는 역할을 합니다.
2. 왜 둘 다 필요할까요? (상세 비교)
Docker만 있어도 서비스를 배포할 수 있습니다. 하지만 서비스의 규모가 커지면 Docker 하나만으로는 감당하기 어려워집니다.
| 구분 | Docker (도커) | Kubernetes (쿠버네티스) |
|---|---|---|
| 주요 역할 | 컨테이너화 (Containerization) | 오케스트레이션 (Orchestration) |
| 하는 일 | 프로그램을 한 번 만들면(Build) 어디서든 돌아가게(Run) 만듦. | 여러 개의 컨테이너를 조율하고 관리함. |
| 관리 규모 | 보통 서버 1대나 소규모 컨테이너 관리에 적합. | 수십~수천 대의 서버와 수만 개의 컨테이너 관리에 적합. |
| 자동화 기능 | 기본적으로 수동 관리가 필요함 (컨테이너가 죽으면 직접 다시 켜야 할 수 있음). | 자동 복구(Self-healing): 컨테이너가 죽으면 알아서 다시 살림. |
자동 확장(Auto-scaling): 사용자가 몰리면 컨테이너 수를 늘림. | | 비유 | 레고 블록 (하나하나의 유닛) | 레고로 만든 거대한 성을 관리하는 관리인 |
3. 함께 사용할 때의 워크플로우
현업에서는 보통 이 두 가지를 다음과 같은 순서로 함께 사용합니다.
- Docker로 만들기: 개발자가 Docker를 이용해 코드를 ‘이미지(설치 파일)‘로 만듭니다.
- Docker로 테스트: 개발자 개인 PC(Docker Desktop 등)에서 잘 돌아가는지 확인합니다.
- Kubernetes에 맡기기: 테스트가 끝난 이 ‘Docker 이미지’를 Kubernetes 클러스터(서버 묶음)에 던져줍니다. “이거 3개 띄워주고, 문제 생기면 알아서 재시작해 줘.”
- Kubernetes가 운영: Kubernetes는 Docker(또는 호환되는 런타임)를 이용해 실제 서버들 위에서 컨테이너를 실행하고 상태를 감시합니다.
4. 자주 하는 오해: “쿠버네티스가 도커를 버렸다던데?”
뉴스를 보시다가 **“Kubernetes가 Docker 지원을 중단했다(Dockershim 제거)”**는 소식을 접하고 혼란스러워하시는 분들이 많습니다. 결론부터 말씀드리면 개발자 입장에서는 크게 달라지는 것이 없습니다.
- 과거: Kubernetes가 Docker 프로그램을 직접 사용해서 컨테이너를 돌렸습니다.
- 현재: Kubernetes가 Docker 대신
containerd같은 더 가볍고 전문적인 실행 도구를 직접 사용합니다. - 하지만: 여러분은 여전히 Docker로 이미지를 만들고(Build), Docker 명령어를 사용할 수 있습니다. Kubernetes는 여전히 Docker로 만든 이미지를 완벽하게 실행할 수 있기 때문입니다.
요약
- Docker: 애플리케이션을 하나의 패키지로 만드는 도구.
- Kubernetes: 그 패키지들이 서버 세상에서 질서 있게 돌아가도록 지휘하는 도구.