728x90

개요

Docker에서 볼륨은 주로 데이터를 영구적으로 저장하기 위해 사용됩니다.

 

그런데 익명 볼륨컨테이너가 삭제될 때 함께 삭제된다는 특징이 있어서, "왜 사용하는걸까?" 하는 의문이 들 수 있습니다. 이번 글에서는 익명 볼륨의 주요 사용 이유에 대해 알아보겠습니다.

 

익명 볼륨의 주요 사용 이유

1. 컨테이너 내부 데이터 보호

VOLUME /var/lib/mysql
  • Dockerfile의 VOLUME 지시어정의된 경로를 보호
  • 컨테이너 실행 중에 해당 디렉토리의 데이터가 보존

2. 성능 최적화

  • 컨테이너 쓰기 레이어와 분리되어 I/O 성능 향상
  • 데이터베이스캐시처럼 읽기/쓰기가 많은 작업에 효과적
  • 컨테이너 레이어에 직접 쓰기 작업을 하는 것보다 볼륨을 사용하는 것이 성능상 이점

3. 컨테이너 레이어 크기 관리

  • 런타임에 생성되는 데이터컨테이너 쓰기 레이어분리
  • 컨테이너 이미지 크기를 효율적으로 관리
  • 이미지 빌드 시간 단축 효과

4. 임시 데이터 관리

docker run -v /tmp/cache redis
  • 컨테이너 실행 중에만 필요한 임시 데이터 저장
  • 컨테이너가 삭제될 때 함께 정리되어야 하는 데이터에 적합
  • 캐시임시 파일 관리에 유용

호스트 마운트로부터 특정 경로 보호

특히 익명 볼륨호스트에서 오는 파일로부터 보호하는 역할을 합니다.

FROM gradle:7.4.2-jdk17
WORKDIR /app
COPY build.gradle settings.gradle ./
VOLUME ["/app/.gradle"]  # .gradle 캐시 디렉토리를 익명 볼륨으로 지정
VOLUME ["/app/build"]    # build 디렉토리도 익명 볼륨으로 지정
COPY . .

 

이렇게 설정하고 다음과 같이 실행하면:

docker run -v $(pwd):/app myapp
  • /app 디렉토리호스트소스코드와 동기화
  • 하지만 /app/.gradle/app/build호스트의 것이 아닌 컨테이너 내부의 것을 사용
  • 이를 통해:
    • 호스트-컨테이너 간 운영체제 차이로 인한 빌드 캐시 호환성 문제 방지
    • 컨테이너에 최적화된 빌드 결과물 유지
  • 익명 볼륨이 없다면❓
    • 호스트의 모든 파일이 컨테이너의 /app 디렉토리를 덮어씀
    • 컨테이너에서 생성된 .gradle 캐시가 호스트의 것으로 덮어써짐
    • 운영체제가 다른 경우(예: Windows 호스트 - Linux 컨테이너) 캐시 파일 호환성 문제 발생
    • 매번 새로운 빌드 수행으로 인한 성능 저하

정리하면, 익명 볼륨은 단순히 임시 저장소가 아닌, 호스트 마운트와 함께 사용될 때 특정 디렉토리를 보호하는 중요한 역할을 합니다.

 

특히 운영체제 차이로 인한 호환성 문제빌드 캐시 관리에서 실용적인 해결책을 제공합니다.