ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] 컨테이너의 구조
    Docker 2019. 4. 2. 01:34

    Union File System


     

    Union Mount

    복수의 파일시스템을 하나의 파일시스템으로 마운트하는 기능으로, 두 파일 시스템에서 동일한 파일이 있다면 나중에 마운트된 파일 시스템의 파일을 오버레이한다. 하위 파일시스템에 대한 쓰기 작업은 CoW(Copy On Write) 전략에 따라 복사본을 생성하여 수행하므로 원본 파일 시스템은 변하지 않는 것이 특징이다.

     

    일종의 상속inheritance와 비슷한 개념이기도 하다. 실제로 이 기능의 초기 구현은 상속 파일 시스템이라고 불리기도 했다.

     

     

     

     

    Union File System 종류

    Union Mount를 지원하는 파일 시스템

    • UnionFS
      • Linux, FreeBSD, NetBSD를 위해 초기에 구현된 유니언 파일 시스템
    • AUFS(Advanced Union File System)
      • UnionFS를 완전히 재작성하여 신뢰성과 성능을 개선하면서도 Writable Branch Balancing과 같은 새로운 개념을 도입했다.
      • 코드 가독성이 리눅스 오픈소스 커뮤니티에서 문제되어 주류 리눅스 커널에 통합되지 못했다.
    • Overlay
      • 주류 리눅스 커널에 통합된 버전이다.

     

    도커 컨테이너의 구조


    도커 컨테이너는 Union File System를 기반으로 동작한다.

     

    도커 이미지는 유니언 파일 시스템으로 오버레이되는 복수의 레이어Layer로 구현된다. 도커 컨테이너는 이미지로부터 생성되는 인스턴스이다. 하나의 이미지로부터 여러 개의 컨테이너를 생성할 수 있다. 유니언 파일 시스템의 특성에 따라 하위 레이어는 읽기 전용이며, CoW 전략에 의해 쓰기 작업은 상위 레이어로 복사해서 이루어지기 때문에 하나의 이미지로부터 복수의 컨테이너가 실행되어도 문제되지 않는다.

     

    도커 컨테이너의 레이어 구조는 컨테이너 레이어와 이미지 레이어로 분류할 수 있다.

     

    • 컨테이너 레이어
      • 쓰기 가능한 레이어Writable Layer
      • 각 컨테이너 마다 최상단 레이어에 생성되어 컨테이너마다 자신만의 상태를 가질 수 있게 해준다.
      • 컨테이너가 생성된 후 모든 변경작업이 이 레이어에서 이루어진다.
      • R/W 속도가 낮다.
    • 이미지 레이어
      • 읽기 전용 레이어Read-only layer
      • 다른 컨테이너와 공유할 수 있다.

     

     

    컨테이너는 컨테이너 레이어와 이미지 레이어로 구분된다.

     

    동일한 이미지를 여러 컨테이너가 공유해서 사용할 수 있다.

     

     

    실행 중인 컨테이너의 컨테이너 레이어와 이미지 레이어의 대략적인 크기를 확인할 수 있다. 

    • Size: 컨테이너 레이어의 데이터의 크기
    • Virtual Size: 컨테이너 레이어와 이미지 레이어를 합한 데이터 크기
      • 주의) 이미지 레이어는 여러 컨테이너가 공유하는 공통 레이어이므로 여러 컨테이너를 운영하는 호스트에서는 단순히 모든 컨테이너에 대한 가상 크기의 합계로 디스크 용량을 점유하고있다고 판단하면 안된다.

     

    컨테이너 생성 후 아무 작업도 하지 않았으면 SIZE가 0B인 것을 확인할 수 있다.

    $ docker run -itd --name devaom centos
    f4f3421495158bee2037547c27463a6b792c7970453cb7c068760fafcd2cb055
    
    $ docker ps -s
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES               SIZE
    f4f342149515        centos              "/bin/bash"         2 seconds ago       Up 1 second                             devaom              0B (virtual 202MB)
    

     

    1000B의 더미 파일을 컨테이너에서 생성한다. 컨테이너 레이어Writable Layer에 생성된다. SIZE가 1KB로 출력되는 것을 확인할 수 있다.

    $ docker exec devaom dd if=/dev/zero of=dummy.txt count=1000 bs=1
    1000+0 records in
    1000+0 records out
    1000 bytes (1.0 kB) copied, 0.0013842 s, 722 kB/s
    
    $ docker ps -s
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES               SIZE
    f4f342149515        centos              "/bin/bash"         2 minutes ago       Up 2 minutes                            devaom              1kB (virtual 202MB)
    

     

    docker diff 명령으로 컨테이너 레이어의 변경 사항을 확인할 수 있다.

    $ docker diff devaom
    A /dummy.txt
    

     

    스토리지 드라이버


    스토리지 드라이버는 도커의 레이어가 어떤 Union File System을 사용할지를 결정한다. 여러 상황에서 다양한 스토리지 드라이버를 고려하여 알맞는 스토리지 드라이버를 선택하여 사용할 수 있다.

     

    docker info 명령으로 현재 사용하는 스토리지 드라이버를 확인할 수 있다.

    $ docker info | grep Storage
    Storage Driver: overlay2
    

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    'Docker' 카테고리의 다른 글

    [Docker] 자체 네트워크 드라이버  (0) 2019.04.08
    [Docker] Dockerfile  (1) 2019.04.04
    [Docker] 데이터 볼륨  (0) 2019.04.03
    [Docker] 이미지 아카이브  (1) 2019.04.02
Designed by Tistory.