Storage

컨테이너를 사용하여 다양한 작업을 할 수 있습니다. 여러 작업 중 컨테이너 내부에서 생성한 정보, 파일들이 컨테이너가 종료되고 난 이후에 손실되어 찾을 수 없습니다. 기본적으로 컨테이너 내부에 생성되는 모든 파일들은 쓰기가능한 컨테이너 레이에어 저장되어 집니다. 이렇게 저장된다는 것은 아래와 같은 의미를 포함합니다.

  • 컨테이너가 종료된 후에는 데이터가 지속 가능하지 않습니다.
  • 다른 프로세스가 컨테이너 내부의 데이터를 참조하기 어렵습니다.
  • 컨테이너의 쓰기가능한 레이어는 컨테이너가 동작 중인 상태에서 호스트와 매우 타이트하게 연결되어 있습니다. 이 말은, 여러분이 데이터를 다른 곳으로 옮기는게 쉽지 않음을 의미합니다.
  • 컨테이너의 쓰기 가능한 레이어에 쓰기 위해서는 파일 시스템을 관리하기 위한 스토리지 드라이버가 필요합니다. 스토리지 드라이버는 리눅스 커널을 사용하여 유니언 파일 시스템을 제공합니다. 유니언 파일 시스템은 별도로 정리하겠습니다. 이러한 추가 추상화는 호스트 파일 시스템에 직접 쓰는 데이터 볼륨을 사용하는 것에 비해 성능을 감소시킵니다.

여러분들이 겪는 불편함을 해소하기 위해 도커는 스토리지를 지원하고 있습니다. 여러분들은 2가지 중 하나를 선택할 수 있습니다. 호스트에 직접 파일을 저장하여 컨테이너가 종료되더라도 파일을 유지할 수 있는 방법과 tmpfs 마운트를 이용하는 방법입니다.

스토리지 종류

도커 스토리지의 종류는 3가지가 있습니다. Volume, bind mount, tmpfs mount입니다. 각 방식을 가장 잘 나타내는 표는 docker docs 페이지에 나와있는 아래 그림입니다.

Container Storage

Storage 종류 설명
Volume Volume은 도커에 의해 관리되는 호스트 파일시스템의 일부분에 저장하는 방법입니다. 호스트 내의 도커 프로세스가 아닌 다른 프로세스들은 Volume 관련 파일시스템을 수정할 수 없습니다.
Bind mounts 호스트 시스템 내의 어디든 저장할 수 있습니다. 도커 내의 모든 프로세스가 접근 수정할 수 있다.
tmpfs mounts 호스트 시스탬의 메모리에 저장하는 방식으로 시스템의 파일시스템에 정보를 저장하는 방식과는 차이가 있다.

언제 사용하는게 좋은가?

Volume

volume은 도커 컨테이너 내의 데이터를 유지시키는데 가장 선호되는 방법입니다. 몇 가지 사용되는 경우는 아래와 같습니다.

  • 여러 동작중인 컨테이너 사이의 데이터를 공유하는 경우에 사용됩니다. 특정 컨테이너가 정지 또는 제거되더라도 volume은 삭제되지 않습니다. 여러 컨테이너들이 동일 volume에 대하여 마운트 할 수 있습니다.
  • 도커 호스트가 주어진 디렉터리 또는 파일 구조를 보장하지 않는 경우에 사용됩니다. volume은 컨테이너 런타임으로부터 도커 호스트 구성을 분리(decouple)하는데 도움이 됩니다.
  • 백업, 복구, 호스트에서 다른 도커 호스트로 데이터를 이관하는 경우 volume은 좋은 선택지가 됩니다.

bind mounts

일반적으로 가능하다면 volume을 사용하는 것을 추천합니다. 하지만 특정 경우에 한 해 bind mount를 사용하는 경우가 있습니다. 몇몇 유스케이스는 아래와 같습니다.

  • 호스트 시스템에서 컨테이너로 구성 파일을 공유하는 경우. Docker는 호스트 시스템에서 각 컨테이너에 /etc/resolv.conf를 마운트하여 기본적으로 DNS 확인을 컨테이너에 제공하는 방식이다.
  • 소스 코드 또는 도커 호스트 상의 개발환경과 컨테이너 사이의 요소를 빌드하기 위하여 사용합니다. 예를 들어, Maven 타겟 / 디렉토리를 컨테이너에 마운트 할 수 있으며 Docker 호스트에서 Maven 프로젝트를 빌드 할 때마다 컨테이너가 재구성 된 아티팩트에 액세스 할 수 있습니다.
  • Docker 호스트의 파일 또는 디렉토리 구조가 컨테이너가 필요로 하는 바인딩 마운트와 일치하도록 보장되는 경우.

tmpfs bounts

tmpfs 마운트는 데이터가 호스트 시스템이나 컨테이너 내에서 유지되지 않도록 하려는 경우에 가장 적합합니다. 이는 보안성 향상 로 또는 응용 프로그램이 많은 양의 비영구 상태 데이터를 써야 할 때 컨테이너의 성능을 위함입니다. 파일시스템에 저장된 데이터에 접근하는 것보다 메모리에 저장된 데이터를 접근하는 것이 성능 상 큰 이점이 있긴 때문입니다.

참고

Manage data in Docker