카테고리 없음

Docker란 무엇이고, VM과의 차이점?

1-yuna 2025. 3. 7. 02:32

1. 도커가 탄생한 배경

기존 시스템에서는 애플리케이션을 구동하기 위해 다양한 패키지, 환경설정을 통일해야 했고, 이런 과정 속에서 패키지 끼리의 충돌이나 환경변수 충돌과 같은 문제가 많이 발생되어 시스템을 운영하기가 힘이 들었다.

 

이러한 문제점을 해결하기 위해 환경변수와 패키지를 분리해 가상화 시켜 구동하는 VM(가상머신)이 나왔지만, VM은 하이퍼바이저를 사용하여 환경 자체가 무겁다는 단점이 있다. 따라서 컨테이너를 사용하여 상대적으로 가벼운 도커가 등장하게 되었다.


2. VM의 하이퍼바이저와 도커의 컨테이너 

VM과 도커는 가상화시켜 독립된 환경을 만드는 플랫폼이라 하였다. 우선 도커가 무엇인지 알기 전에, 가상머신의 하이퍼바이저가 무엇인지, 도커의 컨테이너가 무엇인지 알아야한다. 

 

1️⃣ 가상화

먼저 가상화란, 하나의 하드웨어에서 여러 개의 독립적인 환경을 실행할 수 있도록 하는 기술이다. 

이때 베이스가 되는 기존의 환경을 Host OS라 한다. 

가상화에는 VM(가상머신)기반 가상화와 컨테이너 기반 가상화가 있다. 

 

VM(가상머신) 기반 가상화 

하이퍼바이저를 사용하여 각 환경을 완전히 독립적인 가상머신 GuestOS로 실행된다. 

컨테이너 기반 가상화 

HostOS의 커널을 공유하며, 필요한 라이브러리만 격리하여 실행한다. 

 


 

2️⃣ 하이퍼바이저

가상머신인 GuestOS를 생성하기 위해서는 하이퍼바이저를 사용해야한다.

하이퍼바이저는 HostOS와 GuestOS를 나누는 역할을 한다.

이때, 각각의 GuestOS는 하이퍼바이저에 의해 관리되며 다른 게스트와 상호 간섭하지 않고 완전히 분리된 환경에서 구동된다. 

따라서 하이퍼바이저를 활용하면 하드웨어가 여러개인것처럼 하나의 서버를 여러명이서 나눠 쓸수도 있고, 컴퓨터 한 대에서 서로 다른 OS를 동시에 사용할 수도 있다.

 

단점 

🔷 속도저하 

가상머신은 하드웨어와 직접적으로 소통하는 것이 아니라 하이퍼바이저를 통해야 한다.

이 과정에서 I/O 작업이 발생하여 느려질 수 있다. 

 

🔷 이미지 크기

가상머신은 독립된 OS이기 때문에 해당 환경을 구동하는데 필요한 운영체제 기본 파일들을 모두 포함하고 있다 따라서, 가상머신을 배포할때 만들어지는 이미지의 크기가 매우 커진다는 한계가 있다.

 


 

3️⃣ 컨테이너

컨테이너는 가상의 OS(GuestOS)를 만드는 것은 아니다. 컨테이너는 HOST OS의 커널영역을 공유하면서 필요한 프로세스만 격리하는 방식으로, 커널을 공유하기 때문에 호스트 OS의 기능을 모두 사용할 수 있다.

따라서 격리시킬 애플리케이션과 거기에 필요한 파일이나 특정 라이브러리 등만 포함되기 때문에 배포를 위해 생성되는 이미지의 용량이 작아진다는 장점이 있다. 또한, 운영체제가 아닌 프로세스이며, 하이퍼바이저를 거칠 필요가 없어 실행속도가 빠르다.

*이미지: 프로그램을 실행하는데 필요한 파일과 라이브러리 등을 가지고 있는 파일이다. 이미지를 실행하면 프로세스 즉, 컨테이너가 된다

 

 

 

🤔 컨테이너에서 HostOS가 다를 경우에 에러가 날까? 
컨테이너는 HostOS의 커널영역을 공유한다 했는데, 그렇다면 사용자끼리의 OS가 다를 경우에는 에러가 날까? 
다시 말해, A의 HostOS는 윈도우이고, B의 HostOS가 macOS라면 에러가 날까? 

결론은 도커 데스크탑을 사용하면 문제가 되지 않는다.
도커를 사용하기 위해서는 도커 데스크탑을 설치해야한다. 그런데 해당 도커 데스크탑에서는 가상머신( 리눅스 VM)을 실행하여 컨테이너를 동작시킨다. 

즉, 둘 다 도커 데스크탑을 사용하면 내부적으로 리눅스 VM이 실행되므로 컨테이너 자체는 동일하게 동작할 수 있다. 
따라서 이미지도 아래의 이미지가 더 정확하다. 

도커란 무엇인가

따라서 정리하면, 도커는 컨테이너 기반의 가상화 플랫폼이다.

즉, 응용 프로그램을 서로 다른 환경에서도 일관되게 실행할 수 있고, 개발 환경과 운영 환경 사이의 차이로 인한 문제를 줄일 수 있다.

 

1️⃣ 환경 불일치 문제 해결

도커는 컨테이너를 활용하여 애플리케이션과 그에 필요한 라이브러리 및 환경을 하나의 이미지로 패키징한다.

이를 통해 개발 환경과 운영 환경의 차이로 인한 문제를 방지할 수 있으며, 애플리케이션 간의 라이브러리 및 패키지 충돌을 최소화할 수 있다.

 

2️⃣ 가벼운 이미지로 빠른 배포 및 실행

도커는 운영체제 전체를 가상화하는 VM과 달리 커널을 공유한다. 때문에, 컨테이너엔 필요한 라이브러리와 패키지를 독립적으로 포함하므로 컨테이너 자체가 가볍고, 빠르게 배포 및 실행할 수 있다. 

 


도커의 구성 요소

1️⃣ 도커 파일

도커파일은 도커 이미지를 만들기 위한 템플릿이다. 일종의 스크립트로, 도커 이미지가 어떻게 만들어져야 하는지에 대한 명령들을 순차적으로 작성한다. 이 파일에는 설치할 패키지, 환경 변수 설정, 애플리케이션 파일 복사, 실행 명령 등이 포함된다.

 

2️⃣ 이미지

도커 이미지는 애플리케이션을 실행하는 데 필요한 필요한 모든 파일과 설정을 포함한 불변의 파일 시스템이다. 이는 도커파일을 기반으로 만들어졌기 때문에 불변하여 읽기 전용이다. 컨테이너를 실행할 때 이 이미지를 기반으로 컨테이너가 생성된다.

 

3️⃣ 컨테이너

도커 컨테이너는 실행 중인 도커 이미지이다. 이미지를 기반으로 실행되며, 애플리케이션의 실제 프로세스를 포함하고 있다. 컨테이너는 격리된 환경에서 실행되며, 실행 중에 읽기/쓰기 작업이 가능하다. 즉, 도커 이미지의 불변성과 달리 컨테이너는 상태를 변경할 수 있는 가변적인 실행 환경이다.

 

읽기: 컨테이너는 이미지를 기반으로 실행되므로, 이미지를 읽고 애플리케이션을 시작할 수 있다. 

쓰기: 컨테이너 실행 중에는 데이터를 생성하거나 수정할 수 있다. 예를 들어, nginx 서버가 요청을 받으면 요청에 대한 응답을 처리하고 로그를 기록한다. 

 

 


도커의 작동 과정

도커의 작동 과정은 크게 네 가지 주요 구성 요소인 클라이언트, 도커 호스트, 도커 데몬, 레지스트리를 통해 이루어진다.

 

1️⃣ 클라이언트 (Docker Client)

사용자가 도커 명령어를 입력하면, 클라이언트는 이를 도커 데몬에 전달한다.

예: docker run nginx 명령어로 Nginx 컨테이너 실행.

 

2️⃣ 도커 호스트 (Docker Host)

도커 호스트는 도커 엔진이 설치된 머신으로, 컨테이너를 실행하고 관리하는 역할을 한다.

 

3️⃣ 도커 데몬 (Docker Daemon)

도커 데몬은 도커의 핵심으로, 클라이언트의 요청을 처리하고 컨테이너를 실행, 관리하는 프로세스이다. 또한 이미지 다운로드와 저장 등의 작업을 담당한다.

예: 만약 로컬에 이미지가 없다면, 도커 데몬은 레지스트리에서 이미지를 풀해온다.

 

4️⃣ 레지스트리 (Docker Registry)

도커 이미지가 저장된 저장소로, 이미지를 다운로드하거나 업로드할 수 있다.

예: docker pull ubuntu로 Docker Hub에서 Ubuntu 이미지 다운로드.

 

이 과정을 통해 도커는 애플리케이션을 컨테이너화하여 효율적이고 일관된 환경에서 실행할 수 있게 된다.

 

 


가상머신과 도커 차이점 정리

VM은 하이퍼바이저를 이용해 하드웨어를 가상화하며, 각 VM은 독립적인 Guest OS를 포함하기 때문에 무겁고 실행 속도가 상대적으로 느리다. 또한, 운영체제를 포함한 이미지 크기가 크고, 이를 배포하거나 확장할 때 많은 자원을 필요로 하며, 다른 환경에서 실행하기 어려운 단점이 있다. 예를 들어, Windows 기반 Host OS에서 macOS VM을 실행하려면 macOS를 지원하는 하드웨어가 필요하고, 성능 저하가 발생할 수 있다.

 

도커는 OS 커널을 공유하는 방식으로 동작하여 VM보다 가볍고 빠르게 실행할 수 있다. 도커는 운영체제가 아닌 프로세스 단위로 격리되며, 필요한 프로세스와 라이브러리만 포함하여 배포 단위가 작고, 하이퍼바이저를 거치지 않아 실행 속도가 빠르다. 또한, 도커는 커널을 공유하기 때문에 다양한 환경에서 유연하게 실행할 수 있다. 예를 들어, Linux 기반의 도커 컨테이너는 다른 환경에서도 호환성이 높다.

 

따라서 VM은 완전히 독립된 환경을 제공하는 대신 무겁고 속도가 느리며, 다른 환경에서 실행할 때 제약이 많다. 반면, 도커는 경량화된 구조로 빠르고 유연한 배포가 가능하며, 다양한 환경에서 일관된 실행을 보장할 수 있는 장점이 있다. 하지만 도커는 보안 측면에서 VM보다 상대적으로 낮은 격리 수준을 가질 수 있어 추가적인 보안 조치가 필요할 수 있다.