Linux Containers
Q&A: Docker와 process의 관계는 무엇인가?
질문
Docker와 process의 관계는 무엇인가?
답변
Docker 컨테이너는 보통 격리된 프로세스 실행 환경으로 이해하는 것이 핵심이다. 컨테이너 안에서 실행되는 앱도 결국 호스트 리눅스 커널이 실행하는 프로세스다.
1
2
3
4
호스트 리눅스 커널
-> 컨테이너 A의 nginx 프로세스
-> 컨테이너 B의 app 프로세스
-> 호스트의 다른 프로세스
컨테이너는 VM처럼 자체 커널을 하나 더 부팅하는 방식이 아니다. 리눅스 컨테이너는 호스트 커널을 공유하면서, 프로세스가 보는 환경을 격리한다.
1
2
VM 가상 머신마다 OS와 커널이 있음
컨테이너 호스트 커널을 공유하고 프로세스 환경을 격리함
Docker는 이 격리와 실행을 다루기 쉽게 해주는 도구다. 이미지로 파일 시스템과 실행 구성을 묶고, 컨테이너로 프로세스를 실행한다.
1
docker run nginx
위 명령은 “nginx 이미지를 기반으로 격리된 실행 환경을 만들고, 그 안에서 nginx 프로세스를 실행”하는 것에 가깝다.
격리에는 리눅스 기능들이 쓰인다.
1
2
namespace 프로세스가 PID, 네트워크, 마운트 등을 따로 보는 것처럼 격리
cgroup CPU, 메모리 같은 자원 사용량을 제한하고 추적
컨테이너 안에서 프로세스 목록을 보면 자기 컨테이너 안 프로세스만 보이는 것처럼 느껴질 수 있지만, 호스트 관점에서는 그 프로세스도 실제 리눅스 프로세스다.
정리하면 다음과 같다.
1
2
3
process 실행 중인 프로그램
container 격리된 프로세스 실행 환경
Docker 이미지와 컨테이너 실행을 관리하는 도구
따라서 Docker와 프로세스의 관계를 잡을 때는 “컨테이너가 프로세스를 감싸 격리해서 실행한다”는 그림이 가장 중요하다.
Q&A: namespace와 cgroup은 무엇인가?
질문
namespace와 cgroup은 무엇인가?
답변
namespace와 cgroup은 리눅스 컨테이너를 이해할 때 핵심이 되는 커널 기능이다. Docker가 컨테이너를 만들 때도 이런 기능들을 이용한다.
간단히 나누면 다음과 같다.
1
2
namespace 프로세스가 보는 세계를 격리한다
cgroup 프로세스가 쓰는 자원을 제한하고 측정한다
namespace는 컨테이너 안의 프로세스가 자기만의 환경을 보는 것처럼 만든다.
예를 들어 컨테이너 안에서 ps를 실행하면 컨테이너 안 프로세스만 보이는 것처럼 느껴질 수 있다. 이것은 PID namespace와 관련 있다.
1
2
3
4
PID namespace 프로세스 ID 공간 격리
network namespace 네트워크 인터페이스, 라우팅 테이블 격리
mount namespace 파일 시스템 마운트 관점 격리
UTS namespace hostname 같은 식별자 격리
cgroup은 자원 사용량을 관리한다.
1
2
3
4
CPU 사용량 제한
메모리 사용량 제한
프로세스 수 제한
I/O 사용량 제어
예를 들어 컨테이너에 메모리 제한을 걸면, 그 제한은 cgroup을 통해 적용된다.
1
docker run --memory 512m nginx
정리하면 다음과 같다.
1
2
3
namespace 격리: 컨테이너가 자기만의 시스템처럼 보이게 함
cgroup 제한: 컨테이너가 사용할 수 있는 자원을 관리함
container namespace와 cgroup 등으로 격리된 프로세스 실행 환경
따라서 컨테이너는 “작은 VM”이라기보다, 리눅스 커널 기능으로 격리되고 제한된 프로세스 집합에 가깝다.