안녕하세요! IT Window 킷도우입니다.
도커 컨테이너란 무엇인가에 대해서 오늘 한 번 알아보려고 하는데요!
도커에 대해서 알아보긴 전 우리가 알아봐야할 것은 바로 이 컨테이너란 무엇인가 입니다.
우리가 흔히들 얘기하는 3티어(front-end, back-end, Database) 환경에서는 이 컨테이너를 보통 WAS에 설치하는 JEUS, tomcat 어플리케이션을 일컫는데 컨테이너라는 말을 자주 사용했습니다. 우리는 JEUS라는 제품을 하나 설치하여 이 JEUS 안에 각기 다른 역할을 하는 고유의 컨테이너들을 설치하고 운영할 수 있었습니다. 가령 하나의 제우스 안에 콜센터 전용 컨테이너, 주문 전용 컨테이너 등을 각각 만들어 운영 관리할 수 있었죠.
(재기동할 때 : jdown 콜센터app, jboot 콜센터app, jdown 주문app etc..)
이제 우리는 잠깐 우리가 기존에 알던 이 컨테이너의 틀을 벗어나 좀 더 확장한 개념으로써 컨테이너라는게 도대체 왜 필요하게 된 것인지 그 이유를 알 필요가 있습니다. 이 이유를 알기 위해선 우리가 어플리케이션을 서버에서 어떻게 관리해왔냐에 대한 역사를 알 필요가 있습니다.
1. App 관리 초창기
사실 초창기라고 할 것도 없습니다. 보통의 프로그래밍 입문자들은 예를들어 웹 개발을 한다고 했을 때, 보통 로컬 PC에 DB 서버를 구축하고, 또 Tomcat 서버를 설치하고 기타 서비스에 필요한 모듈들을 설치합니다. 그리고 콜센터 프로그램, 주문 프로그램 등을 한 개의 PC에서 관리 개발하죠. 이렇게 관리하게 되면 문제점이 뭘까요?
1) 콜센터 프로그램이 부하를 받는데 주문 프로그램까지 영향을 미칠 것입니다. 콜센터 프로그램에 트래픽량이 증가하게 되면 물리적으로 CPU, RAM 사용량이 높아질 것이고 이에 따라 주문 프로그램도 속도가 느려지는 것이죠.
2) DB에서 부하가 발생한 것인지, WEB/WAS에서 부하가 발생한 것인지 확인하는데 시간이 많이 걸립니다.
뭔가 이들을 각각 분리해서 운영해야 할 필요성이 상당히 느껴집니다.
2. 가상화, 하이퍼 바이저(Hypervisor)
네 우리가 흔히 회사에서 서버를 운영할 때 위와 같은 구성으로 시스템들을 운영하는데요. 바로 하이퍼바이저를 이용해 한개의 하드웨어를 물리적으로 완벽히 분리, 독립시켜 여러개의 VM(가상 머신)을 만들어 줌으로 위 1번의 문제들을 완벽히 해결해줍니다. 콜센터 프로그램에 과부하가 걸린다고 해도 주문 App은 물리적으로 완벽히 독립돼 있기에 영향을 받지 않습니다. 또한 부하 발생 포인트를 WEB/WAS/DB 중 부하가 발생됐다면 개별 서버의 CPU, RAM 사용량을 통해 금방 확인해 낼 수 있습니다.
이러한 특성 때문에 지금껏 Hypervisor 기반으로한 VM 운영이 굉장히 인기였는데요. 이를 대체하고 있는 컨테이너 기술이 뜨겁습니다. 왜 세계적인 기업들 뿐만 아니라 네카라쿠배 등 많은 기업에서 이 컨테이너 기술로 APP들을 운영할까요?
3. 컨테이너(Container)
이제 컨테이너로 구축된 시스템을 봐보겠습니다. 기존에 Hypervisor로 물리적으로 완벽히 분리시킨 VM(가상 머신)을 만들어 운영했다면 컨테이너는 VM과 마찬가지로 완벽히 독립된 Application 시스템을 구성케 합니다. VM과 Container의 가장 큰 차이는 VM 은 개별로 OS를 할당시켜 동작시키지만 CONTAINER는 OS가 없죠. OS라는게 없기에 시스템 구성이 전반적으로 가벼워 보입니다. 도대체 어떻게 컨테이너는 한개의 OS위에서 완벽히 독립된 App을 구성할 수 있는걸까요? 바로 리눅스의 엄청난 기능들을 활용하기 때문입니다.
컨테이너를 완벽히 독립된 영역으로 구사할 수 있는 이유
1) namespace - 파일 시스템 마운트, 네트워크, 유저, 호스트 네임 등에 대해 독립 뷰 제공
2) cgroup - cpu, memory, 네트웍 대역 제한
3) union mount - 여러 파일시스템을 마운트할 수 있음
컨테이너 런타임(Container Runtime) VS 하이퍼바이저(Hypervisor)
1) BORA(Build Once, Run Anyware) : 한 번 빌드한 도커 이미지는 어느 환경에서나 동작한다는 의미입니다. 가령 우리가 하이퍼바이저 환경에서 WAS서버를 1대 증설하여 2중화 구성을 한다거나 또는 물리적으로 다른 서버로 이전해야 하는 경우가 생겼을 때를 가정해 봅시다. 기존에 1대 세팅했던 것을 참조하며 100% 그대로 재현, 구현해줘야 하는데요. 컨테이너 환경에서는 도커 이미지만 그대로 다운받아 배포해주면 손쉽게 끝이 납니다.
2) 위에서도 언급 드렸듯 OS 위에서 동작하는 것이 아니기 때문에 관리 포인트가 줄고, 재기동하기 쉬우며, 가볍습니다.
사실 대부분의 기업들은 하이퍼바이저 기반의 인프라를 구축하여 운영하고 있을텐데요. 사실 단순히 1), 2)번 이유만으로 기존의 시스템을 컨테이너화해서 운영해야겠다! 라고 needs를 못 느낄 것입니다. 지금 잘 쓰고 있는데 굳이? 라는 생각이 들텐데요. 그렇다면 언제? 시스템을 컨테이너화 해야될 필요를 늘낄까요?
역시나 대용량 트래픽을 처리해야하는 시스템에서 필요성이 있을 것 같습니다. 트래픽이 과부하될 경우 오토스케일 아웃 트리거를 걸어서 서버를 3중화 4중화 N중화하여 늘릴 때 필요할 듯 합니다.
근데 이미 클라우드에서도 VM 환경에서 오토스케일 아웃을 지원 합니다. 단 VM에 대한 오토스케일 아웃은 역시나 OS를 기동해야 하기 떄문에 시간이 오래걸릴 것입니다. 컨테이너화해서 운영할 경우 컨테이너는 OS없이 어플리케이션을 기동하기에 속도가 매우 빠를 것입니다.
4. Docker(도커)
네 바로 이러한 컨테이너들을 실행하기 위한 환경(컨테이너 런타임) 및 툴킷이 바로 도커입니다.
다음 포스팅에서는 리눅스 환경에서 도커를 설치하고 도커 파일 작성, 도커 이미지 빌드, 도커 레지스트리로 이미지를 업로드하는 것까지 살펴보도록 하고 이만 포스팅을 마치겠습니다.
즐거운 주말되시길 바랍니다~
감사합니다.
댓글