[Docker] 컨테이너란 무엇일까?
Docker 아이콘은 고래 하나가 여러 개의 컨테이너를 싣고 있는 모습이다.
여기서,
고래는 '컴퓨터'이고
컨테이너는 '격리된 프로세스'이다.
도커가 혁명적인 이유는 컨테이너라는 환경분리를 리눅스 기술로만 이루어 냈다는 점이다. 도커가 존재하기 전에는 VM ( VirtualMachine ) 기술을 활용하였다.
VM은 Hypervisor를 활용하여, 물리적으로 한 대의 OS 위에 가상의 Guest OS 여러 대를 실행 및 관리하는 구조이다. 무거운 커널이 여러 대가 동작하니, 그 위에서 동작하는 APP의 성능은 당연히 떨어질 수 밖에 없다.
도커는 커널의 존재를 하나로 줄였다.
커널이 하나만 존재할 수 있는 이유는 namespace와 cgroups를 활용하여 리소스를 독립적으로 분리하였기 때문이다.
namespace는 프로세스, 네트워크, 파일시스템 등의 리소스를 독립적으로 격리시키는 리눅스 기술이다.
Spring 프로세스는 Process 리소스의 3333333 영역을, Network 리소스의 6666666 영역을, File System 리소스의 8888888 영역을 할당받아 사용할 수 있다.
cgroups의 c는 control이다. 여러 개의 프로세스는 그룹 단위로 묶일 수 있다. cgroups는 묶여진 그룹에 리소스(CPU,메모리,네트워크...)를 얼마나 할당할지 설정할 수 있다.
namespace로 리소스를 격리시키고 cgroups로 얼만큼의 리소스를 할당할지 설정하는 기술을 잘 다듬으면, 독립된 환경에서 동작하는 컨테이너 기술이 완성된다. 이처럼 도커 컨테이너 기술은 단순히 프로세스만 격리시켜 동작하므로, 가볍고 빠르게 동작한다.
참고자료