도커란?
도커는 컨테이너를 생성하고 관리하는 도구이다. 컨테이너는 표준화된 소프트웨어의 단위이다. 즉, 코드와 그 코드를 실행하기 위한 의존성들의 묶음이다.
예를 들어, NodeJS 애플리케이션을 구축하려고 한다고 해보자. NodeJS란 Javascript Runtime으로 서버에서 Javascript를 실행할 수 있게끔 해준다. 만약 도커로 NodeJS 컨테이너를 구축한다면 그 컨테이너 안에는 NodeJS를 구동할 수 있는 환경이 갖춰져 있어 즉시 사용자가 작성한 코드를 실행시킬 수 있다.
또한, 표준화된 소프트웨어의 단위이기 때문에 같은 컨테이너는 어디서 누가 실행시키든 같은 결과를 보장한다.
도커를 왜 사용할까?
이 질문은 결국 독립적이고 표준화된 애플리케이션 묶음(컨테이너)이 왜 중요한 것일까? 와 궤를 같이한다.
앞서 NodeJs의 예제로 들어보자면, 개발 환경에서 NodeJS 14.3 버전으로 작성한 코드는 항상 14.3 버전이나 그 이상의 버전에서만 실행될 수 있다고 하자. 하지만 이를 배포하려는 환경은 NodeJS 버전이 14.3 보다 낮으면 어떻게 될까? 당연히 코드가 정상적으로 작동하지 않을 것이다. 더 나아가 같은 코드를 작업하는 팀원들과도 같은 환경을 구성해야 동일한 결과를 기대할 수 있다. 또한, 여러 프로젝트를 동시에 진행할 때 각 프로젝트가 요구하는 버전이 다를 수 있다. 이 때, 각 프로젝트를 실행할 때 마다 요구하는 의존성이나 런타임 환경을 지우고 재설치 해야한다.
정리하자면 도커를 사용하는 이유는 다음과 같다.
1. 개발과 배포 환경을 똑같이 구성하고 싶다.
2. 같이 일하는 동료와 같은 개발 환경을 공유하고 싶다.
3. 다른 프로젝트에서 요구하는 버전을 충족하기 위해 의존성이나 런타임 환경을 지우거나 재설치하고 싶지 않다.
Virtual Machine과의 차이점
Virtual Machine에선 Host OS 기반에 macOS나 Linux와 같은 GuestOS를 설치해 사용한다. 즉, 컴퓨터 안에 컴퓨터가 존재한다. Virtual Machine은 이 가상환경에서 자신이 필요한 라이브러리, 의존성, 도구 등을 설치해 사용할 수 있다. 또한, 도커와 마찬가지로 Virtual Machine 설정을 동료들과 공유할 수 있고 여러 프로젝트를 위한 다중 환경을 구성할 수 있다. 하지만, 이러한 Virtual Machine 방식은 여러 문제가 있다.
각각의 Virtual Machine은 하나의 독립적인 컴퓨터와 같다. 각 가상 컴퓨터는 메모리, CPU, 하드디스크의 공간이 필요하기 때문에 많은 자원을 낭비하게 된다. 또한, 여러 Virtual Machine을 띄울 때 중복되는 환경을 계속해 설치해야만 한다.
도커는 이러한 문제를 해결해주는 도구이다. 도커는 각 컨테이너에서 OS를 설치할 필요 없이 Container Engine을 통해 컨테이너들을 실행시킨다. 각 컨테이너들은 매우 작은 OS layer를 갖고 있긴 하지만 매우 경량화된 버전이다. 컨테이너는 이미지라고 불리는 설정 파일을 통해 설정을 공유할 수 있다.
Reference
https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms
'Infrastructure > Docker & Kubernetes' 카테고리의 다른 글
3. 도커 이미지 (0) | 2023.01.22 |
---|---|
2. Docker로 간단하게 서버 띄우기(MacOS) (0) | 2023.01.22 |