리눅스, 유닉스 환경에서의 컨테이너
도커 컨테이너를 이해하기 위해서는 먼저 리눅스 컨테이너를 이해할 필요가 있습니다.

리눅스, 유닉스 환경에는 chroot 명령이 있습니다. chroot를 간단히 설명하자면 루트 디렉터리인 '/' 를 변경하는 명령어입니다. 


chroot를 통해 특정 경로의 디렉터리를 루트 디렉터리로 설정하게 되면 chroot 감옥(chroot jail)이 생성되는데, chroot jail은 chroot로 생성된 루트 디렉터리 안에서는 그 밖의 파일 및 디렉터리 자원에 접근할 수 없는 환경을 말합니다. 따라서 chroot는 디렉터리 경로를 격리시킴으로써 데이터 유출 및 피해를 최소화 하는데 사용되었습니다.



리눅스 컨테이너 등장
chroot는 chroot jail 환경 안에서 필요한 라이브러리를 미리 준비해야 하고 설정 방법 또한 복잡했습니다. 그리고 완벽한 가상 환경이 아니었기 때문에 여러가지 제약이 따랐습니다.

그래서 등장한 것이 리눅스에서 제공하는 LXC(Linux Container) 라는 시스템 레벨의 가상화입니다. LXC는 리눅스 커널 레벨에서 제공되는 격리된 가상화 공간입니다. 그런데 가상머신과는 다르게 컴퓨터나 OS 자체를 가상화하지는 않기 때문에 컨테이너 라고 부릅니다.



리눅스 커널에서 cgroups(Control Groups)는 CPU, 메모리, 보조기억장치, 네트워크 등의 자원을 할당되는 가상화 공간을 제공합니다. 그리고 process tree, 사용자 계정, file system, IPC 등을 격리시켜서 Host OS와 완벽하게 격리된 공간을 만드는데 이를 namespaces(Namespace isolation) 이라고 합니다.

즉 LXC는 리눅스 커널의 cgroups와 namespaces를 이용하여 격리된 공간입니다.



도커 컨테이너(Docker Container)
앞서 말한 LXC는 격리된 환경을 제공하기는 했으나, 실질적으로 그안에서 서비스를 운영하기 위한 기능이 부족했습니다.

(https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/)


그러나 도커 컨테이너는 cgroups와 namespaces를 기반으로 하면서도 이미지와 컨테이너 관리 등의 다양한 기능들을 제공함으로써 실질적으로 필요한 기능들을 제공합니다.

도커의 처음 개발 당시에는 LXC를 기반으로 구현했지만 0.9버전부터는 libcontainer를 개발하여 사용하고 있습니다. 내부적으로 실행 드라이버라고 하는데, libcontainer는 native, LXC는 lxc로 표기됩니다. 실행 옵션에 따라 무엇을 사용할지 선택할 수 있습니다.


참고서적
가장 빨리 만나는 Docker(이재홍 저)

연관글


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!