🥞 BE
home

컨테이너

Docker를 알기전에 우선 컨테이너의 개념을 알아야 한다.
컨테이너(container)란, 공통 기능 세트를 충족하는 단일 호스트에서 실행되는 격리된 프로세스 그룹이며, 이런 기능 중 일부는 Linux 커널에서 찾을 수 있다.

어떻게 도커 컨테이너를 격리시키는가

이를 위해서는 Linuxcgroup(control groups)네임스페이스(namespaces)에 대해 알아야 한다.

Linux Namespaces(ns)

네임스페이스는 2002년 리눅스 2.4.19와 함께 도입된 리눅스 커널 기능이다. (도커 역시 리눅스 커널 기능을 이용해 컨테이너를 격리한다.) 이 기능은 추상화 계층에서 특정 전역 시스템 리소스를 래핑하는 것이다. 이렇게 하면 네임스페이스 내의 프로세스에 리소스의 자체 격리 인스턴스가 있는것처럼 보이게 할 수 있으며, 쉽게 말해 네임스페이스의 주요 기능은 프로세스를 서로 격리한다는 것인거다.
개발자는 컨테이너를 사용하면 완전한 VM처럼 보이고 느껴지는 격리된 환경을 제공하지만, 사실 VM이 아니라 어딘가에 있는 서버에서 실행 중인 프로세스이며, 두 개의 컨테이너를 시작하면 어딘가의 단일 서버에서 두 개의 프로세스가 실행되고 있지만 서로 격리되어 있는 것이다.
현재 사용 가능한 네임스페이스는 여러 개의 고유한 네임스페이스(mnt, pid, net, ipc, uts, user 등)가 구현되어 있다.
user : root가 같은 사용자 공간 내에서 권할을 가질 수 있게 된다.
pid : 다른 네임스페이스의 pid세트로부터 독립적인 프로세스의 pip세트를 할당한다.
net : 독립적인 네트워크 스택을 가지고 자신의 개인 라우팅 ip 주소 세트 테이블, 소켓 연결 테이블, 방화벽, 기타 네트워크 관련 자원 추적 목록을 가질 수 있다.
mnt : 호스트 파일 시스템에 영향을 주지 않고 마운트 네임스페이스에서 파일 시스템을 마운트 및 언마운트 할 수 있다.
ipc : 자신의 ipc자원이 아닌 posix 메시지 큐이다.
uts : 하나의 시스템이 다른 프로세스에 다른 호스트 및 도메인 이름을 가지고 있는 것처럼 보일 수 있다.

cgroup

제어 그룹(cgroup)은 프로세스 모음의 리소스 사용량(CPU, 메모리, 디스크 I/O, 네트워크 등)을 제한, 설명 및 격리하는 리눅스 커널 기능이며, 아래와 같은 기능이 있다.
리소스 제한: 프로세스가 사용할 수 있는 특정 리소스의 양을 제한하도록 cgroup을 구성할 수 있다.
우선 순위: 리소스 경합이 있을때 다른 cgroup의 프로세스와 비교하여 프로세스가 사용할 수 있는 리소스의 양을 제어할 수 있다.
회계: 리소스 제한은 cgroup 수준에서 모니터링 되고 보고된다.
제어: 단일 명령으로 cgroup에 있는 모든 프로세스의 상태(고정, 중지, 다시시작)를 변경할 수 있다.
쿠버네티스 환경에서 cgroup을 사용하여 포드 수준에서 리소스 요청 및 제한, 해당 QoS 클래스를 구현할 수 있다.

Linux 컨테이너(LXC)와 Docker 컨테이너의 차이점은 무엇인가

위 내용만 봐서는 도커는 리눅스의 nscgroup을 사용해서 구축했기 때문에 큰 차이가 없을거 같지만 목적이 다르다. LXC는 OS 컨테이너화에 중점을 두는 반면 Docker 컨테이너는 애플리케이션 컨테이너화에 중점을 둔다. 또한 LXC는 다목적 운영체제의 가상화이며, 도커는 단일 목적 애플리에키션의 가상화이다.