아직도 헷갈리시나요? 5분 만에 개념 정리!
"서버를 가상화해서 사용한다"는 말을 들으면 많은 분이 가상 머신(Virtual Machine, VM)을 떠올립니다. 하지만 최근 클라우드와 데브옵스 환경에서는 '도커(Docker)'와 '컨테이너(Container)'라는 단어가 훨씬 더 많이 들려옵니다. 이 둘은 비슷한 것 같으면서도 완전히 다른 방식으로 동작하며, 이 차이를 이해하는 것이 바로 도커 입문의 첫걸음입니다.
『시작하세요! 도커/쿠버네티스』의 1.1장 내용을 바탕으로 두 기술의 핵심적인 차이점과 왜 도커 컨테이너가 현대 개발 환경의 대세가 되었는지 쉽고 명확하게 설명해 드리겠습니다.
전통적인 가상화 방식: 가상 머신 (Virtual Machine)
가상 머신은 하나의 물리적 서버(호스트) 위에 여러 개의 독립된 운영체제(OS)를 통째로 올리는 기술입니다. VMware나 VirtualBox 같은 툴을 사용해 보셨다면 이미 VM에 익숙하실 겁니다.
VM의 구조
VM의 구조는 여러 층으로 이루어져 있습니다.
서버 (Server): 물리적인 하드웨어입니다.
호스트 OS (Host OS): 서버에 처음으로 설치되는 기본 운영체제입니다 (예: Windows, Linux).
하이퍼바이저 (Hypervisor): 호스트 OS 위에서 각각의 VM을 생성하고 관리하는 가상화 소프트웨어입니다.
게스트 OS (Guest OS): VM 하나하나가 독립적으로 가지는 완전한 운영체제입니다. CentOS VM이라면 CentOS가, Ubuntu VM이라면 Ubuntu가 통째로 설치됩니다.
애플리케이션 (App): 각각의 게스트 OS 위에 우리가 실행하고자 하는 애플리케이션이 올라갑니다.
VM의 장점과 단점
장점: 각 VM이 커널까지 포함한 완전한 OS를 갖기 때문에 완벽한 격리를 제공합니다. 호스트 OS와 다른 종류의 OS도 설치할 수 있습니다.
단점 (성능과 크기): VM의 가장 큰 단점은 '무겁고 느리다'는 점입니다. 모든 VM은 독립적인 게스트 OS를 포함하기 때문에 이미지의 크기가 수 기가바이트(GB)에 달합니다. 또한, 하이퍼바이저를 거쳐야 하므로 하드웨어 자원을 사용할 때 성능 손실이 발생합니다.
현대적인 가상화 방식: 도커 컨테이너 (Docker Container)
도커 컨테이너는 하드웨어를 가상화하는 대신, 운영체제(OS) 수준에서 가상화를 진행합니다. 이 방식은 훨씬 가볍고 효율적입니다.
컨테이너의 구조
컨테이너의 구조는 VM과 비교했을 때 훨씬 단순합니다.
서버 (Server): 물리적인 하드웨어입니다.
호스트 OS (Host OS): 서버에 설치된 기본 운영체제입니다.
도커 엔진 (Docker Engine): 호스트 OS 위에서 컨테이너를 생성하고 관리합니다. 하이퍼바이저와 게스트 OS의 역할을 대체합니다.
애플리케이션 (App): 각 컨테이너는 애플리케이션과 그것을 실행하는 데 필요한 라이브러리(Bins/Libs)만 포함합니다.
가장 결정적인 차이점은 게스트 OS가 없다는 것입니다. 모든 컨테이너는 호스트 OS의 커널을 공유해서 사용합니다.
컨테이너의 장점과 단점
장점 (성능과 속도): 게스트 OS와 하이퍼바이저가 없기 때문에 성능 손실이 거의 없습니다. 컨테이너 이미지는 애플리케이션과 라이브러리만 포함하므로 용량이 수십 메가바이트(MB) 수준으로 매우 작습니다. 덕분에 애플리케이션을 훨씬 빠르게 배포하고 실행할 수 있습니다.
단점: 호스트 OS의 커널을 공유하기 때문에, 예를 들어 윈도우 호스트에서 리눅스 컨테이너를 직접 실행하는 것에는 제약이 따릅니다 (물론 내부적으로 리눅스 VM을 활용하는 방식으로 해결합니다).
실전 사례로 보는 작동 방식
"내 서버에 Ubuntu 환경을 띄우고 싶다"는 목표가 있을 때, 두 방식은 이렇게 다르게 작동합니다.
VM 방식
하이퍼바이저가 수 GB 크기의 Ubuntu 이미지(.iso)를 읽어옵니다.
하드웨어를 가상으로 할당하고, Ubuntu 커널부터 부팅을 시작합니다.
완전한 Ubuntu OS가 부팅되고 나서야 애플리케이션을 설치하고 실행할 수 있습니다. (수십 초 ~ 수 분 소요)
컨테이너 방식
도커 엔진이 수십 MB 크기의 Ubuntu 이미지를 읽어옵니다.
호스트 OS의 커널을 그대로 사용하면서, 프로세스를 격리할 수 있는 공간(컨테이너)만 만듭니다.
마치 호스트에서 일반적인 프로세스 하나를 실행하는 것처럼 빠르게 Ubuntu 환경이 실행됩니다. (수 초 이내)
이처럼 도커 컨테이너는 "격리된 프로세스"에 가깝습니다. 리눅스의 자체 기능인 chroot, 네임스페이스(namespace), cgroup을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없는 것입니다.
결론: 왜 도커 컨테이너인가?
가상 머신과 도커 컨테이너의 차이점을 표로 정리하면 다음과 같습니다.
결론적으로, 도커 컨테이너는 가볍고, 빠르며, 효율적입니다. 이러한 특징 덕분에 애플리케이션을 신속하게 개발하고, 테스트하고, 배포해야 하는 현대적인 마이크로서비스 아키텍처와 CI/CD(지속적 통합/배포) 환경에서 필수적인 기술로 자리 잡게 되었습니다.
오늘 설명해 드린 내용은 컨테이너 기술의 가장 기본적인 개념입니다. 이 차이점을 명확히 이해하셨다면, 이제 도커의 세계로 들어올 준비가 되신 겁니다. 『시작하세요! 도커/쿠버네티스』는 이처럼 가장 기초적인 개념부터 시작해, 여러분이 컨테이너 기술을 자신감 있게 다룰 수 있도록 친절하게 안내해 줄 것입니다.
https://wikibook.co.kr/docker-kube-rev2/
도커를 처음 접하는 개발자를 위한 도커 컨테이너와 이미지의 기본적인 개념을 먼저 설명한 뒤, 도커 컴포즈와 스웜 모드를 통해 컨테이너 애플리케이션을 YAML 파일로 작성하고 클러스터에서 배포하는 방법을 소개합니다. 나아가 도커 컨테이너, 도커 컴포즈, 스웜 모드에서 학습한 지식을 활용해 쿠버네티스의 기초 사용법, 다양한 쿠버네티스 오브젝트의 사용 방법 및 심화 개념까지 알아봅니다.