개요
대학선배들과 술을 먹다가 도커에 관한 이야기가 나왔는데 "도커와 VM의 실질적인 차이가 멀까?"라는 것에 대해 정확히 알지 못해 정리를 해보려고 한다. 정확히는 Contanier vs hypervisor가 맞는 것 같다.
Virtual Machine이란?
VM(virtual machine)의 정의는 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 시스템을 에뮬레이션(가상현실화)하는 소프트웨어라고 하며, 가상머신상에서 운영 체제나 응용 프로그램을 설치 및 실행할 수 있다고 한다.
VM에 대해서 찾아보면 하이퍼 바이저 기술이 등장한다.
하이퍼바이저(hypervisor)?
하이퍼바이저(hypervisor)는 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼이다. 이는 소프트웨어로 구성되며 물리적 머신에 다수의 가상머신을 띄워 분할할수 있도록 도와준다.
- 하이퍼바이저는 단일 하드웨어에서 여러 다른 가상 머신을 호스팅할 수 있는 프로그램이다.
- 가상 머신에 설치된 운영 체제는 게스트 OS 라고 부르며 경우에 따라 인스턴스라고 부르며, 하이퍼바이저가 실행되는 하드웨어는 호스트 머신이라고 부른다.
- 시스템에서 호스트 하드웨어의 프로세서, 메모리 및 리소스가 있는 것처럼 보이기 때문에 가상 머신 또는 운영 체제 각각은 자체 프로그램을 실행 할 수 있으며, 이러한 리소스를 가상 시스템에 할당 하는 것이 하이퍼바이저라고 한다.
Docker란?
도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다. - 도커 웹페이지상의 내용
도커에 가장 핵심적인 기술은 컨테이너이다.
컨테이너 (Contanier)?
컨테이너의 정의는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지라고 한다. 1)
개발 속도의 측면
컨테이너를 사용하면 동료 개발자 혹은 자신의 환경이 다름에 구애받지 않고, 훨씬 더 빠르게 개발을 진행할 수 있다.
운영의 효율적 측면
컨테이너는 OS 이미지를 담고 있지 않아 필요한 컴퓨팅 리소스만 사용하면 됩니다. 따라서 애플리케이션을 효율적으로 구동할 수 있다.
폭넓은 구동 환경
컨테이너는 거의 모든 곳에서 구동할 수 있습니다. 소프트웨어 구동 환경이 무엇이든 컨테이너를 사용할 수 있다.
가상화된 공간을 생성하기 위해 Linux 자체 기능인 chroot, namespace, cgroup을 사용하여 Process 단위의 독립 공간을 만들기 때문에 성능 손실이 거의 발생하지 않습니다. 2)
Docker VS Virtual Machine
아래의 그림은 Docker와 Virtual Machine차이에 대해 찾아보면 가장 많이 보이는 그림이다.
해당 그림을 통해 Docker와 Virtual Machine차이를 알아보도록 하겠다.
공통점
먼저 공통점을 알아보자면 그림에서 App가 실행되는 환경이 얇은 선으로 격리된 것을 알수 있다. 즉, Docker와 Virtual Machine은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.
차이점
- Docker은 Virtual Machine에서 사용되는 Guest OS 의 이미지를 사용하지 않기 때문에 가볍다는 장점이 있다.
- App을 실행하는 방식에 있어 Docker 방식에서는 호스트 OS 위에 어플리케이션의 이미지를 배포하기만 하면 되지만, VM은 어플리케이션을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음, Guest OS를 부팅하므로 훨씬 복잡하고 무겁게 실행해야 한다.
그렇다면 Docker는 자원을 어떻게 할당 받을까? 도커는 주체가 되는 Host OS에서 커널을 공유 받는다.
커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 한다. 4)
Docker is best?
위에서 설명한대로라면 VM을 사용할 이유가 없다. 그렇다면 Docker이 최고의 대안책일까?
- 안전성
Docker는 커널을 공유한다고 설명하였다. 커널을 공유한다는 것은 많은 장점을 가지고 있지만, 또한 단점도 가지고 있다. 공유는 전염을 당할수 있다는 의미이며 직관적으로 Host OS가 불안정 해진다면 이를 공유받고 있는 Contanier에도 영향을 끼칠수 있다. - 다양한 OS
또한 커널 기술은 리눅스 기반의 기술이기 때문에 Host OS가 다르면 다른 OS의 Contanier을 올릴수 없다. 예를 들자면 리눅스 기반의 Contanier를 Window에 올릴수 없다는 뜻이다. 반면 VM은 Guest OS를 통해 OS를 설정해 줄 수 있기 때문에 이러한 문제에서 자유로워 진다.
결론
각각의 기술이 가지고 있는 장단점이 있기 때문에 상황에 쓰는게 가장 좋은 방법이지만 개인적인 생각으로는 VM을 사용하는 것보다 리눅스에 맞춰 개발하고 도커를 사용하는게 좋다고 생각한다. 다음 도커 관련 글에서는 도커의 장점에 기반하여 상세하게 작성하여 보려고한다.
참조
1) 컨테이너 정의
2) 컨테이너 설명
3) https://rat2.tistory.com/47
4) 커널 설명
5) 도커가 최선?
'Infra > Docker' 카테고리의 다른 글
Docker로 딥러닝 환경 쉽게 구축하기 - 1 (0) | 2022.05.18 |
---|