안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

 

이번 포스팅은 도커를 공부하여 이해한 Docker Container에 대한 정리를 작성하고자 합니다.

내용이 다르거나 잘못된 점이 있다면, 댓글 부탁드립니다!

 

 

1. Docker

 

도커 컨테이너는 말 그대로 물건을 담는 그릇과 비슷합니다.

애플리케이션이 있는 상자가 있다면, 이 상자 안에는 애플리케이션과 애플리케이션을 실행할 컴퓨터의 정보가 주어져 있습니다.컴퓨터 정보는 IP, 컴퓨터 이름, 디스크 드라이브 등이 포함됩니다.도커 컨테이너는 사용하는 호스트 운영체제나 다른 환경에 종속적이지 않은 환경에서 애플리케이션을 동작할 수 있는 장점이 있습니다.

 

도커를 실행하고자 하는 Host OS의 종류에 따라 도커가 다른 방식으로 운용될 수 있습니다.

저는 맥 OS를 사용하고 있으므로, 맥을 기준으로 설명하고자 합니다!

 

 

2. Mac의 운영체제에서 동작하는 Docker의 VM

 

윈도우, 맥 OS는 리눅스 운영체제에서 사용하는 커널과 별개의 시스템입니다. 

윈도우는 Windows NT 커널을 기반으로 하고, 맥 OSsms UNIX 계열의 BSD를 기반으로 하는 XNU 커널을 사용합니다.

따라서, 리눅스 커널과 별개의 시스템이므로 이를 호환시켜 줄 기능이 필요합니다.

 

맥은 Docker Desktop for Mac 가상화 기술을 이용해 내부적으로 리눅스 VM을 실행하고 이 VM 위에서 도커 컨테이너를 구동합니다.

경량화된 VM은 도커를 운용하기 위해 필요한 기능만 적용되어 운영체제 위에 하이퍼바이저로 각자 별도의 운영체제를 가지고 운영되는 가상 머신과 비교하여 리소스 낭비가 적습니다.

 

 

Host OS 관점에서는 Docker 경량화 VM은 맥 OS에서 하나의 프로세스로 실행되므로 고유한 PID를 가집니다.

즉, 맥 OS 관점에서는 Docker 경량화 VM은 하나의 애플리케이션 혹은 프로세스로 처리됩니다.

 

 

2. Docker 경량화 VM에서 동작하는 개별 컨테이너

 

Docker 경량화 VM이 Host OS의 개별 PID였다면, Docker 경량화 VM에서 컨테이너는 개별 PID 입니다.

VM 내부에서 실행되는 Docker 컨테이너들은 리눅스 커널 위에서 각기 독립된 프로세스로 실행이 됩니다.

Docker VM은 리눅스 기반이므로 Docker 컨테이너는 이 VM의 리눅스 커널을 공유하게 되는 것입니다.

 

그 결과, 프로세스를 격리할 수 있습니다.

각 컨테이너는 독립된 프로세스로 실행되지만, 동일한 커널 인스턴스를 사용합니다.

 

또한, 네임스페이스라는 커널 기능을 사용하여 격리됩니다.

네임스페이스는 프로세스 ID, 네트워크 인터페이스, 마운트 포인터 등을 컨테이너별로 분리하여

각 컨테이너가 자신만의 격리된 환경을 가지는 것처럼 동작합니다.

 

 

여기서 중요한 점은 각 컨테이너는 VM 내부에서 고유한 PID를 가지는데,

이 PID는 호스트 OS(Mac)의 PID 공간과는 분리되어 있습니다.

따라서, 호스트 OS는 이 내부 PID를 직접적으로는 알 수 없습니다.

 

이 경량화된 VM은 개별적인 운영체제를 가지고 운용되는 가상 머신 아키텍처와는 다른 구조를 보입니다.

위의 사진처럼 Docker VM은 각 컨테이너가 격리된 환경에서 운용되지만, 공통된 Docker VM 내부에서 동작합니다.

이는 운영체제를 공유함으로써 불필요한 리소스를 막을 수 있습니다.

 

도커는 이러한 점에서 격리밀집이라는 두 가지 특징을 충족하게 됩니다.

  • 격리: 각 컨테이너가 격리된 환경에서 운용
  • 밀집: 컴퓨터에 CPU와 메모리가 허용하는 한 되도록 많은 애플리케이션을 실행

 

하지만, 각자 별도의 운영체제를 갖는 가상머신은

 

 

별도의 운영체제로 인해, 애플리케이션이 사용할 CPU, 메모리 자원을 많이 사용하게 됩니다.

또한, 운영체제의 라이선스 비용 및 운영체제 설치 비용 등 복잡한 문제가 추가로 발생합니다.

이러한 특징은 격리된 환경은 보장하지만, 밀집의 특성을 충족하지 못하는 단점이 있습니다.

 

 

3. 정리하며

 

도커 및 쿠버네티스를 공부할 때,  "도커는 OS를 공유한다"라는 의미가 사실 많이 혼란스러웠습니다.

Host OS - 도커 경량화 VM - 각 도커 컨테이너의 연관성을 다시 생각하고 정리하니 어떠한 의미인지 이해할 수 있었습니다.

 

정리하면 다음과 같습니다.

  • 리눅스 환경에서는 컨테이너가 직접적으로 호스트 OS의 리눅스 커널을 공유합니다.
    • 각 컨테이너는 별도의 사용자 공간을 가지지만, 모두 같은 커널 공간을 사용합니다.
    • 각 컨테이너 프로세스는 호스트 시스템에서 고유한 PID를 가지며 실행됩니다.
  • 하지만, 운영체제가 맥이나 윈도우인 경우 직접적인 커널 공유가 불가능합니다.
    • Docker는 리눅스 가상 머신을 구동하고 이 가상 머신에 내장된 리눅스 OS에서 컨테이너를 실행합니다.
    • OS를 공유한다는 의미는 이 VM 내부에서 실행되는 컨테이너가 VM의 리눅스 OS 커널을 공유한다는 의미입니다.
    • 각 컨테이너들은 리눅스 가상 머신 내에서 고유한 PID를 가지며 관리됩니다.

 

이상으로 Docker Container에 대한 정리를 마치도록 하겠습니다!

읽어주셔서 감사합니다!

+ Recent posts