-
Virtual Machine vs Docker ContainerInfra/컨테이너 2022. 7. 24. 09:30
Virtual Machines/ Virthal Operating system
같은 개발환경을 제공하는 문제는 Vitual Machine으로 도 해결할 수 있는 것 아닐까?
* Vitual Machine: 호스트 운영체제에 독립적인 자체 셀(Shell)을 지닌 캡술화된 가상의 운영체제를 지닌 솔루션을 의한다.
Virtual Machine을 사용한다는 것은 호스트 운영체제, 즉 Windows 또는 macOS 또는 Linux가 있고, 그 위에 Virtual Machine을 설치한다는 것이다. 말하자면 컴퓨터 내부의 컴퓨터이다.
Virtual Machine에는 내부에서 실행되는 자체 운영체제가 있다. 예를 들어 Linux라고 해보자 그런 다음 이 Virtual Machine은 컴퓨터와 같기 때문에 Virtual Machine에서 에뮤레이트 할 수 도 있고 Vitual Machine 내부에 추가 도구를 설치할 수동 있다.
*emulation(에뮬레이션) : 한 컴퓨터가 다른 컴퓨터 처럼 똑같이 작동하도록 소프트웨어나 마이크로 프로그래밍을 사요하는 기법이다. 하드웨어적으로 수행되는 작업을 소프트웨어로 흉내내어 처리하는 방식을 가르키기도 한다.
Virtual Machine는 가상으로 존재하지만 다른 머신이기 때문에 거기에 원하는 무엇이든 설치할 수 있다. 그래서 필요한 모든 라이브러리, 종속성 및 도구를 설치한 다음 소스 코드를 그 위치로 이동할 수도 있다.
따라서 프로그램에 필요한 모든 것과 거기에 설치되는 모든 도구가 포함된 캡슐화된 가상 머신이기 때문에 Docker Container와 동일한 결과를 얻을 수 있다. 즉 Virtual Machines 역시 모든 것이 보유된 캡슐화된 환경인 것이다.
그런 다음 서로 다른 프로젝트에 대해 서로다른 환경을 여러개 가질 수 있다. 또는 Virtual Machine 구성을 동료와 공유하여 동일한 환경에서 작업하고 있는지 확인할 수 도 있다.
하지만 이런 방식에는 몇 가지 문제가 있다. 가장 큰 문제는 가상 운영체제를 지닌 여러 Vitual Machine에서 발생하는 overhead이다. 모든 Vitual Machine은 실제로 우리 컴퓨터 위에서 실행되는 stand-alone 컴퓨터와 같다.
*overhead(오버헤드) : 오버헤드란 프로그램의 실행흐름에서 나타나는 현상중 하나로 예를 들어 , 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상이다.한마디로 정의하자면, 오버 헤드는 특정 기능을 수행하는데 드는 간접적인 시간, 메모리 등 자원을 말한다.
예를들어, 10초 걸리는 기능이 간접적인 원인으로 20초걸린다면 오버헤드는 10초가 되는것이다.
*stand-alone : 다른 어떤 장치의 도움도 필요없이 그것마으로 완비된 장치를 의미한다.
따라서 이러한 머신이 여러대 있는 경우에 우리는 많은 공간과 리소스를 낭비하게 된다. 왜냐하면 매번 완전 새로운 그리고 또 다른 컴퓨터를 우리의 컴퓨터 안에 마련해야 하기 때문이다. 당연히 이러한 작업은 메모리,CPU 또는 하드 드라이브 공간을 낭비하게 한다.
그래서 시스템에 버츄얼 머신이 점점 더 많아 진다면 문제가 될 수 있다는 것이다. 각각의 다른 프로젝트를 위한 맞춤 환경에도 반복되어 복제되는 것들이 존재하는데 특히 운영체제가 그렇다.
모든 Virtual Machine에서 Linux를 사용한다고 해도 여전히 모드 머신에 별도로 설치되어 있다. 그리고 그것은 당연히 많은 공간을 낭비한다. 또한 모든 버추얼 머신에 다른 많은 도구 설치되어 있을 것이다. 그 도구들은 애플리케이션에 직접적으로 필요하지는 않지만 여전히 디폴트로 존재하도록 설정되어 있다.
Virtual Machine이 가지는 장단점
동일한 개발환경에 재생산 공유가 가능하더라도, 원하는 모든 시스템에 Virtual Machine을 설정해야하고, 정확히 동일한 환경을 구성해야 하기 때문에 까다로울 수 있다. 또한 공유할 수 있는 단일 구성 파일이 없다.
개발로 생산된 애플리케이션을 제품으로써 배포하려면 Vitual Machine과 동일한 방식으로 Production Machine을 구성해야한다. 이는 가능한 일이지만 성능상 좋지 않으므로, Production에서는 이러한 방식을 지양될 수있다.
위와 같은 이유로 보완하기 위해 Docker Container가 사용되는 것이다. 실질적으로 Container가 핵심 개념이라는 것을 이해하는 것이 매우 중요하다. Docker는 이를 만들고 관리하기 휘한 사실상의 표준 도구일 뿐이다.
Docker Helps You Build & Manage "Containers"
Container를 사용하면 여전히 호스트 운영체제, Windows,macOS,Linux가 존재 하지만 하나의 컴퓨터에 여러대의 Machine을 설지하지는 않아도 된다.
그대신 우리는 기본적으로 운영체제가 내장되어 있거나 컨테이너 amulate를 지원하는 내장 Container를 사용하게 되고
Docker는 이런 내장 Container들이 작동하도록 처리한다
내장 운영체제 와 에뮬레이트된 Container를 지원하는 환경 위에 Docker Engine이라는 도구를 실행하는 것이다.
뿐만아니라 그것이 설치 될때 Docker에 의해 모든 설정이 완료된다.
그런 다음 현재 우리의 시스템에서 실행되는 이 Docker Engine을 기반으로 하여 Container를 실행 할 수 있다.DockerEngine은 가볍고 작은 규모로 설치된 하나의 tool에 불과하며 우리는 이것을 이용하여 여러개의 Container들을 돌릴 수 있다.
그리고 위의 설명된 원리로 생성된 Container들이 우리의 코드와 NodeJS와 같은 코드 작동에 필요한 tool과 런타임을 포함하고 있다. 또한 불필요한 운영체제와 갖가지 tool들은 포함하고 있지 않다. 다만 Container 내부의 작은 운영체제 layer를 가지고 있을 지만 이 것은 Virtual Machine에서 설치를 필요로하는 것들 보다는 훨씬 가벼운 버전의 운영체제일 뿐이다.
Container의 또 다른 장점은 configure file을 사용하여 Container를 구성하고, 그 configure file 자체가 Container를 설명할 수도 있다는 것이다. 그리고 그 confirgure file을 다른 사람들과 공유하여 다른 사람이 동일한 Container를 다시 만들수 있도록 하거나 Container를 image라는 것으로 빌드할 수도 있다는 것이다.
그 image라는 것을 다른 사람과 공유하여 각각 다른 사람이 자신의 시스템에서 Container를 만든 사람의 시스템에 있는 것과 동일한 Container를 start 하도록 할 수 있다.
정리
특징 구분 Docker Container Virtual Machines 컴퓨터에 끼치는 영향 운영체제에 끼치는 영향이 적다
속도가 빠르다.
최소한의 디스크 공간을 사용한다.운영체젝에 큰 영향을 끼친다.
느리다.
디스크 공간을 많이 차지한다.공유성 공유가 용이하다.
re-build하고 배포하기가 쉽다.공유성이 떨어진다.
re-build하고 배포하기 까다롭다.간편성 개발환경을 완전히 복제한 하나의 가상 컴퓨터 대신에 에뮬레이트 된 앱들을 사용한다. 하나의 앱만 아니라 개발환경을 완전히 복제한하나의 가상컴퓨터를 에뮬레이트 해야한다. 'Infra > 컨테이너' 카테고리의 다른 글
Docker 외부 이미지의 사용& 실행 (0) 2022.08.13 Docker Images & Containers (0) 2022.08.13 Docker란? (0) 2022.07.23 docker에 대한 기본 이해 (0) 2022.05.01 리눅스에 Docker /Docker-Compose설치하기 (0) 2022.05.01