[Docker] Docker의 작동 구조

Fabro·2021년 9월 15일
0
post-thumbnail

Docker의 작동 구조

Docker가 작동하기 위한 기초 기술을 알아보자.

Namespace(컨테이너를 구획화하는 장치)

Docker는 Linux 커널의 namespace라는 기능을 사용하여 컨테이너라는 독립된 환경을 만든다. namespace는 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게하는 개념으로 같은 이름의 객체라도 namespace가 다를 경우 다른 실체로 처리된다.
Docker는 아래의 namespace 장치들을 사용하여 Host 상에서 컨테이너를 가상적으로 격리시킨다.


  • PID namespace

    • PID와 프로세스를 격리시킴
    • namespace가 다른 프로세스끼리는 서로 액세스 불가

  • Newtwork namespace

    • 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있음
    • 이 기능을 사용하면 Host OS상에서 사용 중인 포트가 있어도 컨테이너 안에서 동일한 번호의 포트 사용 가능

  • UID namespace

    • UID, GID를 namespace 별로 독립적으로 가질 수 있음
    • namespace 안과 Host OS상의 UID/GID가 서로 다른 UID/GID를 가지지만 서로 연결될 수 있음
      • 예를 들어 namespace 안에서의 root 사용자를 Host OS 상에서 일반 사용자로 취급할 수 있음

  • Mount namespace

    • namespace 안에 격리된 파일 시스템 트리를 만들수 있음
    • 다른 namespace와 같이 namespace 안에서 수행한 마운트는 Host OS나 다른 namespace에서는 액세스할 수 없게 되어있음

  • UTS namespace

    • namespace별로 호스트명이나 도메인명을 독자적으로 가질 수 있음

  • IPC namespace

    • 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있음


cgroups(릴리스 장치 관리)

Docker에서는 물리 머신 상의 자원을 여러 컨테이너가 공유하여 작동한다. 이때 Linux 커널의 기능인 cgroups 기능을 사용하여 자원의 할당 등을 관리한다.
cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능


cgroups의 주요 서브 시스템

항목설명
cpuCPU 사용량을 제한
cpuacctCPU 사용량 통계 정보를 제공
cpusetCPU나 메모리 배치를 제어
memory메모리나 스왑 사용량을 제한
devices디바이스에 대한 액세스 허가/거부
freezer그룹에 속한 프로세스 정지/재개
net_cls네트워크 제어 태그를 추가
blkio블록 디바이스 입출력량 제어



가상 브리지 / 가상 NIC(네트워크 구성)

  • Linux는 Docker를 설치하면 서버의 물리 NIC가 docker0라는 가상 브리지 네트워크로 연결되는데 이 docker0은 Docker를 실행시킨 후에 디폴트로 만들어진다.
  • Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16이라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0으로 자동으로 할당된다.
  • Docker 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker0과 Host OS의 물리 NIC에서 패킷을 전송하는 장치가 필요하고, Docker에서는 NAPT 기능을 사용해 연결한다.

NAPT(Network Address Port Translation)

  • 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를 변환하는 기능
  • 프라이빗 IP 주소와 글로벌 IP 주소를 투과적으로 상호 변환하는 기술로, TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다.
  • Docker에서는 NAPT에 Linux의 iptables를 사용한다.


Docker 이미지의 데이터 관리 장치

  • Docker에서는 'Copy on Write'방식으로 컨테이너의 이미지를 관리한다.

Copy on Write

  • 복사를 요구받아도 바로 복사하지 않고 원래의 데이터를 그대로 참조시켜, 원본 또는 복사 어느 쪽에 수정이 가해진 시점에 비로소 새로운 빈 영역을 확보하고 데이터를 복사하는 방식



References

  • 완벽한 IT 인프라 구축을 위한 Docker
profile
엔지니어 유망주의 곡괭이질

0개의 댓글