본문 바로가기
Dev/etc

[Docker] Docker&Container 기본 개념

by ssyoni 2022. 6. 2.
반응형

도커로 간단하게 컨테이너를 실행시키고 프로젝트를 빌드해본 적은 있지만 도커가 무엇이고 컨테이너란 무엇인지 그리고 도커를 왜 사용해야 하는지에 대해서 제대로 공부해본 적은 없는 것 같다.
마침 Udemy에서 할인 이벤트를 진행하고 있길래 docker&kubernetes 강의를 결재했다. 언젠간 공부해야 하는데 책 보고 하긴 귀찮고 마침 강의도 싸니까 강의 보면서 삽고수가 떠맥여주는 강의 내용을 간단하게 정리해보고자 한다.

도커가 무엇인지에 대한 질문을 던지기 전에 컨테이너란 무엇인지를 짚고 넘어가보자.

 

컨테이너란?

표준화된 소프트웨어 유닛.
기본적으로 코드 패키지라고 볼 수 있으며 해당 코드를 실행하는데 필요한 종속성과 도구가 포함되어있어야 한다.
예를 들어서 Node.js 애플리케이션을 구축하는 경우를 생각해보자. NodeJS는 서버에서 자바스크립트 코드를 실행하는 데 사용할 수 있는 자바스크립트 런타임이다. 만약 이러한 애플리케이션을 컨테이너로 만든다면, 애플리케이션 소스코드뿐만 아니라 NodeJS런타임과 그 외에 코드를 실행하는데 필요한 기타 도구들이 포함되어있어야 한다.
즉 프로그램을 만들고 이를 실행시키기 위한 코드와 종속성들을 패키지화 하는것이 컨테이너이고, 이는 공유될 수 있으며 어렵지 않게 실행될 수 있다.

이렇게 만들어진 각각의 컨테이너는 도커가 실행되는 모든 곳에서 보관, 관리가 가능하다.
즉 도커는 이러한 컨테이너를 구축하고 실행시키기 위한 도구라고 할 수 있다.

 

소프트웨어 개발에 컨테이너가 필요한 이유?

코드가 필요로하는 모든 것을 포함하는 환경을 보유하기 때문에 동일한 개발환경을 가질 수 있다.

소스코드가 실행되기 위한 개발환경을 맞추기 위해 따로 버전 수정을 할 필요도 없고 종속성을 관리할 필요가 없어진다.
만약 NodeJS기반 애플리케이션을 실행시킨다고 가정했을 때, 해당 소스코드가 실행되기 위한 NodeJS버전을 고정시킴으로써, 이전 버전들과의 충돌을 막을 수 있다.

작업하는 프로젝트가 여러개인 경우, 버전 간의 충돌을 위한 관리를 할 필요가 없다.

A 프로젝트에서는 Python ver.2를 사용하고 B 프로젝트에서는 최신 버전의 Python을 사용한다고 가정하였을 때, 프로젝트를 전환할 때마다 버전을 변경해주어야 한다. 버전을 전환하는 경우는 기존 버전을 제거하고 사용하려는 버전을 설치해야 하기 때문에 버전 변경 과정이 굉장히 귀찮아진다.

위와 같은 번거로움을 도커와 컨테이너가 도와준다.
각 버전을 컨테이너에 보유하고, 각각의 프로젝트는 그들만의 컨테이너가 존재하기 때문에, 프로젝트를 전환하면 해당 개발환경으로 그대로 작동될 수 있다.
호스트 컴퓨터가 아니라 컨테이너에 모든 것이 있기 때문에, 버전 변경을 위해 제거와 설치의 과정을 거칠 필요가 없어지는 것이다.

 

버츄얼 머신 vs 컨테이너

재현 가능한 환경적 문제를 꼭 컨테이너로 해결해야 하나? 버츄얼 머신으로도 충분히 환경을 캡슐화하여 해결할 수 있지 않을까?
버츄얼 머신과 컨테이너를 비교해보고 왜 컨테이너를 고려해야하는지에 대한 이유를 자세히 알아보자.

 

버츄얼 머신에서의 문제

1. 가상 운영체제를 지닌 여러 버츄얼 머신에서 발생하는 오버헤드.
-> 버츄얼 머신은 결국 우리의 컴퓨터 위에서 실행되는 스탠드얼론 컴퓨터와 같다.
이러한 머신이 여러대가 있다면 매번 새로운 컴퓨터를 머신 내부에 설치해야 하고 이는 우리의 메모리, CPU, 하드 드라이브의 공간을 낭비하게 된다. 따라서 시스템에 VM의 개수가 늘어난다면 오버헤드 문제가 발생한다. 또한 호스트 시스템 위에 추가 시스템이 실행되는 것이기 때문에 성능 저하가 발생한다.
2. 중복 복제, 낭비되는 공간이 발생한다.
-> 예를 들어서 시스템에 설치된 모든 VM이 리눅스를 사용한다면 모든 머신에 리눅스가 별도로 설치되어있을 것이다. 이는 당연히 많은 공간을 낭비하게된다.
3. 원하는 모든 시스템에 버츄얼 머신을 설정해야 하고 동일한 방식으로 구성해야 하기 때문에 까다로울 수 있다.

즉 VM은 컴퓨터 자체를 캡슐화하여 사용하는 것이기 때문에 시스템에서 VM을 설치하게 된다면 호스트의 운영체제에 많은 영향을 미칠뿐더러 속도가 느리고 디스크 공간을 많이 차지하게 된다는 단점이 있다.

 

DockerContainer를 사용하게 된다면?

컨테이너를 사용하게 되면 호스트의 운영체제가 존재하는 것과는 별개로 하나의 머신에 몇 대의 머신을 설치하지 않는다.
대신 운영체제가 기본적으로 내재하거나 컨테이너 에뮬레이트를 지원하는 내장 컨테이너를 활용하게 된다.(이는 도커를 통해서 작동된다)
그리고 도커 엔진(Docker Engine) 도구를 실행하여 컨테이너를 가동할 수 있다. 즉 도커 엔진은 하나의 도구이며, 이를 통해 여러 개의 컨테이너로 분리할 수 있다.
또한 각각의 컨테이너 내부에는 작은 운영체제 레이어가 있을 수 있지만, VM에 설치하는 것보다 훨씬 가볍고 작기 때문에 VM에 비하면 성능 면에서 아주 뛰어나다.
또한 구성 파일을 통해 컨테이너를 구성하며 컨테이너를 설명할 수 있는데 이 파일을 다른 사람들과 공유할 수 있으며 재생산될 수 있다.
즉 VM과 비교했을 때 컨테이너의 장점은

  1. 운영체제와 시스템에 미치는 영향이 적기 때문에 매우 빠르다.
  2. 최소한의 디스크 공간을 사용하며 이미지와 구성 파일을 통해 공유, 재구축 및 배포가 쉽다.
  3. 앱에 필요한 모든 것을 캡슐화하여 보관할 수 있다.





반응형

댓글