[docker]docker를 사용하는 이유 및 가상화 원리

코드깎는 노인·2021년 7월 28일
0
post-thumbnail
post-custom-banner

왜 도커인가?

성능

VirtualBox,Vmware등의 기존의 가상화툴들은 하이퍼바이저를 거치기 때문에 성능저하가 발생하고 커널등을 포함하여 용량이 컸다.하지만 도커는 리눅스 자체 기능인 namespace,cgroup을 사용한 격리환경으로 성능저하가 거의 없다.호스트와 커널을 공유하여 용량도 적다.

배포

컨테이너내의 작업은 호스트에 영향을 받지 않다 개발환경의 라이브러리설치등을 운영환경에서 설치할 필요없이 이미지로 만들어 복제할 수 있다.이미지를 여러 컨테이너로 복제가능하여 배포속도가 빠르다.

독립성 확장성


MSA로 아키텍쳐를 구성시 각각의 모듈(데이터베이스,웹서버등)을 독립적으로 구성할 수 있고 부하분산등의 필요에 따라 컨테이너를 쉽게 늘려 장애에 쉽게 대응할 수 있다.

도커의 가상화원리

도커는 리눅스의 namespaces와 cgroups라는 커널을 핵심으로 가상화 한다.

namespace

리눅스 프로세스는 단일 계층구조를 형성하며 모든 프로세스는 init을 기반으로 한다.권한이 있는 프로세스는 프로세스 트리구조내의 다른 프로세스를 kill할 수 있다.namespace
독립적인 계층구조트리들을 만들어 a계층구조의 프로세스가 b계층구조의 프로세스에 접근할 수 없는 환경을 제공한다.
PID네임스페이스를 예로들면 네임스페이스가 없다면 모든프로세스는 PID 1(init)의 하위프로세스가 되지만 PID네임스페이스가 생성되면 네임스페이스내 첫번째프로세스가 PID 1(init)이 된다.네임스페이스를 생성한 프로세스는 부모네임스페이스에 여전히 남아있으며 자식네임스페이스내의 프로세스는 부조 네임스페이스를 바라보지 못하지만 부모네임스페이스는 자식을 바라볼 수 있다.도커엔진은 다음의 네임스페이스를 사용한다.

  • pid namespace:프로세스 격리
  • NET namespace:네트워크 인터페이스 관리
  • IPC namespace:IPC자원 관리
  • MNT namespace:파일시스템 마운트 포인트
  • UTS namespace:커널 및 version identifier 격리

cgroup

cgroup(control group)은 프로세스 그룹의 리소스사용 제한,격리,측정을 제공하는 리눅스 커널기능이다.메모리,cpu,네트워크,IO에 대한 리소스할당을 설정할 수 있다.프로세스 그룹에 일정장의 자원을 할당하고 보장받고자 할때 cgroups를 사용하며 이는 어플리케이션/그룹자원을 격리한다.자원사용이 제한된 어플리케이션이라도 제한을 초과할 수 있지만 시스템리소스가 부족한 경우 설정된 제한값으로 조절된다.VM에서 리소스 경합이 발생할 때 설정된 제한값으로 제한된다.

그밖의 내부시스템

Union File Systems

Union File Systems은 도커의 레이어생성을 빠르고 가볍게 해준다.컨테이너를 위한 블록(우분투 기본이미지)생성을 제공한다.

Container Format

도커엔진은 namespace,cgroup,unionFs를 container format 래퍼로 묶는다.

Security

도커엔진은 보안설정을 위해 AppArmor, Seccomp, Capabilities커널을 사용한다.

  • AppArmor:프로그램별 프로필로 프로그램 기능 제한
  • Seccomp:프로그램에서 발생한 시스템호출을 필터링
  • Capabilities:권한 체크

출처
https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe
https://itnext.io/chroot-cgroups-and-namespaces-an-overview-37124d995e3d
시작하세요 도커/쿠버네티스

profile
내가 볼려고 만든 블로그
post-custom-banner

0개의 댓글