[CKA] Docker Storage와 Volume

Docker Storage와 Volume의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.

Storage in Docker

Docker가 데이터를 저장하는 위치와 방법, 그리고 컨테이너의 파일 시스템을 관리하는 방법입니다
Docker가 로컬 파일 시스템에 데이터를 저장하는 방법부터 살펴봅시다. 시스템에 Docker를 설치하면 /var/lib/docker/에 이 폴더 구조가 생성됩니다.

해당 디렉토리에는 aufs, 컨테이너, 이미지, 볼륨 등 여러 폴더가 있습니다. 도커가 default로 모든 데이터를 저장하는 곳입니다.
Default로 저장되는 데이터들은 일반적으로 Docker 호스트에서 실행되는 이미지 및 컨테이너와 관련된 파일을 의미합니다. 예를 들어 컨테이너와 관련된 모든 파일은 컨테이너 폴더 아래에 저장되고 이미지와 관련된 파일은 이미지 폴더 아래에 저장됩니다.
도커 컨테이너에 의해 생성된 모든 볼륨은 볼륨 폴더 아래에 생성됩니다.

Layered Architecture

또한 이미지와 파일이 어떻게 저장되는지는 Docker의 layer를 살펴보아야 합니다.

  1. 기본 구조
    이미지 레이어 구성

특징

  1. 레이어 생성 및 저장
    생성 방식
  1. 컨테이너 실행 구조
    컨테이너 레이어

  2. 기본 구성:

    • 읽기 전용 이미지 레이어 스택
    • 최상단의 읽기-쓰기 가능한 컨테이너 레이어
  3. 작동 방식:

    • docker run 명령어 실행 시 컨테이너 생성
    • 모든 런타임 변경사항은 최상단 컨테이너 레이어에 저장
  4. 레이어 아키텍처의 장점

  5. 성능 최적화

    • 빌드 캐시를 활용한 빌드 시간 단축
    • 레이어 재사용을 통한 빌드 효율성 증가
  6. 리소스 효율성

    • 레이어 공유를 통한 저장 공간 절약
    • 효율적인 이미지 배포 가능
  7. 관리 용이성

    • 체계적인 버전 관리 가능
    • 레이어 단위의 세분화된 제어 가능
  8. 모범 사례

  9. 레이어 최적화

    • 관련 명령어 통합으로 레이어 수 최소화
    • 불필요한 파일 제거로 레이어 크기 최적화
  10. 캐시 활용

    • 자주 변경되는 레이어는 Dockerfile 하단에 배치
    • 빌드 캐시 효율적 활용을 위한 명령어 구성

정리하면 Docker run으로 실행하게 되면 Docker에서 앞서 레이어를 기반으로 새로운 컨테이너를 만들고 이미지 레이어 위에 쓰기 가능한 새 레이어를 만들게 되는데, 이러한 레이어를 컨테이너 레이어라고 지칭하며 모든 런타임 변경사항이 저장되게 됩니다.

writeable layer는 애플리케이션이 작성한 로그 파일, 컨테이너가 생성한 임시 파일 또는 해당 컨테이너에서 사용자가 수정한 파일과 같이 컨테이너가 생성한 데이터를 저장하는 데 사용됩니다. 컨테이너가 살아있는 동안만 유효하며, 소멸하면 변경 사항또한 마찬가지로 모두 소멸됩니다.

  1. 이미지 레이어의 특성
  1. Copy-on-Write 메커니즘
  1. 이미지 변경 방법

이 구조의 장점:

Volumes

컨테이너를 제거하면 컨테이너 레이어에 저장된 모든 데이터도 삭제됩니다.
볼륨을 지정하지 않는다면 익명 볼륨으로 생성되어, 운영상에서 앱에 적용한 변경 사항과 우리가 만든 새 임시 파일 또한 제거됩니다.
이러한 데이터를 보존하기 위해선 persistent volume이라고 불리는 네임드 볼륨(명명된 볼륨)을 추가하여 컨테이너에 추가할 수 있습니다.

  1. 볼륨 생성 및 관리
# 볼륨 생성
docker volume create data_volume

# 볼륨 위치 확인
ls -l /var/lib/docker/volumes/

# 볼륨 목록 조회
docker volume ls

docker volume create data_volume 을 사용하여 볼륨을 생성하면 Docker에서 관리하는 파일시스템으로 data_volume이라는 명명된 새로운 볼륨이 생성됩니다.

  1. Docker가 관리하는 볼륨을 사용
    docker run 커맨드를 사용하여 docker 컨테이너를 실행할 때 이와 같이 -v 옵션을 사용하여 docker containers rewrite 레이어 내부에 이 볼륨을 마운트할 수 있습니다
# 기존 볼륨 사용
docker run -v data_volume:/var/lib/mysql mysql

# 새 볼륨 자동 생성
docker run -v data_volume2:/var/lib/mysql mysql  # 볼륨이 없으면 자동 생성

특징:

  1. 바인드 마운트 (Bind Mounting)
# 호스트의 특정 경로를 컨테이너에 마운트
docker run -v /data/mysql:/var/lib/mysql mysql

일반적인 Docker 볼륨의 마운트 타입 비교하면 다음과 같습니다.

-v보다 옵션을 명시적으로 적는 --mount 형식을 사용할 수 있으며
-mount 옵션의 장점:

긱 바인드 마운트와 볼륨 마운트 방식은 다음과 같습니다.


# 볼륨 생성
docker volume create data_volume

# -v 옵션 사용
docker run -v data_volume:/var/lib/mysql mysql

# --mount 옵션 사용
docker run --mount type=volume,source=data_volume,target=/var/lib/mysql mysql

# -v 옵션 사용
docker run -v /data/mysql:/var/lib/mysql mysql

# --mount 옵션 사용
docker run --mount type=bind,source=/data/mysql,target=/var/lib/mysql mysql

이렇게 bind와 volume에 따라 달라지는 것을 볼 수 있으며 bind 마운트의 경우 source를 호스트의 위치로 설정하게 됩니다. 이를 위해 Docker에서는 스토리지 드라이버를[ 참조하게 되며 주로 사용하는 파일시스템은 다음과 같습니다.