본문 바로가기
개발 기초/Docker

컨테이너 기술

by mozzi329 2022. 10. 6.
728x90

📌 컨테이너

부산항, 인천항과 같은 무역항에 가장 흔히 볼 수 있는 풍경 중 하나는, 대형 트럭이 컨테이너를 싣고 부두를 왔다 갔다 하는 장면이다. 이러한 컨테이너는 대형 화물선에 실려서 다른 무역항으로 이동한다.

컨테이너는 장점이 많다.

  • 물자를 싣고 내릴 때에, 선박이 입항해 있는 시간을 획기적으로 단축시켜준다
  • 물자를 싣고 내릴 때 필요한 인력(분류하는 사람, 짐 옮기는 사람, 감독하는 사람)을 대폭 감소시킨다

 

 

"물자의 수송에 획기적인 단축을 가져다 준 컨테이너 기술을 소프트웨어 수송, 즉 배포 에 사용할 수는 없을까?" 

그 결과, 리눅스 컨테이너(lxc)라는 것을 만들어내기에 이르렀다. 리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만, 애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었다. 2013년에 등장한 도커(Docker)는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고, 그 결과 개발자들은 쉽게 애플리케이션을 포장하고, 컨테이너 방식으로 실행할 수 있게 되었다.

 


의존성 충돌 문제를 해결 해준다.

어떤 애플리케이션은, 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어 있어야 한다. 쉽게는 윈도우용 프로그램을 실행하려면 윈도우 운영체제가 필요하듯 말이다. 이와 같이 어떤 프로그램(A) 실행에 다른 프로그램(B)이 반드시 필요한 경우, "프로그램 A는 프로그램 B에 의존 관계를 가지고 있다"고 말한다.

 

프로그램 A가 버전 7의 프로그램 B를 요구하고 있고, 또 프로그램 C가 버전 5.7의 프로그램 B를 요구한다고 가정해보자.

일반적으로 한 컴퓨터에 여러 버전의 동일한 애플리케이션이 설치되지 않으므로, 이 경우, 의존 관계를 가지고 있는 다른 두 애플리케이션 중에 하나는 제대로 된 실행을 보장할 수 없다. 이런 상황을 바로 "의존성이 충돌한다"라고 말한다.

 

컨테이너 기술은 바로 이 문제를 해결한다.

컨테이너 기술은 애플리케이션을 컨테이너 내에 구성한다. 즉, 컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있다는 이야기다. 이는 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에 가능한 것이다.

 


개발 배포 환경을 일치시킨다.

우분투 환경에서 어떤 프로그램을 설치하려면 

sudo apt-get install ...

과 같은 명령어로 설치한다.

 

반면, Mac OS 환경에서는 보통,

brew install ...

으로 프로그램을 설치한다.

단순한 명령어 차이지만 환경 구축을 위해 여러 프로그램을 설치하고 세팅해야만 하기 때문에 사소한 실수나 사전 설치 항목의 부재는 문제 해결에 많은 시간을 소모하게 한다.

 

도커는 이러한 문제를 해결해준다.

도커가 실행 중이라면, 어떠한 운영체제든 상관없이 통일된 명령어로 프로그램을 설치하고 실행할 수 있다.

docker run --name postgres -e POSTGRES_PASSWORD=mysecret -d postgres

위는 PostgerSQL을 실행하는 간단한 도커 명령어다.

 


수평적 확장(Scale-Out)을 쉽게 해준다.

수평적 확장은 간단하게 얘기해서 서버를 여러대 추가해서 옆으로 확장시킨다고 생각하면 된다.

서버의 자체적인 스펙을 업그레이드 시키는 것이 아니라 여러대의 서버 갯수를 늘리는 방법이다. 이렇게 똑같은 역할을 하는 인스턴스를 늘리면 기존에 잘 작동되는 것을 건드릴 필요가 없어서 무중단 배포가 가능해진다.

 

늘어나는 서버의 수마다 그에 따른 환경 세팅이 필요하다.

앞서, 프로그램 간의 의존 관계에 대해 말했다. 여기서 서버에 대한 환경 세팅은 이보다 훨씬 더 복잡하다. 특히나 전세계 사람들이 많이 사용하는 구글과 같은 글로벌 웹 서비스들은 발생하는 트래픽에 따라 서버의 확장이 재빠르게 진행되어야 한다.

 

컨테이너 기술을 사용하면 간단하게 서버를 증설할 수 있다. 

동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸런서에 이 서버를 추가하기만 하면 된다. (AWS는 서버를 만들고 삭제하는 일을 자동으로 해준다)

 

이러한 기술을 응용하여(격리성 +⍺),

새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능하다. 이를 통해 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인하고, 이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있다.

쿠버네티스와 같이 "오케스트레이션 도구"라고 부르는 것들이 이러한 일을 해주는 도구다. 이는 결국 컨테이너 기술 덕분에 가능한 것이다.

※ 오케스트레이션(Orchestration) : 컴퓨터 시스템과 애플리케이션, 서비스의 자동화된 설정, 관리, 조정을 의미한다.

 

가상화(VM) 기술 VS 컨테이너 기술

도커에서 사용하는 컨테이너 기술은 가상머신 기술과 약간 비슷하지만 경우가 좀 다르다.

  하이퍼 바이저형 가상화 컨테이너형 가상화
시작 시간 몇 분 몇 초
이미지 크기 수 GB ~ 수백 GB
OS를 포함하여 애플리케이션과 필요한 런타임 소프트웨어
~ 수백 MB
애플리케이션과 런타임 소프트웨어만
Guest OS Windows/Linux 등 다양한 선택 가능 호스트 OS 와 동일한 OS
이식성 대부분 가상 이미지에 대한 변환이 필요함 컨테이너 이미지 그대로 사용 가능
데이터 관리 VM 내부또는 연결된 스토리지에 저장 컨테이너 내부에 있는 데이터는 종료시 소멸되며, 필요에 따라 스토리지를 이용하여 저장
Guest OS 와의 관계 Guest OS는 하드웨어(가상)로 인식 Host OS를 커널 수준으로 분리하여 OS를 가상화 형태로 사용하여 필요에 따라 호스트와 리소스 공유 가능

 

 

댓글