Storage in Docker

Yu Sang Min·2025년 6월 22일

CKA

목록 보기
66/110
post-thumbnail

🐳 Docker Storage Drivers & File System 이해


🧱 1. Docker의 저장 구조

  • Docker가 데이터를 저장하는 기본 위치:

    /var/lib/docker/
  • 주요 디렉토리:

    • containers/: 컨테이너 관련 파일
    • image/: 이미지 관련 데이터
    • volumes/: 생성된 볼륨 데이터
    • overlay2/, aufs/, btrfs/: 저장 드라이버 별 디렉토리

🧬 2. Docker 이미지의 레이어 구조 (Layered Architecture)

  • Dockerfile의 각 명령어마다 하나의 레이어가 생성됨
  • 이미지 레이어는 읽기 전용(📖)
  • 컨테이너 생성 시, 쓰기 가능한 레이어가 위에 추가됨 (RW Layer)

예시:

# 이미지 레이어
[ Ubuntu ]  ⬆️
[ APT 패키지 설치 ] ⬆️
[ Python 설치 ] ⬆️
[ 코드 복사 ] ⬆️
[ ENTRYPOINT 지정 ]

# 컨테이너 실행 시
[ RW Layer ]  ← 컨테이너에서 변경되는 파일 저장

📦 3. Copy-on-Write (COW) 방식

  • 이미지 레이어는 수정 불가

  • 수정이 필요할 경우:

    1. 해당 파일을 RW Layer에 복사
    2. 이후 수정은 복사본을 기준으로 수행

이 구조 덕분에 여러 컨테이너가 하나의 이미지 레이어를 공유할 수 있음


💾 4. 데이터 유지 vs 휘발성

저장 위치특성
RW Layer컨테이너 삭제 시 사라짐
Volume 또는 Bind Mount컨테이너 삭제 후에도 유지

🔗 5. Docker에서의 데이터 영속화 방법

✅ (1) Volume Mount

  • Docker 내부에서 관리하는 디렉토리에 저장
  • 디렉토리: /var/lib/docker/volumes
# 볼륨 생성
docker volume create data_volume

# 컨테이너 실행 시 마운트
docker run -v data_volume:/var/lib/mysql mysql

✅ (2) Bind Mount

  • 호스트의 임의 디렉토리를 마운트
  • 외부 스토리지, 특정 경로 활용 시 사용
docker run -v /data/mysql:/var/lib/mysql mysql

✅ (3) --mount 옵션 (권장 방식)

docker run \
  --mount type=bind,source=/data/mysql,target=/var/lib/mysql \
  mysql

🛠️ 6. Storage Driver란?

Storage Driver = Docker가 layered file system을 구현하는 방식

주요 역할:

  • 레이어 생성, 복사, 병합, COW(Copy on Write) 등 처리
  • 컨테이너마다 분리된 파일시스템 유지

대표 드라이버 종류:

드라이버특징
AUFSUbuntu 기본, 빠르고 안정적
overlay2최신 커널에서 권장, 가장 널리 사용
devicemapperRHEL/CentOS 등에서 사용됨
btrfs, zfs고급 기능 지원, 복잡함

Docker는 OS에 맞게 자동으로 가장 적합한 드라이버 선택함.


📌 정리 요약

개념설명
이미지 레이어읽기 전용 (여러 컨테이너가 공유)
컨테이너 레이어쓰기 가능, 컨테이너 종료 시 삭제됨
Copy-on-Write이미지 파일 수정 시 RW Layer에 복사 후 수정
Volume Mount/var/lib/docker/volumes 관리
Bind Mount호스트의 임의 디렉토리 사용
Storage Driver레이어 구조를 구현하는 핵심 기술

📘 실전 사용 팁

  • 컨테이너에 저장된 로그, DB, 결과 파일은 항상 Volume 또는 Bind Mount로 분리
  • 여러 컨테이너에서 동일 데이터를 공유하려면 Named Volume 활용
  • overlay2가 기본이라면 그대로 사용 (속도, 안정성 우수)
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글