본문으로 건너뛰기

Volume

1 Persistent Data

1.1 이미지 레이어와 컨테이너 레이어

image-20201117215748040

  • 실행중인 컨테이너에 대한 변경 사항들은 모두 컨테이너 레이어에 저장된다.
    • 이미지 레이어는 읽기 전용
    • 컨테이너 레이어는 쓰기가 가능하다
  • 컨테이너 레이어는 로컬 호스트의 파일 시스템에 존재하는 디렉토리이다.
  • 컨테이너 레이어는 컨테이너가 제거될 때 까지 호스트 파일 시스템에 존재한다.
  • 컨테이너가 삭제되면 모든 변경 사항이 사라진다.(Containers are ephemeral)
  • 이를 방지하기 위해 Docker Volume, Docker Bind Mount을 사용해서 데이터를 영속화할 수 있다.

2 Docker Volume

  • 쉽게 말하면 로컬 머신의 폴더이다. 볼륨은 이미지와 컨테이너 안에 있는 것이 아니고 호스트 머신에 존재한다.
    • 볼륨을 만들면 새로운 디렉토리가 호스트 파일 시스템에 생긴다.
    • /var/lib/docker/volumes/<volume ID>/. 위치에 만들어짐
    • 이 볼륨 디렉토리에는 _data라는 디렉토리가 존재하고 이 안에 실제 데이터가 저장된다.
  • 볼륨은 호스트 머신에 존재하고 이를 컨테이너가 사용하거나 매핑시킨 것이다.
  • 한 곳의 변화는 다른 한 곳에 반영된다.
  • 즉, 로컬 머신에 파일을. 추가하면 컨테이너 안에서 그 폴더를 접근할 수 있다
  • 컨테이너 안에서 폴더를 추가하면 로컬 머신에서도 접근이 가능하다.
  • 도커 볼륨의 종류로는 Anonymous Volume, Named Volume이 있다.

2.1 Anonymous Volume

  • docker run -v /app/data

  • Dockerfile에서 사용 가능

  • 하나의 컨테이너의 종속적이다.

    • 컨테이너를 삭제하면 자동으로 삭제된다.

    • 컨테이너간 공유 할 수 없다.

  • 매핑시킬 로컬 머신의 경로를 지정할 수 없다.

    • 호스트 머신의 경로는 도커가 관리한다.
  • 데이터 영속화에 사용 할 수 없음

2.2 Named Volume

  • 한 컨테이너의 종속적이지 않다.
    • 컨테이너를 삭제해도 볼륨은 삭제되자 않는다.
    • 컨테이너간 공유 가능
  • 호스트 머신의 경로는 도커가 관리한다.
    • 파일이 실제로 어디에 저장되는지 사용자는 알 필요가 없다
    • docker inspect --type volume {volumeName} 명령어를 사용하면 볼륨이 실제 어디에 저장되는지 알 수 있다.
  • 데이터 영속화에 사용 할 수 있음
    • 수정이 필요없는 데이터를 영속화 할 때 사용

Named Volume 사용하기

  • docker run -v data:/app/data
    • [볼륨의 이름]:[컨테이너 공유 디렉토리]
  • Dokcerfile에서 사용 불가

3 Bind Mounts

  • Docker Volume과 마찬가지로 호스트 파일 시스템을 이용한다.
    • Bind Mount는 호스트 파일 시스템에 위치한 디렉토리이다.
    • Docker Volume과는 다르게 호스트 파일 시스템에 어디든 위치할 수 있다.
    • 디렉토리가 호스트 파일에 위치하기 때문에 권한 문제가 발생할 수 있다.
  • 한 컨테이너의 종속적이지 않다.
    • 컨테이너를 삭제해도 볼륨은 삭제되지 않는다.
    • 컨테이너간 공유 가능
  • 호스트 머신의 경로를 개발자가 직접 설정한다.
    • 호스트 머신의 경로는 절대경로를 사용한다.
  • 데이터 영속화에 사용 할 수 있음
    • 수정이 필요한 데이터를 영속화 할 때 사용한다.
  • 개발 단계에서 유용하다.
    • 개발 단계에서 컨테이너는 실행환경을 캡슐화 해야하지만 코드는 필수가 아니다.
    • 이미지를 다시 빌드할 필요없이 컨테이너에 최신 코드를 반영할 수 있다.
    • 프로덕션 단계에선 컨테이너는 독립적으로 동작해야된다. 따라서 Bind Mounts를 사용하지 않는다.
      • 대신 dockerfile에서 COPY 인스트럭션을 사용한다.
  • 호스트에 디렉토리와 파일이 존재하지 않는 디렉토리를 생성하고 컨테이너의 파일이 호스트로 복사된다.
  • 호스트에 이미 디렉토리와 파일이 존재하는 경우 호스트의 디렉토리를 컨테이너의 디렉터러 자체를 덮어씌운다.

Bind Mounts 사용하기

  • docker run -v /path/to/code:/app/data
  • Dokcerfile에서 사용 불가

4 Volume Container

image-20201117215748040

  • -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유할 수 있다.
  • 컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 볼륨을 설정한 컨테이너의 볼륨 디렉토리를 공유할 수 있다.
  • 이를 활용하여 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 볼륨 컨테이너로서 활용할 수 있다.

참고