Skip to main content

Volume

데이터의 형태

먼저 Volume에 대해서 파기 전에 데이터가 어떤 형태로 있는지 확인해봐야합니다. 기본적으로 3개의 형태로 나눠볼 수 있습니다. 그리고 사용해봤으면 알겠지만 컨테이너 레이어안에 데이터는 휘발성인 것을 확인 할 수 있죠.

유형설명위치
애플리케이션코드와 설정 포함, 이미지 빌드 시 추가, 변경 불가📍 위치: 이미지 레이어 (읽기 전용)
임시 데이터실행 중 생성, 메모리나 임시 파일에 저장, 주기적 삭제📍 위치: 컨테이너 레이어 (읽기/쓰기 가능, 임시)
영구 데이터실행 중 생성, 파일이나 DB에 저장, 중지 후에도 유지📍 위치: 컨테이너 레이어 & 볼륨 (읽기/쓰기 가능, 영구적)

데이터 손실 문제 예시

어떤 폼을 제출하는 애플리케이션이 있다고 가정해봅시다. 이 애플리케이션은 응답을 ./response/*.txt 형태로 저장합니다. 애플리케이션을 이미지로 빌드하고 실행하면, 파일이 정상적으로 저장되는 것을 확인할 수 있습니다. 컨테이너를 중지하고 다시 시작하면 데이터는 여전히 살아있지만, 컨테이너를 지우고 다시 빌드하고 실행한다면 데이터가 사라지는 것을 확인할 수 있습니다. 이렇게되면 위에서 언급했던, 임시 데이터에 해당이 되겠죠 ?

도커 볼륨이란?

도커 볼륨은 컨테이너의 데이터를 지속적으로 저장하기 위한 메커니즘입니다. 컨테이너가 삭제되거나 재시작되더라도 데이터가 유지되도록 합니다. 볼륨은 호스트 머신의 하드 드라이브 폴더로, 여러 컨테이너 간에 데이터를 공유할 수 있게 합니다.

볼륨과 바인트마운트의 유즈 케이스

1. 익명 볼륨

docker run -v host-path:/container-path
  • 도커가 자동으로 생성하고 관리
  • 컨테이너의 수명 동안만 필요한 데이터를 저장하는 데 사용
  • 컨테이너와 맵핑되기 때문에 컨테이너가 삭제되면 익명 볼륨도 삭제됩니다.

ex) CI/CD, 로그 처리, 캐싱, 데이터베이스 테스트에서 사용될 수 있습니다.


2. 명명된 볼륨

docker run -v name:/container-path
  • 사용자가 직접 이름을 지정하여 관리할 수 있는 볼륨
  • 여러 컨테이너에서 공유
  • 컨테이너가 삭제되더라도 데이터는 유지됨

ex) Jenkins, Redis, Nginx 등의 지속적인 설정, 애플리케이션 간의 데이터 공유


3. 바인드 마운트

docker run -v /container-path
  • 사용자가 직접 이름을 지정하여 관리할 수 있는 볼륨
  • 같은 호스트 머신 경로를 연결하면 컨테이너간 공유가 가능
  • 호스트 머신 특정 디렉토리를 컨테이너 내의 경로와 직접 연결
  • 컨테이너가 삭제되더라도 데이터는 유지됨

ex) 개발 환경에서 코드 동기화, 로그 파일 유지, 데이터베이스 백업/복원, CI/CD에서 소스 코드


info

Bind Mount도 volume인가요 ?
아닙니다. 헷갈려 보일 수 있지만 Bind Mount는 호스트의 특정 디렉터리를 직접 연결하는 방식이고, Docker Volume은 Docker가 자체적으로 관리하는 스토리지에 데이터를 저장하는 방식입니다. Volume이 보안성과 관리 측면에서 더 유리하지만, Bind Mount는 더 직접적이고 빠릅니다.


그 외 볼륨관련 내용

  • readonly 설정

    • 볼륨을 읽기 전용으로 마운트하여 컨테이너가 데이터를 수정하지 못하도록 설정할 수 있습니다. 이를 통해 docker가 변경해서는 안될 가능성을 없앱니다.
    • 예시:
      docker run -v name:/container-path:ro
    • :ro 옵션을 사용하여 볼륨을 읽기 전용으로 설정합니다.
  • docker volume cli

    • Docker CLI를 사용하여 볼륨을 관리할 수 있습니다.
    • 주요 명령어:
      • docker volume create [OPTIONS] [VOLUME]: 새로운 볼륨을 생성합니다.
      • docker volume inspect [VOLUME]: 볼륨의 세부 정보를 확인합니다.
      • docker volume ls [OPTIONS]: 모든 볼륨을 나열합니다.
      • docker volume prune [OPTIONS]: 사용하지 않는 모든 볼륨을 삭제합니다.
      • docker volume rm [VOLUME]: 특정 볼륨을 삭제합니다.
tip

로컬 개발 환경 팁
Bind Mount를 통해 로컬 환경과 컨테이너를 동기화를 시킬때, 서버코드를 고치면, 서버를 다시 리부트해야하는 번거로움이 있는데, 이럴땐 nodemon 같은 패키지를 통해 파일시스템은 감시하여, 이를 자동으로 수행해줘서 생산성을 높일 수 있습니다.

레퍼런스