Docker image는 읽기 전용(read-only) 레이어의 시리즈로 저장된다. 우리가 컨테이너를 가동(run)하면 도커는 읽기 전용 이미지를 가져와서 맨 위에 읽기-쓰기(read-write) 계층을 추가한다. 실행중인 컨테이너가 기존 파일을 수정할 경우 파일이 기본 읽기 전용 계층에서 변경사항이 적용되는 최상위 읽기-쓰기 계층으로 복사된다. 읽기-쓰기 계층 버전은 기본 파일을 숨기지만 삭제하지는 않고 여전히 기본계층 안에 유지한다. 컨테이너가 삭제된 경우 이미지를 다시 실행하면 이전에 변경했던 사항(데이터)은 날아가고 새 컨테이너를 생성한다. 이는 복구할 수 없다.
이런 문제점을 해결하기 위한 방법 중 하나는 docker volume을 사용하는 것이다.
도커 볼륨은 docker container에서 생성하고 사용하는 데이터를 유지하기 위해 만들어졌다. 도커 볼륨은 사용하는 컨테이너의 크기를 늘리지 않고 볼륨의 컨텐츠가 지정된 컨테이너의 외부에 있기때문에 컨테이너의 read-write계층에 데이터를 유지하는 것보다 데이터를 보존하기에 안전한 방법이다.
도커 볼륨은 기본 유니온 파일 시스템 외부에 존재하며 호스트 파일 시스템에 일반 디렉토리 및 파일로 존재한다.
mount와 volume의 차이
- bind mount
호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트 된다. 파일 또는 디렉토리는 호스트 시스템의 절대 경로로 참조된다.
성능이 매우 우수하지만 특정 디렉토리 구조를 사용할 수 있는 호스트 시스템의 파일 시스템에 의존한다.
호스트에 존재하지 않는 파일 또는 디렉토리를 마운트 할 경우 자동적으로 생성해주지 않고 에러를 반환한다.- volume
호스트 시스템의 Docker 스토리지 디렉토리 내에 새 디렉토리가 생성되고 docker는 해당 디렉토리의 내용을 관리한다.
호스트에 존재하지 않는 파일 또는 디렉토리를 마운트 하는 경우 엔드포인트를 생성하고 항상 디렉토리를 생성한다.
docker volume create [my-volume]
docker volume ls
docker volume inspect [my-volume]
docker volume rm [my-volume]
docker run -d -it --name devtest -v "$(pwd)"/target:/app ngix:latest
사용하지 않는 모든 볼륨 제거
docker volume prune
참고
Understanding Volumes in Docker
docker docs | Use volumes