logo
Posts
가상화

Docker 와 가상화

Docker 는 애플리케이션을 개발, 배포, 실행하는 데 필요한 다양한 기능을 제공하는 기술로, 기존의 가상화 방식과는 몇 가지 차별화된 특징을 가지고 있습니다 이 글에서는 가상화의 개념을 먼저 살펴보고, Docker 와 가상 머신(VM)의 차이점을 자세히 알아보겠습니다.

가상화

컴퓨터 기술에서 가상화란, 물리적인 리소스의 특성을 감추고, 사용자나 시스템이 실제로 해당 리소스와 상호작용하는 방식과 다르게 처리하는 기술입니다. 위키백과에서는 가상화를 다음과 같이 정의합니다.

가상화 (假像化, virtualization)는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어이다. "물리적인 컴퓨터 리소스의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 리소스와 상호 작용하는 방식으로부터 감추는 기술"로 정의할 수 있다.

이 정의만으로는 가상화가 무엇인지 이해하기 어려울 수 있습니다. 가상 메모리를 예로 들어보겠습니다. 가상 메모리는 물리적인 메모리가 부족할 때, 하드 디스크를 마치 메모리처럼 사용하는 기술입니다. 프로그램은 실제로 디스크에서 데이터를 읽고 있음에도 불구하고, 메모리에서 데이터를 읽고 있다고 생각합니다. 즉, 운영체제가 리소스의 실제 상태를 감추어 프로그램이 문제없이 동작하게 만드는 방식입니다.

이와 같은 방식으로, 가상화실제 물리적 리소스가 어떻게 동작하는지 감추고, 다른 환경에서 실행되는 것처럼 보이게 만드는 기술입니다. 가상화된 리소스를 사용하는 게스트 시스템은 자신이 실제 리소스를 사용하는지, 가상화된 리소스를 사용하는지 알지 못합니다.

가상 머신

가상 머신(VM) 은 물리적인 하드웨어 위에 여러 운영체제를 실행할 수 있도록 하는 기술입니다. 가상 머신은 호스트 운영체제 위에 게스트 운영체제를 설치하고, 그 운영체제 내에서 애플리케이션을 실행하는 방식으로 동작합니다.

대표적인 가상 머신 소프트웨어로는 VMwareVirtualBox가 있으며, 개발자들은 이를 통해 가상 환경에서 여러 운영체제를 실행하거나 다양한 테스트 환경을 구성할 수 있습니다.

호스트 운영체제와 게스트 운영체제

가상 머신에서는 두 가지 중요한 개념이 있습니다. 호스트 운영체제게스트 운영체제입니다.

  • 호스트 운영체제: 가상 머신 소프트웨어가 설치되고 실행되는 실제 운영체제입니다.
  • 게스트 운영체제: 가상 머신에서 가상화된 환경에서 실행되는 운영체제입니다.

호스트 운영체제는 물리적인 하드웨어 자원을 관리하고, 게스트 운영체제는 그 자원을 사용하는 구조입니다. 각각의 게스트 운영체제는 자신이 사용하는 리소스가 물리적인지 가상화된 것인지 인식하지 못하고, 독립적인 환경에서 실행됩니다.

하이퍼바이저 (Hypervisor)

가상 머신은 **하이퍼바이저(Hypervisor)**라는 소프트웨어에 의해 실행됩니다. 하이퍼바이저는 물리적 하드웨어와 가상 머신 사이에서 리소스를 관리하는 역할을 하는 소프트웨어로, 가상 머신이 호스트 하드웨어에 직접 접근하는 것을 제어합니다.

하이퍼바이저는 크게 두 가지 유형으로 나눌 수 있습니다.

  1. Type 1 하이퍼바이저 (베어메탈 하이퍼바이저): 하드웨어 위에 직접 설치되어 호스트 운영체제 없이 가상 머신을 관리하는 방식입니다. 주로 서버에서 사용되며, 성능이 뛰어나고 효율적입니다. 대표적인 예로 VMware ESXi와 Microsoft Hyper-V가 있습니다.
  2. Type 2 하이퍼바이저: 기존 운영체제(호스트 운영체제) 위에서 동작하며, 그 운영체제 위에 가상 머신을 실행합니다. VMware Workstation이나 Oracle VirtualBox 같은 소프트웨어가 이에 해당합니다. 설치가 쉽고 사용이 간편하지만 Type 1에 비해 성능이 떨어질 수 있습니다.

하이퍼바이저는 각 가상 머신이 독립된 리소스를 사용하도록 보장하며, 게스트 운영체제가 물리적인 하드웨어와 직접 상호작용하는 것을 방지합니다. 일반적으로 개인 PC 에서는 Type 2 하이퍼바이저를 사용하는 경우가 많습니다. 다만, 설치가 쉽고 사용이 간편하지만 Type 1에 비해 성능이 떨어질 수 있습니다.

가상 머신의 구조

다음 그림처럼, 호스트 운영체제는 물리적인 자원을 하이퍼바이저(Hypervisor) 에게 통째로 할당하고, 하이퍼바이저는 이 자원을 각 게스트 운영체제에게 나누어 할당합니다. 예를 들어, 호스트 운영체제가 CPU 6개와 RAM 7GB를 제공하면, 하이퍼바이저는 이를 나누어 게스트 운영체제 1에 CPU 2개와 RAM 2GB, 게스트 운영체제 2에 CPU 3개와 RAM 4GB, 게스트 운영체제 3에 CPU 1개와 RAM 1GB를 할당하는 식입니다. 이를 통해 여러 게스트 운영체제가 물리적 자원에 독립적으로 접근하며, 동시에 실행될 수 있습니다.


hypervisor-structure icon

Docker 의 구조

Docker 는 가상 머신과 비교했을 때 가볍고 효율적인 컨테이너 기반으로 동작합니다. 가상 머신이 각 애플리케이션마다 별도의 운영체제를 사용하는 반면, Docker 는 호스트 운영체제의 커널을 공유하고, 애플리케이션을 독립된 컨테이너 내에서 실행하는 구조를 가지고 있습니다. 이를 자세히 설명하면 다음과 같습니다.

호스트 운영체제와 컨테이너

Docker 는 호스트 운영체제 위에서 동작하며, 각 애플리케이션을 컨테이너라는 독립된 환경에서 실행합니다. 이 때, 각 컨테이너는 자신만의 파일 시스템과 네트워크, 프로세스 공간을 가지고 있지만, 호스트 운영체제의 커널을 공유합니다. 즉, Docker 는 별도의 운영체제를 설치하지 않고, 애플리케이션과 그 의존성만을 패키징하여 빠르고 가볍게 실행할 수 있는 환경을 제공합니다.

Docker Daemon (도커 데몬)

Docker 의 핵심 구성 요소 중 하나는 Docker Daemon 입니다. 이는 호스트 운영체제에서 동작하며, Docker 컨테이너와 이미지를 관리합니다. Daemon 은 Docker CLI(Command Line Interface)와 통신하며, 컨테이너의 생성, 실행, 중지 등을 처리합니다.

컨테이너

컨테이너는 Docker 의 가장 중요한 요소로, 애플리케이션과 그 실행에 필요한 모든 것을 포함하는 패키지입니다. 각 컨테이너는 독립된 파일 시스템을 가지고 있으며, 애플리케이션이 실행되는 동안 다른 컨테이너와는 격리된 환경을 유지합니다. 그러나 컨테이너는 호스트 운영체제의 커널을 공유하여 가상 머신보다 훨씬 가볍고 빠르게 동작합니다.

컨테이너 내부에는 애플리케이션 코드, 라이브러리, 의존성 등이 포함되며, 이는 Docker 이미지로부터 생성됩니다.

Docker 이미지

Docker 이미지는 컨테이너를 실행하기 위한 불변의 템플릿입니다. 이미지는 여러 계층으로 이루어져 있으며, 각 계층은 파일 시스템의 스냅샷으로 구성됩니다. Docker 이미지는 이 계층 구조 덕분에, 기존 이미지에서 새로운 이미지로의 변경이 효율적입니다. 새로운 이미지를 만들 때는 기존 이미지를 기반으로 필요한 부분만 추가하여 변경합니다.

Docker 레지스트리

Docker 레지스트리는 Docker 이미지를 저장하고 배포하는 저장소입니다. 개발자는 Docker Hub와 같은 공개 레지스트리에 이미지를 업로드할 수 있으며, 이를 통해 여러 환경에서 동일한 이미지를 사용할 수 있습니다. Docker 는 컨테이너 실행 시 필요한 이미지를 레지스트리에서 다운로드하여 실행할 수 있습니다.

Docker 구조 요약

Docker 는 호스트 운영체제의 커널을 공유하면서, 각 컨테이너는 애플리케이션을 독립된 환경에서 실행합니다. Docker Daemon 이 이러한 컨테이너를 관리하며, 컨테이너는 Docker 이미지로부터 생성됩니다. 이미지는 여러 계층으로 구성되어 효율적으로 관리되며, Docker 레지스트리를 통해 공유되고 배포됩니다.

Docker 의 구조를 나타낸 그림

이를 시각적으로 표현하면 다음과 같습니다


docker-structure icon

각 컨테이너는 호스트 운영체제의 커널을 공유하고, Docker Daemon 을 통해 관리되며, 필요한 이미지는 Docker 레지스트리를 통해 다운로드됩니다.

Docker 와 가상 머신의 차이점

이제 Docker 가 가상 머신과 어떻게 다른지 비교해 보겠습니다. 두 기술은 모두 격리된 환경에서 애플리케이션을 실행할 수 있지만, 그 방식과 효율성에서 중요한 차이가 있습니다.

운영체제 구조

가장 큰 차이점은 운영체제 구조에서 시작됩니다. 가상 머신은 각 애플리케이션이 실행되기 전에 별도의 운영체제를 필요로 합니다. 즉, 가상 머신은 게스트 운영체제를 설치하고 그 위에서 애플리케이션을 구동하는 방식입니다. 이로 인해 각 가상 머신은 호스트 운영체제 외에 독립적인 운영체제 전체를 실행해야 하므로, 많은 리소스가 필요하게 됩니다. 운영체제의 설치와 구동 과정에서 많은 시간이 소요되기 때문에 무겁고, 자원 소모가 큽니다.

반면, Docker 는 이러한 방식과는 다르게, 호스트 운영체제의 커널을 공유하여 애플리케이션을 실행합니다. Docker 컨테이너는 자체적인 운영체제를 포함하지 않고, 애플리케이션과 그 실행에 필요한 라이브러리 및 종속성만을 포함한 가벼운 패키지입니다. 이로 인해 Docker 는 더 가볍고 빠르게 애플리케이션을 실행할 수 있으며, 리소스 소비를 최소화할 수 있습니다. Docker 컨테이너는 애플리케이션이 독립된 환경에서 실행되도록 하지만, 각 컨테이너는 호스트 운영체제의 커널을 공유하기 때문에 운영체제를 중복 설치할 필요가 없습니다. 그 결과, 서버 리소스는 훨씬 더 효율적으로 사용됩니다.

리소스 효율성

이러한 운영 방식의 차이는 리소스 효율성에서도 크게 나타납니다. 가상 머신은 각 게스트 운영체제가 독립적으로 메모리와 CPU 자원을 사용하기 때문에, 여러 가상 머신이 동시에 실행될 경우 상당한 양의 리소스가 필요합니다. 예를 들어, 동일한 서버에서 여러 개의 가상 머신을 실행하려면 각 운영체제에 할당되는 리소스가 중복되므로, 전체적으로 서버 자원을 많이 소모하게 됩니다.

Docker 는 컨테이너가 운영체제를 공유하고, 애플리케이션에 필요한 요소만 격리하여 실행하기 때문에 자원 소비가 최소화됩니다. 한 서버에서 수백 개의 컨테이너를 동시에 실행할 수 있으며, 각 컨테이너는 필요한 최소한의 리소스를 사용하여 애플리케이션을 구동합니다. 이러한 특성 덕분에 Docker 는 높은 리소스 효율성을 자랑하며, 특히 클라우드 환경에서 비용 절감과 확장성에 매우 유리합니다.

시작 속도

시작 속도 역시 두 기술 간의 중요한 차이점 중 하나입니다. 가상 머신은 각 게스트 운영체제를 부팅해야 하므로, 시작하는 데 시간이 오래 걸립니다. 이는 운영체제 자체의 부팅 시간과 관련이 있기 때문에, 애플리케이션을 빠르게 실행하거나 배포해야 하는 경우에는 불리합니다.

반대로, Docker 는 운영체제를 다시 부팅할 필요가 없기 때문에 컨테이너를 몇 초 내로 시작할 수 있습니다. Docker 는 컨테이너 내부에서 필요한 환경을 미리 준비해 놓은 상태에서 애플리케이션을 바로 실행하므로, 빠른 배포와 확장이 가능합니다. 이는 특히 CI/CD 파이프라인에서 큰 장점으로 작용하며, 빠른 피드백과 신속한 배포가 필요한 현대 개발 환경에 매우 적합합니다.

애플리케이션 격리

또한, 애플리케이션 격리 측면에서도 두 기술은 차이를 보입니다. 가상 머신은 각 운영체제가 완전히 독립된 환경에서 동작하므로, 애플리케이션 간의 격리는 매우 철저합니다. 이는 보안적인 측면에서는 매우 유리하지만, 성능 비용이 큽니다. 각 운영체제가 독립적으로 리소스를 사용하기 때문에 리소스 간의 공유가 제한되며, 자원 관리에서 비효율적인 면이 있을 수 있습니다.

반면, Docker 는 컨테이너를 통해 애플리케이션을 격리하면서도, 호스트 운영체제의 자원을 공유함으로써 성능 비용을 크게 줄입니다. Docker 컨테이너는 가상 머신처럼 애플리케이션을 격리하지만, 더 적은 리소스를 사용하여 비슷한 수준의 격리 환경을 제공할 수 있습니다. 이는 서버 자원 관리를 단순화하며, 여러 애플리케이션을 동시에 실행하는 경우에도 유연성과 효율성을 높여줍니다.

이식성

마지막으로, 이식성에서 큰 차이를 볼 수 있습니다. 가상 머신은 애플리케이션과 운영체제를 함께 패키징하기 때문에 어느 정도의 이식성은 보장되지만, 운영체제나 하드웨어 간의 호환성 문제로 인해 성능 저하나 호환성 이슈가 발생할 수 있습니다. 특히, 서로 다른 호스트 운영체제 간의 이전 과정에서 추가적인 설정이 필요하거나 성능 문제가 발생할 가능성이 있습니다.

반면, Docker 는 컨테이너 단위로 애플리케이션과 그 환경을 패키징하므로, 한 번 작성한 컨테이너를 어디서든 동일하게 실행할 수 있습니다. 이는 개발 환경에서 테스트한 컨테이너를 프로덕션 환경에서도 동일하게 실행할 수 있다는 의미이며, 환경 차이로 인한 오류를 최소화할 수 있습니다. Docker 의 높은 이식성 덕분에 다양한 환경에서 안정적으로 애플리케이션을 실행할 수 있으며, 이는 클라우드 기반 서비스나 마이크로서비스 아키텍처에서 특히 유용합니다.

결론

이와 같이, Docker 는 가상 머신에 비해 더 가볍고 빠르며, 자원 관리와 이식성에서 큰 장점을 가지고 있습니다. 이는 Docker 가 현대의 애플리케이션 개발과 배포 환경에서 널리 사용되는 이유 중 하나입니다. Docker 의 경량화된 컨테이너 구조 덕분에 개발자들은 더 빠르고 효율적으로 애플리케이션을 배포하고 관리할 수 있으며, 이는 특히 클라우드와 마이크로서비스 아키텍처 환경에서 매우 중요한 역할을 합니다.