컨테이너가 linux 의 cgroup 과 namespace 를 활용하여 동작하는 것은 이제 보편적으로 알려진 내용입니다. cgroup 은 자원의 활용에 사용하고 namespace 는 자원의 isolation 에 사용합니다.
이 중에서 namespace 의 종류는 다음과 같습니다.
ipc : 프로세스간 양방향 통신
mnt : 파일 시스템
net : 네트워크
pid : 프로세스 id
user : 사용자 계정
uts : Unix time sharing
위의 namespace를 기본으로 docker 의 프로세스 구조를 보면 다음과 같습니다.
먼저, pstree 명령어를 설치합니다. 어떤 패키지인지 모르면 아래 명령어로 패키지명을 찾을 수 있습니다.
$ sudo yum whatprovides pstree
psmisc-22.20-15.el7.x86_64 : Utilities for managing processes on your system
Repo : base
Matched from:
Filename : /usr/bin/pstree
$ sudo yum install -y psmisc
이제 pstree 로 docker 의 패키지를 봅니다.
$ pstree -lSps $(pidof dockerd)
() 안에 들어간 번호는 프로세스 id 입니다. dockerd 프로세스는 15472 이고 이후의 프로세스 명이 잘려서 보이니 ps 로 프로세스 명을 보면 다음과 같습니다.
$ ps -ef | grep 15489
15489 는 docker-containerd 입니다.
$ ps -ef | grep 15675
15675 는 docker-container-shim 입니다.
$ ps -ef | grep 15711
그리고 실제 컨테이너로 띄고 있는 minio 프로세스는 15711 입니다.
위의 내용을 보면 docker 프로세스는 다음과 같은 구조로 되어 있습니다.
dockerd (15472, docker 데몬) -> docker-containerd (15489, docker cotainerd) -> docker-container-shim (15675) -> minio (15711, 실행중인 docker 컨테이너)
docker-containerd 는 docker runtime 과 관련 있습니다. 컨테이너 실행은 runc 와 containerd 를 따릅니다. runc 는 Open Container Initiative(OCI) 에 의해 정의된 컨테이너를 실행시키는 부분으로 namespace 와 보안에 관한 표준입니다. containerd 는 runc 를 기반으로 컨테이너 이미지 관리, 스토리지, 실행 등의 기능을 확장한 것으로 CNCF 에 기부된 프로젝트 입니다.
docker-container-shim 은 docker 에서 자체적으로 추가한 것으로, 실행되는 컨테이너와 containerd 사이에서 컨테이너를 연결하여 containerd 가 문제가 생기더라도 실행되는 컨테이너에는 여향을 주지 않기 위해서 만들었습니다. 그런데 사실 이게 왜 더 필요한지는 모르겠습니다. 괜히 관리 레이어만 하나 더 추가된 부분으로 보이긴 합니다.
PID namespace 를 docker 에서 어떻게 적용되는지 보겠습니다.
앞에서 minio 컨테이너는 host 에서 보면 프로세스 id 가 15711 이고 그 부모 프로세스는 15675 인 docker-container-shim 인 것을 확인했습니다.
이제 minio 컨테이너를 아래와 같이 확인 합니다.
$ sudo docker (container) ls | grep minio
0b4bc5ba78f9 minio/minio "minio server /export" 18 months ago Up 4 hours 0.0.0.0:9000->9000/tcp minio
그리고, minio 컨테이너 안으로 들어가 보겠습니다.
$ sudo docker (container) exec -it 0b4bc5ba78f9 sh
프로세스를 조회해보면 다음과 같이 1번 프로세스로 minio 서버를 띄운 것이 보이고 (컨테이너 밖의 host 에서는 15711) 그 위의 부모 프로세스는 보이지 않습니다.