Home Linux Containers
Post
Cancel

Linux Containers

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”이라기보다, 리눅스 커널 기능으로 격리되고 제한된 프로세스 집합에 가깝다.

This post is licensed under CC BY 4.0 by the author.