본문 바로가기

컨테이너 스터디

도커의 작동 원리 이론과 실습

이번에 정리할 내용은 다음과 같다.

도커 컨테이너 vs 가상머신

도커 컨테이너 vs 프로세스

 

가상머신

운영체제 위에 하드웨어를 에뮬레이션하고, 그 위에 운영체제를 올리고 프로세스를 실행함

도커 컨테이너

하드웨어 에뮬레이션 없이 리눅스 커널을 공유하여 바로 프로세스를 실행함

 

어떻게 다른지 실습을 통해서도 알아보자.

터미널에서 uname을 입력한 화면이다. 커널의 버전을 확인할 수 있다.
도커 컨테이너 상의 Centos 환경에서 uname 명령어를 입력한 화면이다. 출력 결과가 같은 것을 확인할 수 있다.
릴리즈된 버전을 확인해보면 Centos로 나온다.

  • 컨테이너는 호스트 시스템의 커널을 사용한다.
  • 컨테이너는 이미지에 따라서 실행되는 환경 (파일 시스템)이 달라진다.

여기서 궁금한 점은 어떻게 이미지에 따라 파일 시스템을 다르게 할 수 있는가이다. 운영체제 지식이 조금 들어가게 되는데, 리눅스는 루트 디렉토리를 기준으로 하위 디렉토리들을 찾는다. 그런데 도커에서는 이미지를 루트 파일 시스템으로 강제로 인식시켜 프로세스를 실행시키기 때문에 파일 시스템을 다르게 동작시킬 수 있게 된다!

또한 컨테이너로 실행한 bash 셸의 PID는 1번인데 일반적으로 리눅스에서 1번 프로세스는 특별한 의미를 갖고 있다. 컨테이너 안에서 pstree를 실행해보면 모든 프로세스들이 1번 프로세스들을 기준으로 물려있는걸 확인할 수 있다!

 

그렇다면 어떻게 PID 1번으로 프로세스를 실행시켰을까. 이를 구현하는데 사용된 기능이 리눅스의 네임스페이스이다.

정확히는 PID 네임스페이스가 분리되어있기 때문에 도커 컨테이너의 프로세스는 1번이 된다.

 

추가로 리눅스의 네임스페이스는 UTS, PID, 네트워크, 마운트 등으로 구분된다.

괄호 안에 표시된 숫자 값이 네임스페이스 값이다.

 

도커 컨테이너는 어떻게 프로세스인데, 독립된 환경을 갖는 것처럼 보일까. 여기엔 chroot의 도움을 받는다. chroot 명령어를 사용하면 프로세스의 루트 디렉토리를 격리시킬 수 있다. 

프로세스는 설정된 루트 디렉토리를 기준으로 하위 디렉토리를 탐색할 수 있는데 chroot를 사용하면 해당 경로를 변경할 수 있다.