기본적인 컨셉은 내가 알고 있는 것과 비슷했다. 하이퍼 바이저를 사용하지 않고 가상화를 하는 것인데, 이 때 컨테이너라는 개념이 사용된다.
컨테이너는 namespace와 cgroups를 이용하여 프로세스를 격리(isolated; 고립보다는 격리라고 많이 표현하는 듯 하다.) 시킨다. 격리시킨다는 표현이 생소한데, 기본적으로 프로세스는 애초에 최소한의 격리상태라고 한다. 포트가 사용중인데 접근 할 경우, 해당 포트를 차지하지 못하고 프로그램 실행이 안되는 것을 예시로 들 수 있다. 이처럼 프로세스가 다른 자원에 접근하지 못하도록 막는 것을 격리라고 표현한다. 즉, 컨테이너는 리소스 사용이 제한 된 프로세스라는 것인데, namespace라는 개념을 이용하여 격리된 프로세스들을 묶어 놓은 것이다. 이 때, 리소스 사용의 제한은 cgroups를 이용하여 이루어진다. 따라서 컨테이너는 cgroup을 확장시켜 만들어 놓은 것이라고도 할 수 있겠다.
ms docs에서 가져왔다. 위의 그림처럼 커널 위에 있는 프로세스지만, 컨테이너라는 단위로 묶여 격리되어있다.
도커의 장점은 하이퍼바이저가 없고 커널을 공유하기 때문에 훨씬 가볍고 빠르다. 또한 이미지라는 개념을 사용하여 원하는 빌드 버전으로 배포할 수 있는데, 이 때 배포환경은 도커로 통일되므로 관리가 아주 용이해진다. 백엔드 개발자는 지옥같은 프로퍼티 관리에서 조금 벗어날 수 있을 것 같다.
여기서 이해가 잘 안되는 부분은 커널영역을 공유한다고 했는데, 어떻게 독립적인 OS처럼 작동하느냐였다. 도커의 이미지는 호스트의 커널영역을 사용하고, 실제로 터미널에서 불러올 때도 호스트의 영향을 받기 때문이다. 이는 도커와 같은 컨테이너 기반의 가상화를 잘 못 이해하고 있어서인데, 컨테이너 기반의 가상화는 OS 가상화가 아닌 커널 가상화다. OS의 구성요소를 생각해보면 OS는 커널과 시스템 애플리케이션의 조합으로 이루어져 있다. 즉, 이미지에 커널은 없지만 해당 이미지에서 실행하고자 하는 파일 혹은 시스템을 위한 시스템 어플리케이션, 즉, 사용자 모드 os 파일과 기타 구성 파일이 포함되어 있는 것이다. 이 때, 이미지에 포함 된 os 배포판이 달라도 커널은 모두 리눅스이기 때문에 문제 없이 동작 한다.
https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/ 여기에 설명이 잘 되어 있는데, 이 것도 내일 팀원들과 공유해야 겠다.
Powered with by Gatsby 2.0