본문 바로가기
Engineering WIKI/Docker

[도커 교과서] 6장 도커 볼륨을 이용한 퍼시스턴트 스토리지

by wonos 2023. 2. 25.

컨테이너는 무상태 애플리케이션에게는 최적의 실행 환경이다. 그러나 애플리케이션에 전혀 상태가 없을 수는 없다. 퍼시스턴시(persistency)나 성능 향상을 위해 디스크를 사용하느 컴포넌트가 있어야 할 테고, 이 컴포넌트 역시 컨테이너에서 실행된다.

  • 도커 볼륨과 마운트에 대해 배우고 컨테이너 파일 시스템이 어떻게 동작하는지 알아보자.
  • 모든 컨테이너가 공유하는 이미지 레이어는 읽기 전용이고, 각 컨테이너가 따로 갖는 기록 가능 레이어는 컨테이너와 같은 생애주기를 갖는다.
  • 이미지 레이어는 이미지를 내려받은 순간부터 삭제할 때까지 로컬 컴퓨터의 이미지 레이어에 존재한다. 그러나 컨테이너의 쓰기 가능 레이어는 컨테이너를 실행할 때 생성되며 컨테이너를 삭제할 때 함께 삭제된다.(컨테이너가 종료하는 것만으로는 컨테이너가 삭제되지 않는다. 그래서 종료된 컨테이너의 데이터도 그대로 남아 있는 것이다.)

도커 볼륨은 도커에서 스토리지를 다루는 단위다.

  • 컨테이너에서 볼륨을 사용하는 방법은 두 가지다. 첫 번째는 수동으로 직접 볼륨을 생성해 컨테이너에 연결하는 방법이고, 두 번째는 Dockerfile 스크립트에서 VOLUME 인스트럭션을 사용하는 방법이다.
  • VOLUME 인스트럭션의 문법은 VOLUME <target-directory> 형식이다.
    • volumes-from 플래그를 적용하면 다른 컨테이너의 볼륨을 연결할 수 있다.
    • 볼륨은 컨테이너 간 파일 공유보다는 업데이트 간 상태를 보존 하기 위한 용도로 사용해야 하며, 이미지에서 정의하는 것보다는 명시적으로 관리하는 편이 더 낫다. 볼륨에 이름을 붙여 생성하고 업데이트 시 다른 컨테이너로 옮겨 연결하면 된다.

6.3 파일 시스템 마운트를 사용하는 컨테이너 실행하기

  • 볼륨의 장점은 컨테이너와 스토리지의 생애주기를 분리하면서도 도커를 사용하는 방식 그대로 스토리지를 다룰 수 있는 점이다. 볼륨 역시 호스트 컴퓨터상에 존재하지만 컨테이너와는 분리돼 있기 때문이다. 하지만 호스트 스토리지를 컨테이너에 좀 더 직접적으로 연결할 수 있는 수단이 있다. (바인드 마운트)
  • 바인드 마운트는 호스트 컴퓨터 파일 시스템의 디렉터리를 컨테이너 파일 시스템의 디렉터리로 만든다!

6.5 컨테이너의 파일 시스템은 어떻게 만들어지는가?

도커가 다양한 출처로부터 모아 만든 단일 가상 디스크로 구성된 파일 시스템을 갖는다. 이 파일 시스템을 유니언 파일 시스템이라고 한다.

  • 기록 가능 레이어 : 비용이 비싼 계산이나 네트워크를 통해 저장해야 하는 데이터의 캐싱 등 단기 저장에 적합하다. 각 컨테이너마다 독립적인 기록 가능 레이어를 갖지만, 컨테이너가 삭제되면 여기 저장된 데이터는 유실된다.
  • 로컬 바인드 마운트 : 호스트 컴퓨터와 컨테이너 간 데이터를 공유하기 위해 사용. 개발자의 로컬 컴퓨터에서 컨테이너로 소스 코드를 전달하기 위해 사용하면 로컬 컴퓨터에서 수정한 내용이 이미지 빌드 없이도 즉시 컨테이너로 전달될 수 있다.
  • 분산 바인드 마운트 : 네트워크 스토리지와 컨테이너 간에 데이터를 공유하기 위해 사용. 가용성이 높지만 로컬 디스크와 비교해 지원하지 않는 파일 시스템 기능이 있거나 성능 면에서 차이가 있을 수 있다. 읽기 전용으로 설정 파일을 전달하거나 공유 캐시로 활용할 수 있으며 읽기 쓰기 가능으로 데이터를 저장해 동일 네트워크상의 모든 컨테이너나 컴퓨터와 데이터를 공유하는데 적합하다.
  • 볼륨 마운트 : 컨테이너나 도커 객체인 볼륨 간에 데이터를 공유하기 위해 사용된다. 볼륨 마운트를 사용하면 애플리케이션이 볼륨에 데이터를 영구적으로 저장한다. 컨테이너를 교체하는 방식으로 애플리케이션을 업데이트해도, 이전 버전 컨테이너의 데이터를 그대로 유지할 수 있다.
  • 이미지 레이어 : 이미지 레이어는 컨테이너의 초기 파일 시스템을 구성한다. 레이어는 적층 구조를 갖는데, 후속 레이어와 이전 레이어의 내용이 서로 충돌하는 경우 후속 레이어의 내용이 적용된다. 레이어는 읽기 전용이며 여러 컨테이너가 공유한다.