본문 바로가기
Docker

컨테이너(Container)

by 앵남(Andy) 2022. 12. 1.

 

Container

맨처음 Docker에 사용되는 container 기술과 hypervisor의 차이점을 딱히 구분하지 못했다. 그러나 궁극적인 목표는 가상화인것이다. 결론적으로 말하자면 리눅스 기술인 네임스페이스 기술과 Cgroups라는 기술을 사용해서 file system를 가상화 하는 것이다. 

 

즉, Container는 호스트 pc의 커널을 공유하고 프로세스가 떠있을 필요가 없다. 그래서 가상화와 다르게 적은 메모리 사용량과 적은 오버헤드를 보인다. 

 

 

namespaces

VM에서는 각 게스트 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않게 기능을 갖고 있다  .

 

리눅스에서는 이와 동일한 역할을 하는 namespaces 기능을 커널에 내장하고 있다. 글을 쓰는 시점을 기준으로 현재 리눅스 커널에서는 다음 6가지 namespace를 제공한다. 

  • mnt (파일시스템 마운트): 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능
  • pid (프로세스): 독립적인 프로세스 공간을 할당
  • net (네트워크): namespace간에 network 충돌 방지 (중복 포트 바인딩 등)
    • 네트워크 디바이스, ip 주소, 포트번호, 라우팅 테이블 네트워크 리소스를 격리된 namespace마다 가질 수 있음
  • ipc (SystemV IPC): 프로세스간의 독립적인 통신통로 할당
  • uts (hostname): 독립적인 hostname 할당
  • user (UID): 독립적인 사용자 할당

 

Cgroups(Control Groups)

위에서 말했듯이 Container는 namespace와 Cgroups기술을 사용해서 file system을 가상화한다고 했는데 여기서 Cgroups는 자원(resources)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다. 

여기서 제어를 하는 부분은 아래 내용을 제어를 한다. 

  • 메모리
  • cpu
  • I/O
  • 네트워크
  • device 노드

댓글