도커관련 자료들을 찾다가 재밌는 블로그 글을 하나 발견했습니다. 도커는 프로세스인가에 대한 이야기가 적힌 블로그 였는데 내용이 꽤나 재밌습니다.
이전 포스팅에서 도커를 정의할 때 컨테이너 기반의 가상화 플랫폼이라고 했었습니다. 그래서 저도 가상머신과 컨테이너는 분명히 다른 구조를 가지고 있지만 같은 가상화의 일종이라는 점을 생각해보면 컨테이너도 결국 가상머신이 아닐까하고 생각했었습니다.
그런데 블로그의 내용은 컨테이너도 결국 프로세스에 불과하다는 이야기를 하고 있었습니다. 그냥 컨테이너도 프로세스구나 하고 넘기기에는 다소 아쉬운 마음이 들어 그 블로그 글을 따라 정말 간단한 테스트를 해보려합니다.
테스트
우선 이전에 도커를 사용해보면서 받아놨던 httpd 이미지를 사용해서 컨테이너를 만들어 보겠습니다. 그리고 docker ps 명령어로 정상적으로 컨테이너가 실행됐는지도 확인하겠습니다. 참고로 저는 root 권한 계정으로 모든 작업을 진행합니다.
1
2
3
4
5
6
7
8
docker run --name ws -d -p 8000:80 httpd
docker ps
--------------
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
116d50b1f364 httpd "httpd-foreground" 9 seconds ago Up 8 seconds 0.0.0.0:8000->80/tcp, :::8000->80/tcp ws
--------------
그 다음 해줄건 /var/run/docker/runtime-runc/moby 아래의 내용을 살펴보는 겁니다.
해당 경로에 116d50b1f36403a6e….
이라는 디렉토리가 존재합니다. 이걸 자세히보면 앞에 부분이 앞서 실행시켰던 httpd 컨테이너에 할당된 컨테이너 아이디인 116d50b1f364
와 같은 것을 확인할 수 있습니다. 이제 이 디렉토리 안으로 들어가보면 state.json
이라는 파일이 하나 있습니다. httpd 컨테이너의 상태에 대한 기록들이 담겨있을것만 같은 파일 이름입니다. 이를 jq 커맨드를 사용해서 필요한 부분만 확인해봅니다
1
2
3
4
yum install jq
cd 116d50b1f36403a6e22ea1b55c2e70dfe769d095753dfe714704f080fc65928d
cat state.json | jq '.init_process_pid'
# 4836
init_process를 확인하니 프로세스 아이디가 4836인 것을 확인할 수 있었습니다. 이번엔 네임스페이스에 관한 정보를 보도록하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
cat state.json | jq '.namespace_paths'
-----------
{
"NEWIPC": "/proc/4836/ns/ipc",
"NEWNET": "/proc/4836/ns/net",
"NEWNS": "/proc/4836/ns/mnt",
"NEWPID": "/proc/4836/ns/pid",
"NEWUSER": "/proc/4836/ns/user",
"NEWUTS": "/proc/4836/ns/uts"
}
-----------
네임스페이스들이 /proc/4836 아래에 정의되어 있음을 확인할 수 있습니다. 참고로 리눅스의 proc 디렉터리에는 시스템과 프로세스에 대한 정보가 담겨져있습니다. 이제 ps로 4836프로세스가 실행되고 있는지를 확인해 보겠습니다.
이로써 도커 컨테이너는 확실히 프로세스가 맞다는 것을 바로 확인할 수 있습니다. 굳이 한번 더 검증을 하자면 kill해보면 됩니다. kill되면 프로세스인거죠. 이를 확인하기 위해 우선 컨테이너가 실행되는지 확인하고 프로세스를 kill하고 그다음 다시 컨테이너가 어떤 상태인지 확인해볼 겁니다.
4836 프로세스를 kill하니 STATUS가 EXITED로 바뀌면서 컨테이너가 중단되었습니다. 다시 ps 명령어로 4836을 찾아도 4836프로세스를 찾아볼 수 없습니다.
따라서 결론은 깔끔합니다.
도커 컨테이너는 프로세스입니다. 좀 더 정확하게 말하면 호스트 입장에서 도커 컨테이너는 하나의 프로세스에 불과합니다.
마무리
간단하게 도커 컨테이너가 프로세스인지 두눈으로 확인하는 작업을 수행했습니다. 사실 제가 본 블로그에 극히 일부분만 가져와서 따라해본 것이기 때문에 직접 해당 블로그에 방문해서 한번 글을 읽어보면 더 좋을 듯 합니다.