Container/Docker

[Docker CE] 도커란? (Docker vs VM, Container, namespaces)

Nirsa 2020. 1. 29. 15:21
반응형

 

  • Docker 란?

도커는 리눅스 "컨테이너 기반으로 만들어진 오픈소스 가상화 플랫폼 입니다. " 라고들 많이 설명 하지만 개인적으로 가상화라고 생각하지 않습니다. 도커는 커널을 공유하여 사용하며 프로세스를 격리시켜 작동(컨테이너)하는 플랫폼 입니다.

 

  • Docker Container와 VM(Virtual machine)의 간단한 차이

VM의 경우 호스트OS 위에서 동작하여 하드웨어에 직접 접근할 수 없고 호스트OS를 거쳐야 합니다. 하드웨어를 가상으로 할당해주고 실제로 사용할 때엔 Guest OS → Host OS → H/W  순으로 접근하게 되어 Dcoker Container에 비해 무겁고 실행 속도가 상대적으로 느립니다.

반대로 Dcoker Container의 경우 VM처럼 각각의 가상화 OS를 설치하고 실행하는것이 아니라, 호스트OS의 커널을 공유하고 네임스페이스(namespace)를 기반으로 각각의 어플리케이션에 대한 격리된 환경을 제공 합니다.

 

 

깊게 파고들지 않고 간단한 개념만 잡기 위한 분들은 단순히 OS 위에 Dcoekr Engine이 실행되고 이 프로세스를 사용하여 각각의 독립된 어플리케이션 환경(컨테이너)이 생성된다고 생각하셔도 좋습니다.

도커의 이미지인 고래를 생각하셔도 되는데 아래 도커 이미지는 고래(OS)위에 컨테이너들이 올라가 있는 모습 입니다.

 

 

그 전에 사용했던 이미지를 비슷하게 만들어 본다면 아래와 같은 모양이 되는데, 뜻 그대로와 같이 OS위에 Docker Engine이 올라가 있고 그 위에 생성한 컨테이너들이 올라가 있습니다.

 

 

 

  • Docker Architecture

Dcoker 클라이언트는 Docker 데몬과 통신을 하게 되는데, Docker 데몬은 컨테이너 빌드, 실행, 배포와 같은 작업을 수행하게 됩니다. 로컬 환경에서 사용 하거나, docker machine 등을 사용해 원격 환경에서 사용할 수 있습니다.

대표적인 build, pull, run의 명령어 실행 시 발생되는 아키텍처는 아래 사진과 같습니다.

 

 

 

  • Docker Container

Docker Engine은 각각의 독립된 어플리케이션 환경(컨테이너)을 만들기 위해 네임 스페이스(namespaces)를 사용 합니다. 아래와 같은 네임 스페이스를 사용하게 됩니다.

  • pid name spaces : 프로세스 격리 처리 (독립된 프로세스 공간 할당)
  • net name spaces : 네트워크 인터페이스 
  • ipc name spaces : IPC 자원에 대한 엑세스 관리
  • mnt name spaces : 파일 시스템 포인트 관리
  • uts name spaces : host name 할당

도커를 사용하다보면 centos의 이미지를 컨테이너로 실행 시킨 후 쉘에 진입 했을 때 ps 상태를 보면 1번에 /bin/bash와 같이 쉘이 PID1번으로 되어있는 걸 볼 수 있습니다. (CentOS7 기준으로 원래 PID 1번은 systemd)

 

 

 

이러한 이유중 하나가 네임 스페이스를 이용해 독립된 공간을 제공하고 Control groups, union file systems, container format 이라는 기술을 사용하여 현재 사용하는 Docker Container처럼 독립된 어플리케이션 환경이 구축되었기 때문 입니다.

네임 스페이스만 간단히 살펴 보자면, 우선 아무런 컨테이너를 하나 실행시킨 후 /var/run/docker/runtime-runc/moby 로 이동하시면 아래와 같이 dockercontainer id로 만들어진 디렉토리가 보이실 겁니다.

 

 

 

이 디렉토리로 이동하셔서 cat state.json | jq '.init_process_pid' 를 입력 하시면 이 컨테이너가 실행중인 프로세스를 확인할 수 있습니다. ( jq라는 패키지가 설치되어 있어야 하며 yum install jq로 설치하실 수 있습니다 )

 

 

 

이제 확인된 PID 1993과 PID 1(systemd)의 네임 스페이스를 보면 ipc, mnt, net, pid, uts가 모두 다르며 독립된 어플리케이션 환경이라는걸 확인할 수 있습니다. 만약 PID 1993을 kill 한다면 실행중인 컨테이너가 종료 될 것 입니다.

 

 

 

반응형