VirtualBox,Vmware등의 기존의 가상화툴들은 하이퍼바이저를 거치기 때문에 성능저하가 발생하고 커널등을 포함하여 용량이 컸다.하지만 도커는 리눅스 자체 기능인 namespace,cgroup을 사용한 격리환경으로 성능저하가 거의 없다.호스트와 커널을 공유하여 용량도 적다.
컨테이너내의 작업은 호스트에 영향을 받지 않다 개발환경의 라이브러리설치등을 운영환경에서 설치할 필요없이 이미지로 만들어 복제할 수 있다.이미지를 여러 컨테이너로 복제가능하여 배포속도가 빠르다.
MSA로 아키텍쳐를 구성시 각각의 모듈(데이터베이스,웹서버등)을 독립적으로 구성할 수 있고 부하분산등의 필요에 따라 컨테이너를 쉽게 늘려 장애에 쉽게 대응할 수 있다.
도커는 리눅스의 namespaces와 cgroups라는 커널을 핵심으로 가상화 한다.
리눅스 프로세스는 단일 계층구조를 형성하며 모든 프로세스는 init
을 기반으로 한다.권한이 있는 프로세스는 프로세스 트리구조내의 다른 프로세스를 kill
할 수 있다.namespace
는
독립적인 계층구조트리들을 만들어 a계층구조의 프로세스가 b계층구조의 프로세스에 접근할 수 없는 환경을 제공한다.
PID네임스페이스
를 예로들면 네임스페이스가 없다면 모든프로세스는 PID 1(init)
의 하위프로세스가 되지만 PID네임스페이스가 생성되면 네임스페이스내 첫번째프로세스가 PID 1(init)이 된다.네임스페이스를 생성한 프로세스는 부모네임스페이스에 여전히 남아있으며 자식네임스페이스내의 프로세스는 부조 네임스페이스를 바라보지 못하지만 부모네임스페이스는 자식을 바라볼 수 있다.도커엔진은 다음의 네임스페이스를 사용한다.
cgroup(control group)은 프로세스 그룹의 리소스사용 제한,격리,측정을 제공하는 리눅스 커널기능이다.메모리,cpu,네트워크,IO에 대한 리소스할당을 설정할 수 있다.프로세스 그룹에 일정장의 자원을 할당하고 보장받고자 할때 cgroups를 사용하며 이는 어플리케이션/그룹자원을 격리한다.자원사용이 제한된 어플리케이션이라도 제한을 초과할 수 있지만 시스템리소스가 부족한 경우 설정된 제한값으로 조절된다.VM에서 리소스 경합이 발생할 때 설정된 제한값으로 제한된다.
Union File Systems은 도커의 레이어생성을 빠르고 가볍게 해준다.컨테이너를 위한 블록(우분투 기본이미지)생성을 제공한다.
도커엔진은 namespace,cgroup,unionFs를 container format 래퍼로 묶는다.
도커엔진은 보안설정을 위해 AppArmor, Seccomp, Capabilities커널을 사용한다.
출처
https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe
https://itnext.io/chroot-cgroups-and-namespaces-an-overview-37124d995e3d
시작하세요 도커/쿠버네티스