컨테이너 (Container)
소프트웨어 마에스트로 14기 팀 프로젝트에서 나는 백엔드 파트를 담당하여 Spring Boot를 통한 WAS 개발을 하게 되었다. Docker를 우리 프로젝트에 도입하게 된다면 우리 프로젝트에 어떠한 이점이 있는 지 학습 차 게시글을 작성하게 되었다.
컨테이너 (Container)
컨테이너는 소프트웨어와 소프트웨어에 필요한 모든 요소(의존성)를 포함하는 소프트웨어 패키지이다. 의존성을 함께 패키징하였기 때문에, 애플리케이션의 실행 환경에 구애받지 않고 동일하게 작동할 수 있다. 컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해주며 컨테이너가 실제로 실행되는 환경에서 애플리케이션을 추상화할 수 있는 논리 패키징 메커니즘을 제공한다. 또한 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 것과 동일한 소프트웨어를 포함하고 있는데, 이렇게 함으로써 소위 내 컴퓨터에서는 잘 동작하는데?
하는 문제를 해결할 수 있다.
컨테이너의 이점
책임 분리
컨테이너화를 통해 책임을 깔끔하게 분리할 수 있다. 즉, 개발자는 애플리케이션의 로직과 종속 항목에 집중하고, IT 운영팀은 특정 소프트웨어 버전 및 구성과 같은 애플리케이션의 세부 요소 대신 배포 및 관리에 집중할 수 있다.
워크로드 이동성
컨테이너는 Linux, Windows, Mac 등의 운영체제를 가리지 않고, 가상 머신, 물리적 서버, 개발자 컴퓨터, 데이터 센터, 온프레미스 환경, 퍼블릭 클라우드 등 사실상 어느 환경에서든지 구동이 되므로 개발 및 배포가 매우 쉬워지게 된다.
애플리케이션 격리
컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 가상화하므로 개발자에게 다른 애플리케이션으로부터 논리적으로 격리된 OS 환경을 제공한다.
컨테이너와 VM(Virtual Machine)의 차이
VM은 기본 하드웨어에 대한 액세스 권한을 갖는 호스트 운영체제 위에서 Linux 또는 Windows 같은 게스트 운영 체제를 실행하는 개념이다. 가상화(Virutalization)와 컨테이너는 자주 비교되는 개념이기 때문에 이해를 하고 넘어가면 좋을 것 같다.
서버 가상화는 하드웨어에서 전체 컴퓨터를 재생성하며, 이는 다시 전체 OS를 실행한다. OS는 하나의 애플리케이션을 실행하는데, 이는 전혀 가상화가 없는 것보다는 효율적이지만, 실행하고자 하는 애플리케이션마다 불필요한 코드와 서비스를 여전히 복제한다.
컨테이너는 가상 머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 종속 항목과 함꼐 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련한다는 점에서는 동일하다. 하지만 애플리케이션 및 해당 애플리케이션이 의존하는 소프트웨어 라이브러리 및 환경 변수 등만을 실행하면서 기반 OS 커널을 공유한다. 조금 더 쉽게 비교해보면 아래와 같은 점에서 차이가 있다.
- 컨테이너는 VM보다 훨씬 더 경량이다.
- 컨테이너는 OS 수준에서 가상화되고 VM은 하드웨어 수준에서 가상화된다.
- 컨테이너는 OS 커널을 공유하며 VM에 필요한 것보다 훨씬 적은 메모리를 사용한다.
컨테이너의 용도
컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다. 이러한 분리를 통해 프라이빗 데이터 센터나 퍼블릭 클라욷, 심지어 개발자의 개인 노트북에 이르기까지 어떤 환경으로든 컨테이너 기반 애플리케이션을 쉽게 지속적으로 배포할 수 있다.
컨테이너 기술은 Docker를 통해 대중화되었고, Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼이 함께 발전하면서, 소프트웨어 개발과 배포 방식을 혁신적으로 변화시켰다.
민첩한 개발
컨테이너를 사용하면 개발자가 종속 항목과 환경에 미치는 영향을 신경 쓰지 않고 훨씬 더 빠르게 개발을 진행할 수 있다.
효율적인 운영
컨테이너는 경량이며 필요한 컴퓨팅 리소스만 사용하면 되기 때문에, 애플리케이션을 효율적으로 구동할 수 있다.
폭넓은 구동 환경
컨테이너는 거의 모든 곳에서 구동할 수 있다. 소프트웨어 구동 환경이 무엇이든 컨테이너를 사용할 수 있다는 의미이다.