이것저것 기록

[Docker] 도커 컨테이너의 동작 원리 (LXC, namespace, cgroup) 본문

Data Science/New Tech

[Docker] 도커 컨테이너의 동작 원리 (LXC, namespace, cgroup)

anweh 2021. 6. 6. 16:56

0. 도커 컨테이너란?

  • 도커 이미지와 연결지어 정의한다면, 도커 컨테이너는 이미지가 실행된 형태이다. 
  • 도커 이미지를 running하면 그 이미지를 동작시킨 컨테이너가 생성되는 것. 
  • 즉, 이미지로 여러 개의 컨테이너를 만들 수 있다. 

 

 

1. 컨테이너의 격리 환경 동작 원리 

  • 도커의 컨테이너 기술은 리눅스의 컨테이너 (LXC)를 활용한 기술로, 컴퓨터에 독립적인 컴퓨팅 공간을 만들어낸다. 이는 기존의 VM (가상머신)과 비교하여 가상환경 구조에 근본적인 차이가 있다. 아래 그림을 보면, 좌측의 VM은 환경 자체 (OS)를 가상화 해버리는 반면, 도커 컨테이너는 호스트 OS의 커널을 공유하며 단순히 하나의 격리되어 있는 프로세스로써 동작한다. 

출처: https://cloud.google.com/containers/?hl=ko

 

그렇다면 동일한 OS 환경에서 어떻게 다수의 프로세스가 커널을 공유함과 동시에 가상화가 될 수 있는 것인가? 

 

  • 도커는 컨테이너라는 가상의 '격리 환경'을 만들기 위해 리눅스의 namespacecgroup이라는 기능을 사용한다. (namespace와 cgroup으로 만들어진 컨테이너를 LXC라고 부른다)
    • namespace: 프로세스를 독립시켜주는 가상화 기술이다. 각 컨테이너에서 실행된 프로세스가 시스템(user, 파일, 네트워크, 호스트명, 프로세스)등에 대해 독립할 수 있게 해준다. 
    • cgroups: 자원(CPU, 메모리, network bandwidth)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다. 

 

 

2. namespace와 cgroup 

2.1 namespace

  • 프로세스 별로 리소스 사용을 분리한다.
  • VM에서는 각 게스트 별로 독립적인 공간을 제공하고 충돌하지 않도록 Hardware Resource 자체를 가상화한다. 
  • 하지만 namespace의 경우, Hardware Resource 자체를 가상화하는 것이 아니라, Linux 내의 자원을 가상화한다.
    • pid name spaces : 프로세스 격리 처리 (독립된 프로세스 공간 할당)
    • net name spaces : 네트워크 인터페이스 
    • ipc name spaces : IPC 자원에 대한 엑세스 관리
    • mnt name spaces : 파일 시스템 포인트 관리
    • uts name spaces : host name 할당
  • 도커에서 cenetos:latest 이미지를 컨테이너로 실행하고, ps 상태를 확인해보자. ps 명령어는 현재 시스템에서 돌고 있는 프로세스를 보여주는 가장 기본적인 명령어이며, 아래처럼 현재 실행중인 프로세스의 목록을 출력해준다. ps 상태를 보면 1번에 /bin/bash와 같이 쉘이 PID1번으로 설정되어있다. 
$ docker run -it --name study centos:latest
$ [root@4e1d03de5820 /]# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:42 pts/0    00:00:00 /bin/bash
root        15     1  0 07:42 pts/0    00:00:00 ps -ef

 

2.2 cgroup

  • Control Groups의 약자로 프로세스들이 사용할 수 있는 컴퓨팅 자원들을 제한하고 격리시킬 수 있는 리눅스 커널의 기능이다. namespace와 더불어 도커 컨테이너에서 완벽한 격리 환경을 만드는 데에 쓰이는 중요한 기능이다. 
  • cgroup를 이용하면 다음 자원들을 제한할 수 있다
    • 메모리
    • CPU
    • Network
    • Device
    • I/O
  • 아래의 그림을 보자. cgroup 은 컴퓨터의 자원(CPU, 메모리, network, storage I/O)가 각 프로세스 별로 독립적으로 격리되어 할당한다.  

출처: https://medium.com/@paccattam/drooling-over-docker-1-the-genesis-d4e01ab8c6cf

 

 

즉, 도커는 프로세스를 격리하고, 프로세스에 필요한 컴퓨팅 자원을 독립적으로 할당/격리하여 완벽히 격리된 가상 환경을 구축하게 해준다. 

Comments