웹/Container

[Docker] 컨테이너란? 컨테이너는 왜 사용하는가?

highlaw00 2024. 7. 16. 15:24

컨테이너란?

컨테이너란, 애플리케이션 코드, 그 코드의 종속성(라이브러리, 패키지), 그리고 런타임을 담고 있는 가상환경이다.

 

컨테이너를 왜 사용하는가?

컨테이너를 사용하지 않고 로컬 개발 환경을 구축한다고 생각해보자. 일반적으로 Node나 Python, Java와 같은 런타임을 설치해야하고, 그것을 활용하는 애플리케이션 코드가 MySQL이나 MongoDB 같은 데이터베이스에 트랜잭션 요청을 보내며 로직을 수행하기 때문에 그러한 데이터베이스도 개발 환경에 설치해야한다.

 

만약 이러한 프로젝트가 동일한 환경에 여럿 필요하다고 가정해보자. 어떤 프로젝트는 Node20을 사용해야 하고, 어떤 프로젝트는 Node14를 사용해야 하는 등 종속성 문제에 직면하게 된다. 더 나아가 Node20을 사용해 개발하다가 Node14를 사용하는 프로젝트를 개발하려고 하려면 Node20을 삭제하고 Node14를 재설치하는 개발 외적인 부분에서 오버헤드가 발생한다.

 

이런 문제는 개발 환경 뿐 아니라 프로덕션 환경에서도 마찬가지이다. 프로덕션 환경에 개발을 마친 애플리케이션을 배포하려고 하는데, 런타임이나 라이브러리 등의 버전이 잘못 설치되어 배포되지 않으면 큰 리스크와 오버헤드로 되돌아온다.

 

컨테이너를 사용하면 이러한 리스크를 최소화 해줄 수 있다.

컨테이너라는 가상환경에 Node20을 설치하고, MySQL 8을 설치하고, 그 외 애플리케이션 코드를 적재한 뒤 그것을 하나의 이미지로 만들어 어떤 PC에서든 동일한 동작을 수행할 수 있도록 할 수 있는 것이다.

 

또한 이렇게 컨테이너로 만든 가상환경은 서로 완전히 독립적이다. 가상환경 간의 독립성은 물론이고 가상환경과 호스트 머신과의 독립성도 보장해준다. 다이어그램을 보면 이해가 될 것이다.

 

좌측이 바로 Docker를 사용했을 때의 PC 아키텍처를 나타낸 그림이다.

 

요약하자면 다음과 같은 이유로 컨테이너를 사용한다.

  • 컨테이너를 사용함으로써 애플리케이션이 원하는 동작을 언제나 동일하게 수행할 수 있도록 한다.
  • 종속성의 버전이 다르거나 런타임의 버전이 달라 발생할 수 있는 실행 결과의 차이를 컨테이너를 사용해 완전히 없앨 수 있다.
  • 여러개의 프로젝트를 작업하는 경우에도 로컬 머신에 여러 종속성이나 런타임이 필요할 수 있는데 이를 컨테이너로 해결한다.

 

VM vs. 컨테이너

 

컨테이너와 비슷하게 가상환경을 제공하는 기술로 VM이라는 기술이 존재한다. 컨테이너와 VM의 다른점은 다시 한번 아키텍처 다이어그램을 보며 설명해보겠다.

 

좌측이 컨테이너 환경, 우측이 VM 환경을 나타낸 아키텍처 다이어그램이다.

 

VM을 사용하면...

  • VM은 호스트의 OS를 사용하지 않고 VM 자체의 OS를 사용한다.
  • 따라서 하나의 VM은 하나의 OS를 차지하게 되며, 이는 매우 큰 오버헤드를 발생시킨다.
  • 물론, 각 환경이 개별 OS를 가지기 때문에 Host OS-independent한 작업이 필요한 경우 VM 기술을 사용한다.

 

컨테이너를 사용하면...

  • 컨테이너는 호스트(로컬 머신)의 OS 커널을 공유한다. (컨테이너 자체는 Linux 위에서 동작하지만, 커널은 Host의 것을 사용한다)
  • 즉, 각 컨테이너는 각각의 OS를 가지지 않는다. 따라서 VM에 비해 OS로 인한 오버헤드가 적은 편이다.

 

이러한 이유로 VM대신 컨테이너를 사용하며 수많은 컨테이너 기술 중 많은 편의 기능을 제공하는 Docker가 사실상 업계 표준이 되어 사용되는 중이다.