1.0 도커(Docker) 가상화 기술: 가상화 기술과 하이퍼바이저 가상화, 컨테이너 가상화
PART1. 가상화 기술: 가상화 기술과 하이퍼바이저 가상화
정리하자면 가상화 기술은 “컴퓨터 안에서 컴퓨터를 또 실행하는 기술이다“라고 이해하시면 됩니다. IT 산업에서는 ”실제로 존재하는 것을 물리적, 가상으로 존재하는 것을 논리적으로 존재한다”라고 표현합니다. 즉, 가상화 기술을 조금 더 기술적으로 정의하면 물리적인 컴퓨팅 환경 내부에서 논리적인 컴퓨팅 환경을 만들 수 있는 기술이라고 정의할 수 있습니다.
그러면 가상화 기술은 왜 사용하는 걸까요? 여러분이 지금 CPU 8코어와 64GB 메모리인 성능 좋은 서버 한 대를 가지고 있다고 생각해 보겠습니다. 그리고 이 컴퓨터에서 평균적으로 1코어와 8GB 메모리를 소모하는 A 프로그램을 4개 실행하면 프로그램이 소모하는 총 자원은 4코어의 32GB 메모리가 되겠죠. 그러면 이 프로그램들을 어떻게 하면 컴퓨터에서 안전하고 효과적으로 실행시킬 수 있을까요?
저희가 평소에 사용하는 컴퓨터처럼 하나의 윈도우를 설치한 다음에 이 윈도우에서 프로그램을 4개 모두 실행할 수 있을 것입니다. 화면에 보시는 것처럼 컴퓨터에서 윈도우 OS를 먼저 실행해 본다고 생각해 보겠습니다. 지금 실행된 이 OS도 리소스를 사용하기 때문에 1코어와 8GB 메모리를 소모한다고 가정해 보겠습니다. 이 OS에서 프로그램을 모두 실행하면 총 5코어의 40GB 메모리를 사용할 것입니다. 그래도 아직 컴퓨터에 리소스가 남아 있기 때문에 리소스 사용량에는 문제가 없어 보이죠. 그리고 하나의 OS에서 프로그램이 모두 실행되고 있기 때문에 관리하기에도 편할 것 같습니다. 그런데 만약 이 상태에서 하나의 프로그램에 문제가 생기면 이 경우에는 다른 프로그램에도 영향을 줄 위험이 있습니다. 그리고 하나의 프로그램의 사용량이 갑자기 급증해서 리소스를 모두 소모하게 된다면 역시 나머지 프로그램이 정상적으로 동작하지 않을 위험이 있습니다.
기업 운영 환경에서 이렇게 운영 중인 환경이 멈추는 것은 아주 큰 장애로 이어질 수 있기 때문에 소프트웨어를 하나의 OS에서 운영하는 것은 피하는 것이 좋습니다. 가상화 기술을 사용하면 한 대의 컴퓨터에 여러 대의 논리적인 OS 환경을 만들 수 있습니다. 그리고 이 가상으로 만들어진 컴퓨터에는 사용자가 리소스를 직접 분배할 수 있습니다. 리소스를 분배한다는 것은 하나의 가상 OS가 사용할 수 있는 리소스의 최대값을 정해놓는 것입니다. 보시는 것처럼 하나의 OS 안에서 4개의 추가 OS를 만들었는데요. OS의 개수가 아까 전 1개에서 총 5개로 늘어났기 때문에 하나의 OS에서 프로그램을 4개 사용하는 것보다 총 리소스 사용량은 증가하겠죠. 하지만 이 가상의 컴퓨터들은 논리적으로 격리되어 있기 때문에 앞서서 말씀드렸던 문제들을 근본적으로 해결할 수 있습니다. 한 대의 프로그램에서 에러가 발생해도 다른 프로그램에는 영향을 주지 않고요.
한 대의 프로그램에서 에러가 발생해도 다른 프로그램에는 영향을 주지 않고요. 프로그램 하나가 버그가 생겨서 리소스 사용량이 급증해도 OS 한 대의 사용량은 제한돼 있기 때문에 하나의 환경의 문제로 끝나게 됩니다. 이렇게 가상화 기술을 사용하면 각각의 소프트웨어는 여러 대의 컴퓨터를 사용하는 것처럼 안정적으로 실행할 수 있습니다. 물리적으로는 한 대의 컴퓨터를 사용해서 경제적이지만 사용자는 마치 여러 대의 컴퓨터를 사용하는 것처럼 가상 환경을 사용해서 안전하게 소프트웨어를 운영할 수 있습니다. 그러면 하드웨어를 여러 대 사용하면 되지 굳이 복잡하게 가상화 기술을 사용하는 이유가 뭘까요?
하드웨어의 성능은 빠르게 발전하고 있고요. 동시에 이 하드웨어를 사용하는 소프트웨어의 크기는 상대적으로 감소하는 추세입니다. 기업 입장에서는 낮은 사양의 컴퓨터를 여러 대 사용하는 것보다 높은 사양의 컴퓨터를 한 대 사용하는 것이 가격이나 설치 공간, 설치 인력, 서버 운영, 하드웨어 사이즈나 배선 같이 여러 면에서 훨씬 경제적입니다. 보통 성능이 차이 난다고 해서 하드웨어의 크기가 크게 커지는 것도 아니고요. 기기가 여러 대면 전기 사용량도 더 들어가겠죠. 이런 이유들로 가상화 기술을 써서 하나의 하드웨어를 효율적으로 활용하는 것이 엔터프라이즈 환경에서는 필수적입니다.
그래서 대부분의 IT 기업이 운영 환경에서 이렇게 가상화 기술을 활용하고 있습니다. 이전 시간에 엔터프라이즈 서버 운영 환경에 대해서 소개해 드렸었는데요. 여기서 두 번째, 세번째가 하나의 큰 서버를 여러 개의 논리적인 작은 서버로 쪼개서 사용하는 가상화 기술을 사용한 방식인데요. 가상화 기술은 크게 하이퍼바이저 방식과 컨테이너 방식이 있습니다. 먼저 전통적인 가상화 기술인 하이퍼바이저 가상화에 대해서 말씀 드리겠습니다.
하이퍼바이저는 컴퓨터에 설치되는 프로그램입니다. 화면에 보시는 것처럼 하이퍼바이저는 이렇게 OS의 프로그램으로 실행해서 가상화 환경을 관리할 수 있습니다. 하이퍼바이저를 사용해서 가상 OS를 만들거나 가상 OS를 실행시키고 종료할 수 있습니다. 그리고 가상 OS를 만들면 사용자가 지정해 놓은 CPU나 메모리만큼 컴퓨터의 격리된 공간을 만들 수 있습니다. 화면을 보시면 하이퍼바이저에서 가상 환경 1, 2, 3을 만든 다음에 가상환경 1과 2만 실행한 상태입니다. 가상환경은 일반적인 프로그램과 비슷합니다. 가상환경을 만들 때마다 프로그램을 설치하는 것처럼 디스크 공간을 차지하고요. 이 가상환경을 실행하면 프로그램을 실행시키는 것과 마찬가지로 사용자가 지정한 만큼의 CPU와 메모리를 사용하게 됩니다. 가상환경 3번을 보시면, 실행 전에는 저장 용량만 차지하고 있다가 하이퍼바이저에서 실행 버튼을 누르면 환경이 실행되면서 CPU와 메모리를 사용하게 되는거죠. 이제 조금 더 실무에서 사용되는 용어로 정리해 보겠습니다.
먼저 물리적인 서버에 설치되는 OS는 호스트 OS라고 부릅니다. 호스트 OS에는 하이퍼바이저를 설치해서 가상환경을 만들 수가 있습니다. 하이퍼바이저는 호스트 OS의 자원을 격리해서 새로운 OS를 실행합니다. 이렇게 설치돼서 실행된 OS가 게스트 OS입니다. 호스트 OS는 물리적인 하드웨어와 직접 연결되어 있고요. 게스트 OS는 호스트 OS의 리소스를 나눈 논리적인 공간입니다. 이 논리적으로 격리되어 있는 게스트 OS를 일반적으로 가상 머신이라고 부릅니다. 그리고 이 가상 머신에서 이전 시간에 배웠던 웹서버나 WAS, DB 같은 서버 프로그램을 프로세스로 실행해서 운영합니다. 프로세스는 실행 중인 프로그램을 의미합니다. 정리하자면 엔터프라이즈 운영 환경에서는 서버에 호스트 OS를 설치하고 가상화를 사용하기 위해서 하이퍼바이저를 설치한 다음에 가상 머신을 만들어서 게스트 OS를 실행하고요. 그리고 게스트 OS에서 실제 실행을 원하는 프로세스를 운영한다고 정리할 수 있습니다.
하이퍼바이저가 어떤 원리로 동작하는지 간단하게 살펴보겠습니다. 프로세스는 정상적으로 실행되기 위해서 CPU나 메모리 같은 리소스를 사용해야 합니다. 프로세스가 하드웨어를 사용하기 위해서는 OS를 통해서만 사용할 수 있습니다. OS는 하드웨어를 사용하기 위해서 커널이라는 중요한 도구가 설치되어 있습니다. 일반적인 프로그램인 웹 브라우저나 문서 편집 프로그램을 실행할 때도 실행되어 있는 프로세스들은 OS의 커널에게 하드웨어 리소스를 요청합니다. 이렇게 커널이라는 중간다리를 거쳐서 요청이 가는 이유는 하드웨어의 리소스를 사용하는 것은 아주 복잡하고 조심히 다뤄야 하기 때문입니다. 그래서 커널은 하드웨어에 이 사용 요청을 대신 전달해주는 시스템 콜이라는 표준을 정해놓았습니다.
중요한 업무를 처리하는 커널이라는 소통 창구를 따로 만들어 놓은 것이죠. 그래서 프로세스들은 커널에 시스템 콜을 보내서 하드웨어의 자원을 사용할 수 있습니다. OS는 대표적으로 윈도우, 리눅스, macOS가 있습니다. 각각의 OS는 다른 종류의 커널을 사용합니다. 그렇기 때문에 시스템 콜도 다릅니다. 이 3개의 OS는 마치 대화가 전혀 불가능한 외국인 3명이 모인 것과 똑같습니다.
그래서 가상화 기술을 사용해서 윈도우 호스트 OS에서 게스트 OS로 macOS나 리눅스 OS를 실행해야 한다고 생각해 보겠습니다. 게스트 OS의 커널은 실제로 물리적인 하드웨어가 없기 때문에 리소스를 사용하려면 호스트 OS의 커널로 리소스 사용을 요청해야 합니다. 하지만 화면과 같이 호스트 OS와 게스트 OS가 종류가 다르면 이 호스트 OS는 게스트 OS에서 전달받은 시스템콜을 처리할 수 없습니다. 여기서 하이퍼바이저가 바로 다른 커널 간의 언어를 통역해주는 통역가 역할을 수행합니다. 그래서 하이퍼바이저를 사용하면 격리된 공간을 만들면서 호스트 OS와 다른 종류의 게스트 OS도 사용할 수 있습니다. 저희가 하이퍼바이저를 사용하는 많은 케이스가 윈도우 OS에서 리눅스 OS를 사용하는 경우인데요. 윈도우 OS는 사용성은 뛰어나지만 한 대의 성능이 무겁고 라이선스 가격도 비싸기 때문에 메인 OS는 윈도우로 유지하면서 실제로 프로그램을 실행시키는 서버 운영은 가벼운 리눅스 서버를 사용하는 경우가 많습니다. 컴퓨터공학과 학생분들이면 리눅스를 실습할 때 버추얼박스라는 하이퍼바이저를 사용해서 윈도우 OS에 리눅스 OS를 설치해 보신 경험이 있을 겁니다. 하이퍼바이저는 특정 제품이 아니고 기술의 종류이기 때문에 이 하이퍼바이저 역할을 수행하는 다양한 소프트웨어들이 있습니다. 버추얼 박스도 그 중 하나인 것이죠. 버추얼 박스는 오픈소스이기 때문에 테스트나 학습 환경에서 많이 사용되는 하이퍼바이저입니다. 기업에서는 일반적으로 VMware나 레드햇의 하이퍼바이저 제품을 많이 사용합니다.
가상화 기술: 컨테이너 가상화
다음으로 컨테이너 가상화 기술을 소개하고 앞서 말씀드렸던 하이퍼바이저 방식과의 장단점을 비교해 보겠습니다. 이전 시간에서 하이퍼바이저 가상화 기술을 사용해서 가상 머신을 관리할 수 있다고 말씀드렸었는데요. 저희가 앞으로 배울 도커는 컨테이너 가상화라는 새로운 종류의 가상화 기술과 관련이 있습니다. 컨테이너 가상화 기술은 현대 애플리케이션 운영 환경에서 하이퍼바이저 방식보다 더 선호되는 가상화 기술입니다. 컨테이너가 더 선호되는 이유를 먼저 말씀드리면, “가볍고 빠르다”라는 두 가지 핵심 장점 때문입니다. 웹서버를 구동하는 시간을 비교해 보겠습니다. 일반적으로 가상화 기술이 설치되어 있는 호스트OS에서 가상화 기술을 사용해서 웹서버를 하나씩 띄워 보겠습니다. 하이퍼바이저를 사용한 가상 머신 방식은 60초 정도가 걸렸고요. 도커 방식은 3초가 걸렸습니다. 아마 생각하셨던 것보다 차이가 더 크게 느껴지실 겁니다. 이 모던 애플리케이션 운영 환경에서 가볍고 빠르다는 것은 아주 중요한 요구 사항 중에 하나입니다. 소비자의 니즈가 빠르게 변화하기 때문에 애플리케이션도 이 요구 사항에 맞춰서 빠르게 변화해야 하기 때문입니다. 그러면 이제 좀 더 기술적으로 이 두 가지 가상화의 차이를 비교해 보겠습니다.
컨테이너 가상화는 리눅스 커널이 제공하는 LXC(LinuX Containers)라는 자체 격리 기술에서 출발했습니다. 이전 하이퍼바이저 가상화에서는 하이퍼바이저라는 소프트웨어가 격리된 공간을 만들어 주었는데요. LXC 기술을 사용하면 하이퍼바이저를 사용하지 않고도 커널의 자체 기능만 사용해서 격리된 공간을 만들 수 있습니다. LXC 기술은 커널의 네임스페이스와 CGroups(control groups)라는 기능을 활용합니다.
네임스페이스는 프로세스와 하드드라이브, 네트워크, 사용자, 호스트 네임처럼 리소스를 나누는 기준의 역할을 합니다. 그리고 Cgroups는 프로세스가 사용하는 메모리와 CPU, 하드디스크, 네트워크 밴드위스처럼 리소스의 사용량을 배분하는 기술입니다. 그리고 이런 LXC 기술을 사용해서 만들어진 각각의 격리된 공간을 컨테이너라고 부릅니다. 네임스페이스나 cgroups 같은 디테일한 기술이 중요한 것은 아니고요. 컨테이너 가상화는 하이퍼바이저 없이 커널의 자체 기술을 활용한 가상화라는 것만 이해하시면 됩니다. 컨테이너 가상화는 커널의 격리 기능을 활용하기 때문에 보시는 것처럼 모든 컨테이너는 HostOS의 커널을 공유해서 사용합니다. 이 HostOS의 커널을 공유한다는 것이 컨테이너 가상화의 가장 중요한 특징 중 하나입니다. 이전 시간에 말씀드렸던 하이퍼바이저는 Guest OS와 Host OS의 커널이 독립적으로 존재했죠.
그리고 이 하이퍼바이저라는 소프트웨어가 중간에서 커널 간의 통신을 지원한다고 말씀드렸습니다. 각각의 시스템콜들이 하이퍼바이저의 통역을 거쳐가기 때문에 요청이 거쳐가는 단계가 늘어나겠죠. 이 단계가 많다는 것을 오버헤드가 크다고 표현하고요. 하지만 컨테이너는 호스트 OS의 커널을 그대로 사용하기 때문에 중간 단계가 따로 없어서 하이퍼바이저 방식보다 상대적으로 오버헤드가 적습니다. 오버헤드가 적다는 것은 하드웨어 리소스 사용 요청이 더 효율적으로 이루어진다는 것을 의미합니다. 그리고 커널이 독립적으로 있다는 것은 이 커널을 실행하는 데 있어서 시간이 더 필요하다는 것을 의미하는데요. 각각의 컨테이너들은 자체적인 커널이 없고 호스트 OS의 커널을 공유하기 때문에 커널을 실행하는 시간 자체가 없어집니다. 그래서 일반적으로 컨테이너 가상화는 하이퍼바이저 가상화보다 훨씬 더 부팅 속도가 빠르다는 장점이 있습니다. 그래서 이 오버헤드가 적고 부팅이 빠르다는 점이 모던 애플리케이션의 요구사항을 충족시킬 수 있었던 것입니다. 다만 이 커널을 독립적으로 가지고 있는 가상 머신이 보안 면에서는 더 뛰어나다고 볼 수도 있습니다. 그리고 컨테이너는 호스트 OS의 커널을 공유하기 때문에 호스트 OS와 다른 종류의 OS는 실행할 수 없다는 것이 상대적인 단점이라고 볼 수 있습니다.
네 그럼 여기까지 이야기를 정리해 보겠습니다. 가상화 기술은 큰 서버를 나눠서 사용할 수 있는 기술입니다. 가상화 기술은 하이퍼바이저를 사용한 가상 머신 기술을 사용했는데요. 이 가상 머신 방식은 각각의 게스트 OS가 독립적인 커널을 가지기 때문에 구성하고 실행하기까지의 시간이 오래 걸리고 하나의 게스트 OS가 차지하는 오버헤드가 크다는 단점이 있었습니다. 현대 애플리케이션 운영 환경에서는 애플리케이션이 소비자의 니즈에 맞게 변경 사항이 빠르게 적용될 수 있어야 합니다. 여기서 등장한 컨테이너 가상화의 가볍고 빠르다는 특징이 이런 요구 사항들을 만족시킬 수 있었고요. 그래서 더 선호되는 가상화 기술이 될 수 있었습니다.
이런 히스토리를 이해하셨으면 이제 드디어 도커에 대한 이야기를 시작할 수 있을 것 같습니다. 커널이 자체적으로 제공하는 가상화 기술은 사용자가 직접 컨트롤하기는 어렵습니다. 저희가 앞으로 배울 도커라는 소프트웨어는 이 커널의 컨테이너 가상화 기술을 편리하게 사용하기 위해 만들어진 소프트웨어입니다. 사용자는 도커를 통해서 컨테이너를 만들고 운영할 수 있습니다. 그림만 봐서는 하이퍼바이저와 비슷하게 보일 수도 있는데요. 하이퍼바이저 방식에서는 격리된 공간을 만드는 소프트웨어가 하이퍼바이저라는 소프트웨어이면 컨테이너 가상화에서 실제 격리를 수행하는 주체는 도커 소프트웨어가 아닌 커널 자체입니다. 도커는 이 커널의 가상화 기술을 활용할 수 있게 도와주는 보조 도구라고 볼 수 있습니다. 이번 시간에는 컨테이너 가상화 기술에 대해 알아보았고요. 하이퍼바이저 방식과의 장단점을 비교해 보았습니다. 다음 시간에는 도커가 실제로 동작하는 방식에 대해서 자세하게 학습하겠습니다.