skip to Main Content

도커와 컨테이너 제대로 알기

도커(docker) 컨테이너 기술이 흐름으로 받아지면서 도커 기술에 대한 관심이 갈수록 커지고 있다. 도커에 대해 많이 들어봤으나 모르고 지나칠 수 있는 부분과 혼동하기 쉬운 부분에 대해 정리해보도록 하겠다.

혼동하기 쉬운 용어

가장 혼동하기 쉬운 오류는 “컨테이너” 라는 용어와 “도커” 를 같은 개념으로 생각하는 것이다. 가상화(VM)가 Vmware가 아니듯 컨테이너도 도커뿐만 아니라 다양한 종류의 컨테이너 기술이 존재한다.
도커는 컨테이너 기술 중 하나이다. 초기 도커 기술은 LXC 기술을 기반으로 구축되었으나 현재는 종속 관계를 벗어났다.

기존 Linux Container와 Docker 비교

하지만 다수 사용자는 기존 LXC와 연결지어 생각하고 있다. LXC는 경량의 가상화 방법으로 탄생하였지만 사용자에게 큰 반응을 얻지못했다. 그에 비해, 도커 기술은 컨테이너를 생성 및 구축, 이미지 전송, 이미지 버전 관리 방법에 있어 많은 사용자 호응을 얻었다.

LXC 는 다중 프로세스를 관리할 수 있는 init 시스템을 사용하며, 전체 애플리케이션을 하나로 실행할 수 있다. 도커는 애플리케이션이 개별 프로세스로 세분화되도록 하며 이를 수행할 수 있도록 제공한다. 이 세분화된 접근 방식에는 이점이 있다.

도커 이미지 파일은 각각 계층으로 이루어져 단일 이미지로 결합된다. 만약 이미지가 변경되면 계층이 생성되고, 사용자가 실행, 복사 명령을 지정할 때마다 새 계층이 생성된다. 새로운 도커 컨테이너를 구축할 때 이전 계층을 재사용하여 구축이 빠르게 진행된다. 중간 변경 사항이 있다면 변경 내용이 공유되며 개선된다. 버전 관리는 계층화와 관련이 있어 변경 사항이 새롭게 발생할 때마다 내장 변경 로그가 기본적으로 적용된다.

도커 이외의 컨테이너

– Java 컨테이너 :  Jetty, Tomcat, Wildfly 및 Springboot 등 독립 실행 형 Java 응용 프로그램을 사용할 수있는 컨테이너 기술. 외부 Java 환경이 필요하지 않고 실행할 수있는 Java 응용 프로그램 컨테이너이다.

Unikernels : 런타임시 컨테이너에 필요한 리소스를 최적화하도록 설계되어있다. 런타임에 필요한 시스템 기능만 단일 이미지로 패키징 할 수 있다. Docker 컨테이너와 달리 Unikernels는 호스트 OS 또는 외부 라이브러리 없이 자체적으로 부팅 및 실행할 수 있다. Docker 컨테이너는 외부 리소스와 호스트 환경에 의존하여 실행되지만 Unikernels는 복잡성을 줄이고 이식성을 향상시키며 응용 프로그램의 공격 대상을 감소시킬 수 있다.

LXD : Ubuntu Linux를 따르는 회사의 컨테이너 플랫폼. LXD 컨테이너는 기존 VM과 동일한 도구로 구축 및 운영되지만 컨테이너와 비슷한 런타임 성능을 구현하고 VM에 대한 사용률을 향상시킬 수 있다.

– OpenVZ : 완전한 운영 체제를 실행하기 위한 컨테이너 플랫폼. 호스트 및 게스트 OS가 모두 Linux를 실행해야 하지만 Linux 컨테이너와 같은 호스트 OS 커널을 공유하므로 기존 하이퍼 바이저보다 훨씬 빠르고 효율적이다. 그래서 기존의 가상 시스템 하이퍼 바이저와 다르다. OpenVZ는 2005년부터 오늘날에도 사용되는 가장 오래된 컨테이너 플랫폼 중 하나이다. 

– Rkt : 로켓 컨테이너(Rkt)는 초기 버전 Docker 보안 취약점을 해결하기 위해 CoreOS에서 탄생한 컨테이너다. CoreOS는 Docker의 초기 취약점을 오랫동안 해결해왔으며 2014년에 컨테이너 혁신을 추진하기 위해 App Container 사양 (appc)을 게시했다.

– Windows Server Containers :  Windows Server는 Linux 컨테이너의 이점을 Microsoft 워크로드로 가져 왔다. Microsoft는 Windows 운영 체제에 컨테이너 기술을 사용하도록 다시 설계하고 Docker와 긴밀하게 협력하여 Docker 관리 도구 사용할 수 있도록 하였다. 현재는 Server 2016 또는 Azure에서만 실행되고 있다.

컨테이너 표준은 도커

도커는 이미지 파일을 계층화하여 속도와 관리 측면에서 상당한 이점을 가지게 되었다. 이러한 장점으로 롤백이 더 간단해졌으며 지속적인 통합 및 연속배포(CI/CD)를 수행하는 데 큰 도움을 주게 되었다. 도커 기술의 효용성은 세분화된 마이크로서비스 아키텍쳐와 잘 어울린다.

마이크로서비스 아키텍쳐가 관심을 받으면서 자연스럽게 도커 기술 또한 흐름으로 받아지게 되었다. 하지만 도커는 많은 장점을 가진 기술이지만 단점도 존재했다. 도커는 단일 컨테이너 관리에 적합하도록 설계되어 있다. 세분화된 컨테이너와 컨테이너화된 앱이 늘어날 수록 관리 포인트가 늘어나 운영에 어려움을 겪게 된다.

세분화된 컨테이너를 그룹화하여  네트워킹, 보안에 적합하도록 구성하면서 신속한 배포가 장점인 도커 기술을 극대화할 수 있는 컨테이너 자동 확장 기능을 가진 오케스트레이션 툴이 필요하게 되었고 그 툴이 Kubernetes 이다.

kubernetes는 구글의 내부 컨테이너 서비스(Borg)를 오픈소스화 시킨 버전이다. 구글은 일찍부터 내부 클라우드 환경에서 컨테이너를 활용하고 있었고 kubernetes는 이러한 노하우로 만들어진 운영 솔루션이다. 

[참고]lxc  (https://linuxcontainers.org/ko/lxc/introduction/)

Back To Top