[Storage] Storage in Docker

IMKUNYOUNG·2024년 7월 29일
0

KCNA

목록 보기
26/56

이번 포스트에서는 Docker 스토리지 드라이버와 파일 시스템에 대해 깊이 있게 다뤄보겠습니다. Docker가 데이터를 어디에 어떻게 저장하는지, 그리고 컨테이너의 파일 시스템을 어떻게 관리하는지에 대해 자세히 알아보겠습니다.

Docker의 데이터 저장 방식

Docker를 시스템에 설치하면 기본적으로 /var/lib/docker 폴더 구조를 생성합니다. 이 폴더 아래에는 다양한 하위 폴더가 존재합니다. 예를 들어:

  • aufs: Advanced Multi-layered Unification Filesystem
  • containers: 각 컨테이너와 관련된 파일을 저장
  • image: Docker 이미지 관련 파일을 저장
  • volumes: 컨테이너에 의해 생성된 볼륨을 저장

Docker는 기본적으로 이 디렉토리 구조를 사용하여 데이터를 저장합니다. 여기서 데이터란 Docker 호스트에서 실행 중인 이미지 및 컨테이너와 관련된 파일을 의미합니다.

Docker의 계층 구조 이해하기

Docker는 이미지를 빌드할 때 계층 구조를 사용합니다. Docker 파일의 각 명령 줄은 새로운 계층을 생성합니다. 예를 들어, 다음과 같은 Docker 파일이 있다고 가정해 봅시다:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3
COPY . /app
CMD ["python3", "/app/app.py"]

이 Docker 파일은 다음과 같은 계층을 만듭니다:

  1. Ubuntu 기본 이미지: 약 120MB 크기
  2. APT 패키지 설치: 약 300MB 크기
  3. 소스 코드 복사: 작은 크기
  4. 명령 설정: 작은 크기

각 계층은 이전 계층에서 변경된 내용만 저장하므로 크기가 상대적으로 작습니다.

계층 구조의 장점

계층 구조는 Docker 이미지 빌드 시 많은 이점을 제공합니다. 예를 들어, 동일한 기본 이미지와 패키지를 사용하는 두 개의 애플리케이션이 있다고 가정해 봅시다. 두 애플리케이션 모두 Ubuntu와 Python 종속성을 사용하지만, 소스 코드와 진입점이 다릅니다. 이 경우 Docker는 첫 번째 애플리케이션을 빌드한 후 캐시에 저장된 첫 세 계층을 재사용하고, 나머지 두 계층만 새로 생성합니다. 이렇게 하면 Docker는 이미지를 더 빠르게 빌드하고 디스크 공간을 효율적으로 절약할 수 있습니다.

컨테이너의 데이터 유지

컨테이너가 종료되면 해당 컨테이너의 계층과 그 안에 저장된 모든 변경 사항이 파기됩니다. 동일한 이미지 계층이 이 이미지를 사용하여 생성된 모든 컨테이너에 공유되므로, 변경 사항은 컨테이너의 수명 동안에만 유지됩니다. 이러한 데이터를 영구적으로 유지하려면 영구 볼륨을 사용할 수 있습니다.

영구 볼륨을 생성하려면 다음과 같이 명령어를 사용할 수 있습니다:

docker volume create data_volume
docker run -v data_volume:/var/lib/mysql mysql

이 명령어는 data_volume이라는 볼륨을 생성하고 이를 MySQL 컨테이너의 /var/lib/mysql에 마운트합니다. 이렇게 하면 컨테이너가 종료되더라도 데이터는 유지됩니다.

스토리지 드라이버

Docker의 계층 구조를 유지하고 쓰기 가능한 계층을 생성하며 파일을 복사하는 등의 작업을 수행하는 것은 스토리지 드라이버의 역할입니다. 몇 가지 일반적인 스토리지 드라이버로는 다음이 있습니다:

  • AUFS: Ubuntu의 기본 스토리지 드라이버
  • BTRFS: 고급 파일 시스템 기능 제공
  • ZFS: 높은 안정성과 성능 제공
  • Device Mapper: 다양한 리눅스 배포판에서 사용 가능
  • Overlay 및 Overlay2: 성능과 안정성 향상

각 운영 체제에 따라 최적의 드라이버가 자동으로 선택됩니다. Docker는 자동으로 최상의 스토리지 드라이버를 선택하며, 각 드라이버는 다양한 성능과 안정성 특성을 제공합니다.

0개의 댓글