오늘의 나보다 성장한 내일의 나를 위해…













다음 당근 페이 질문은 아래와 같다.

:pushpin: Q: 도커 컨테이너에 대해 설명해주세요


도커 컨테이너에 대해 질문을 받았을 때 대답을 제대로 못한 것 같다. 사용하기만 했지 사실상 어떻게 동작하는지에 대해 살펴보진 않았다. 이번 기회에 도커 컨테이너 개념을 제대로 잡고 넘어가보자.


:pushpin: 도커 컨테이너란?


컨테이너: 하나의 운영 체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행되는 프로세스 상태를 의미한다.


도커 컨테이너는 도커 이미지를 기반으로 실행되는 프로세스다. 도커 이미지만 있다면 환경의 영향을 받지 않고 다양한 환경에서 컨테이너를 기동시킬 수 있기 때문에 이식성이 높다.


자바 언어에 ‘WORA’(Write Once, Run Anyware)라는 콘셉트가 있는데 도커 컨테이너에도 한번 빌드한 도커 이미지는 어느 환경에서나 동일한 동작을 보장한다는 ‘BORA’(Build Once, Run Anyware) 콘셉트가 있다.



또한, 도커 컨테이너는 가상 머신에 비해 장점이 있다.

  • 가볍다
  • 시작과 중지가 빠르다


도커 컨테이너는 호스트 머신의 커널을 이용하면서 네임스페이스 분리cgroup를 이용한 제어를 통해 독립적인 OS와 같은 환경을 만들 수 있다. 따라서 게스트 OS 기동을 기다릴 필요가 없으므로 프로세스를 빠르게 시작하고 중지할 수 있다.


cgroup: 단일 또는 테스크 단위의 프로세스 그룹에 대한 자원 할당을 제어하는 커널 모듈

커널(Kernal): 컴퓨터와 전원을 켜면 운영체제는 이와 동시에 수행된다. 한편 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야 한다. 하지만, 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심할것이다. 따라서 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이 때 메모리에 상주하는 운영체제의 부분을 커널이라 한다. 또 이것을 좁은 의미의 운영체제라고도 한다. 즉 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다. 이에 반해 넓은 의미의 운영체제는 커널뿐 아니라 각종 시스템을 위한 유틸리티들을 광범위하게 포함하는 개념이다. (보통은 운영체제라고 하면 커널을 말하게 된다.)

호스트와 게스트: VMware 와 같은 가상 머신에서 가장 중요한 개념 중에 하나가 바로 Host(호스트) 와 Guest(게스트) 의 개념이다. Host 는 단어 그대로 주체가 되는 주인을 의미하며 Guest 는 이러한 주인을 이용하는 손님의 개념이라는 것이다. 이를 가상 머신에 대입하여 보자면 우리가 실제로 사용하는 컴퓨터에 가상의 컴퓨터를 만들었으니 실제 컴퓨터는 Host 가 되고 가상 컴퓨터는 Guest 가 되는 것이다. 마찬가지로 실제 컴퓨터에서 돌아가는 운영체제는 Host 운영체제 가상 컴퓨터에서 돌아가는 운영체제는 Guest 운영체제가 되는 것 이다. 굉장히 쉽고도 단순한 개념이지만 이 개념이 혼동되면 안 되기 때문에 잘 기억하시길 바란다.

호스트 OS와 게스트 OS: 보통 하나에 PC엔 하나의 운영체제가 있다. 그러나 한 컴퓨터에 두 개 이상의 운영체제가 필요한 경우가 있다. 여기서 Host OS란 기존에 있던 운영체제라는 뜻으로 컴퓨터에 본래 설치되어 있던 운영체제를 의미한다. Guest OS란 PC에 추가적으로 설치될 운영체제를 뜻한다.


컨테이너호스트 OS의 리소스를 논리적으로 분리시키고 여러 개의 컨테이너가 공유하여 사용한다. 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동하는 것이 특징이다.


보통 물리 서버 상에 설치한 호스트 OS의 경우 하나의 OS 상에서 움직이는 여러 어플리케이션은 똑같은 시스템 리소스를 사용합니다. 이때 작동하는 여러 어플리케이션은 데이터를 저장하는 디렉토리를 공유하고, 서버에 설정된 동일한 IP 주소로 통신을 한다. 그래서 여러 어플리케이션을 사용하고 있는 미들웨어나 라이브러리의 버전이 다른 경우에는 각 어플리케이션이 서로 영향을 받지 않도록 주의해야 한다.


이에 반해 컨테이너 기술을 사용하면 OS나 디렉토리, IP 주소 등과 같은 시스템 자원을 마치 각 어플리케이션이 점유하고 있는 것처럼 보이게 할 수 있습니다. 컨테이너는 어플리케이션의 실행에 필요한 모듈을 컨테이너로 모을 수 있기 때문에 여러개의 컨테이너를 조합하여 하나의 어플리케이션을 구축하는 마이크로 서비스형 어플리케이션과 친화성이 높은 것이 특징입니다.


가상머신은 하드웨어 스택을 가상화한다. 컨테이너는 이와 달리 운영체제 수준에서 가상화를 실시하여 다수의 컨테이너를 OS 커널에서 직접 구동한다. 컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지한다.


:pushpin: 컨테이너 PID 1의 의미


리눅스 운영 체제PID를 공부해 보면 알겠지만 PID 1은 커널이 할당하는 첫 번째 PID라는 의미의 특수한 PID이다.


일반적으로 init 또는 systemdPID 1이 할당되며 시스템 구동에 필요한 프로세스들을 띄우는 매우 중요한 역할을 가진다. 그런데 컨테이너의 PID 1번은 컨테이너에서 실행된 애플리케이션이 가질 수 있다.


이유가 뭘까?


다시 한 번 예약된 PID의 역할을 보면 시스템을 구동시키는 역할을 하는 것을 볼 수 있다. 그런데 컨테이너는 이미 구동된 시스템, 즉 커널 위에서 동작한다. 뭔가 앞뒤가 안 맞는다.


그렇다


컨테이너는 운영 체제 시스템을 구동시킬 필요가 없이 바로 동작하기 때문에 시스템에 예약된 PID 1번이 할당되지 않은 상태라서 최초 실행자 애플리케이션에게 할당할 수 있다.


그래서 특수한 PID 1번은 컨테이너 세계에서 컨테이너가 실행하는 처음 애플리케이션에게 할당한다.


동일한 프로세스가 호스트컨테이너 내부에서 서로 다른 PID를 가지면서 컨테이너 내부에서는 독립된 것처럼 PID 1번 프로세스로 동작할 수 있는 이유는 컨테이너가 리눅스의 네임스페이스 기술을 활용하기 때문이다.


즉 호스트에서의 PID가 예를 들어 8823번이고 컨테이너의 PID가 1번일 때 이 두 프로세스가 동일한 프로세스인지 보는 방법은 cgroup 설정이 동일한지 보면 된다. 씨그룹 설정이 동일하다면 두 프로세스는 동일한 환경에서 동작하는 프로세스로 생각할 수 있다.


  • 네임스페이스: 호스트명, 네트워크, 파일 시스템 마운트, 프로세스 간 통신, 사용자 ID, PID 등의 자원을 격리할 수 있는 기술


네임스페이스로 격리된 내부에서는 외부가 보이지 않기 때문에 컨테이너 내부는 독립된 공간처럼 느껴진다. 이때 네임스페이스로 격리된 프로세스에 메모리, CPU, 네트워크, 장치 입출력 등의 사용량을 할당하고 제한하는 데 앞에서 설명한 씨그룹 기술을 사용한다. 그리고 이러한 기술을 쉽게 사용할 수 있게 하는 것이 도커이다. 즉, PID 네임스페이스가 분리되어 있기 때문에 도커 컨테이너의 프로세스는 1번이 될 수 있다. 도커 없이도 unshare 명령어로 프로세스의 PID 네임스페이스를 분리해볼 수 있다.


:pushpin: 도커 컨테이너와 프로세스의 차이


이번에는 도커 컨테이너와 프로세스가 어떻게 다른지 알아보자.


참고-컨테이너와 가상 머신의 차이


그전에 도커 컨테이너와 가상머신의 차이에 대해 한번 살펴보자.

가상머신은 운영체제 위에 하드웨어를 에뮬레이션하고 그 위에 운영체제를 올리고 프로세스를 실행하는 반면에 도커 컨테이너는 하드웨어 에뮬리에션 없이 리눅스 커널을 공유해서 바로 프로세스를 실행한다 고 설명하면 군더더기 없는 아주 훌륭한 설명이다.


다음 질문을 보자. 도커 컨테이너가 진짜 프로세스인가? 그럼 호스트 시스템에서 ps치면 보이나? 호스트에서 kill해서 죽일 수 있을까? 프로세스 ID도 있나? 한번 살펴보도록 하자.

이미 도커 컨테이너는 프로세스다 라고 들어봤을 수 있다. 하지만 컨테이너는 프로세스지만 프로세스라고 부르기보다는 컨테이너라고 부르는 데는 이유가 있다. 컨테이너는 (주로) 리눅스 커널에 포함된 프로세스 격리 기술들을 사용해서 생성한 특별한 프로세스이다. 처음 도커를 보면 가상 머신이라고 느끼는 건 바로 이런 이유 때문이다.


결론: 컨테이너는 그냥 프로세스이다.

좀 더 정확히는 호스트 입장에서는 컨테이너도 그냥 하나의 프로세스에 불과하다.

링크 참고



YoungKyonYou

Integration of Knowledge