[번역] 도커 스토리지 소개

2019-02-20

도커상에서 어플리케이션 데이터관리는 중요한 주제이므로 도커 공식 문서를 하나씩 번역해가며 그 내용을 자세히 살펴보고자 한다.

도커 스토리지 전체 목차는 다음과 같다.

  • * 스토리지 소개 (원문)
  • 볼륨 사용 (원문)
  • 바인드 마운트
  • tmp 마운트
  • 컨테이너에 데이터 저장하기
    • 스토리지 드라이버에 대해
    • 스토리지 드라이버 선택
    • AUFS 스토리지 드라이버 사용
    • Btrfs 스토리지 드라이버 사용
    • 디바이스 맵퍼 스토리지 드라이버 사용
    • OverlayFS 스토리지 드라이버 사용
    • ZFS 스토리지 드라이버 사용
    • VFS 스토리지 드라이버 사용
•••

도커에서 데이터 관리

기본적으로 컨테이너 내부에서 생성된 모든 파일은 쓰기 가능한 컨테이너 레이어에 저장된다. 이는 다음을 의미한다.

  • 데이터는 컨테이너가 더 이상 존재하지 않을 때 지속되지 않으며, 다른 프로세스가 필요할 때에 컨테이너에서 데이터를 꺼내는 것이 어려울 수 있다.
  • 컨테이너의 쓰기 가능한 레이어는 컨테이너가 실행 중인 호스트 머신과 밀접하게 결합된다. 다른 곳으로 쉽게 자료를 옮길 수 없다.
  • 컨테이너의 쓰기 가능한 레이어에 쓰려면 파일 시스템을 관리하는 스토리지 드라이버가 필요하다. 스토리지 드라이버는 리눅스 커널을 사용하여 유니언 파일 시스템을 제공한다. 이런 추가적인 추상화는 호스트 파일 시스템에 직접 쓰는 데이터 볼륨을 사용하는 것에 비해 성능을 떨어뜨린다.

도커에는 호스트 머신에 파일을 저장하는 컨테이너에 대한 두 가지 옵션이 있어 컨테이너가 정지한 후에도 파일이 유지될 수 있는데, 볼륨과 바인딩 마운트. 만약 Linux에서 도커를 실행하고 있다면 tmpfs 마운트를 사용할 수 있다.

데이터를 영속(persisting)하는 이러한 두 가지 방법에 대한 자세한 내용은 계속 읽어보자.

적합한 마운트 유형 선택

어떤 종류의 마운트를 사용하든 컨테이너 내에서 데이터는 동일하게 보인다. 디렉토리나 또는 개별 파일로 컨테이너의 파일 시스템에 노출된다.

볼륨, 바인딩 마운트 및 tmpfs 마운트 간의 차이를 시각화하는 쉬운 방법은 도커 호스트에서 데이터가 어디에 상주하는지에 대해 생각해보는 것이다.

  • **볼륨(Volumes)**은 도커에 의해 관리되는 호스트 파일 시스템의 일부(/var/lib/docker/volumes/ on Linux)에 저장된다. 도커가 아닌 프로세스는 파일 시스템의 이 부분을 수정하지 않아야 한다. 도커에서 데이터를 유지하는 가장 좋은 방법은 볼륨이다.
  • **바인드 마운트(Bind mounts)**는 호스트 시스템의 어느 곳이든 저장될 수 있다. 이들 자체가 중요한 시스템 파일이나 디렉토리일 수도 있다. 도커 호스트의 비도커 프로세스나 도커 컨테이너는 원한다면 이들을 수정할 수 있다.
  • tmpfs 마운트는 호스트 시스템의 메모리에만 저장되며 호스트 시스템의 파일 시스템에 절대 기록되지 않는다.

마운트 유형에 대한 자세한 정보

  • 볼륨(Volumes): 도커에 의해 만들어지고 관리된다. docker volume create 명령을 사용하여 명시적으로 볼륨을 생성할 수 있으며, 도커는 컨테이너 또는 서비스 생성 중에 볼륨을 생성할 수 있다.

볼륨을 생성하면 도커 호스트의 디렉토리 내에 저장된다. 볼륨을 컨테이너로 마운트할 때, 이 디렉토리는 컨테이너에 마운트되는 것이다. 이는 도커에 의해 볼륨이 관리되고 호스트 머신의 핵심 기능에서 분리된다는 점을 제외하면 바인드 마운트가 작동하는 방식과 유사하다.

제공된 볼륨은 여러 개의 컨테이너에 동시에 마운트될 수 있다. 실행 중인 컨테이너가 볼륨을 사용하고 있지 않을 때, 그 볼륨을 도커가 사용할 수 있으며 자동으로 제거되지 않는다. docker volume prune을 사용하여 미사용 볼륨을 제거할 수 있다.

볼륨을 마운트할 때, 이름이 주어지거나 익명이 될 수 있다. 익명의 볼륨은 컨테이너에 처음 마운트될 때 명시적인 이름이 주어지지 않기 때문에 도커는 주어진 도커 호스트 내에서 고유함을 보장하는 임의의 이름을 부여한다. 이름 외에도, 이름과 익명의 볼륨도 같은 방식으로 취급된다.

볼륨은 데이터를 저장 가능케 하는 원격 호스트나 클라우드 제공자 또는 다른 시도할만 것들의 볼륨 드라이버를 사용할 수 있다.

  • 바인드 마운트(Bind mounts): 도커 초기부터 사용 가능. 바인드 마운트는 볼륨에 비해 기능이 제한되어 있다. 바인드 마운트를 사용할 때, 호스트 머신의 파일이나 디렉토리가 컨테이너에 마운트된다. 파일이나 디렉토리는 호스트 머신의 전체 경로에 의해 참조된다. 파일이나 디렉토리는 도커 호스트에 미리 존재할 필요가 없다. 만약 아직 존재하지 않는다면 요청에 따라 생성된다. 바인드 마운트는 성능이 매우 뛰어나지만, 사용 가능한 특정 디렉토리 구조를 가진 호스트 머신의 파일 시스템에 의존한다. 새로운 도커 애플리케이션을 개발하는 경우 명명된 볼륨을 사용하는 것을 고려하라. 바인드 마운트를 직접 관리하기 위해 도커 CLI 명령을 사용할 수 없다.

바인드 마운트는 민감한 파일에 대한 액세스를 허용한다.

좋건 나쁘건 바인드 마운트를 사용하는 한 가지 부작용은 컨테이너에서 실행 중인 프로세스를 통해 호스트 파일 시스템을 변경할 수 있다는 것이다. 여기에는 중요한 시스템 파일이나 디렉토리의 생성, 수정 또는 삭제가 포함된다. 이는 도커가 아닌 프로세스가 호스트 시스템에 영향을 주는 것을 포함, 보안 이슈를 지닌 파워풀한 기능이다.

  • tmpfs 마운트: tmpfs 마운트는 도커 호스트나 컨테이너 안에 있는 디스크에서 영속되지 않는다. 이는 컨테이너의 생명주기 동안에 컨테이너가 비영속적인 상태나 민감한 정보를 저장하기 위해 사용할 수 있다. 예를 들어, 내부적으로, 스웜 서비스는 tmpfs 마운트를 사용하여 서비스 컨테이너에 시크릿을 마운트한다.

바인딩 마운트 및 볼륨은 모두 -v 또는 --volume 플래그를 사용하여 컨테이너에 탑재할 수 있지만 각각의 구문은 약간 다르다. tmpfs 마운트의 경우 --tmpfs 플래그를 사용할 수 있다. 단, 도커 17.06 이상에서는 bind mount, volumes 또는 tmpfs 마운트를 위해 컨테이너와 서비스 모두에 --mount 플래그를 사용할 것을 권장한다.

볼륨의 적합한 유즈케이스

볼륨은 도커 컨테이너와 서비스의 데이터를 유지하는 가장 선호되는 방법이다. 볼륨의 일부 사용 사례는 다음과 같다.

  • 실행 중인 여러 개의 컨테이너 간에 데이터 공유. 명시적으로 생성하지 않으면, 처음에 컨테이너에 마운트할 때 볼륨이 생성된다. 그 컨테이너가 멈추거나 제거될 때, 볼륨은 여전히 존재한다. 여러 개의 컨테이너가 읽기-쓰기 또는 읽기 전용으로 동일한 볼륨을 동시에 마운트할 수 있다. 볼륨은 명시적으로 제거할 때만 제거된다.

  • 도커 호스트가 주어진 디렉토리 또는 파일 구조를 가지고 있다고 보장되지 않을 때. 볼륨은 컨테이너 런타임과 도커 호스트의 구성을 분리하는 데 도움이 된다.

  • 컨테이너의 데이터를 로컬이 아닌, 원격 호스트나 클라우드 제공자에 저장하려는 경우

  • 도커 호스트 간에 데이터를 백업, 복원 또는 마이그레이션해야 할 경우 볼륨이 더 나은 선택이다. 볼륨을 사용하여 컨테이너를 정지한 다음, 볼륨의 디렉토리(예: /var/lib/docker/volumes/<volumes-name>)를 백업할 수 있다.

바인드 마운트의 적합한 유즈케이스

일반적으로, 볼륨은 가능한 곳에 사용해야 한다. 바인드 마운트는 다음과 같은 유형의 유즈케이스에 적합하다.

  • 호스트 머신에서 컨테이너로 설정 파일을 공유. 도커는 기본적으로 호스트 머신에서 /etc/resolv.conf를 각 컨테이너에 장착하여 컨테이너에 DNS 레졸루션을 제공하는 방식이다.

  • 도커 호스트 상의 개발 환경과 컨테이너 사이에 소스 코드나 빌드 아티팩트를 공유. 예를 들어, 메이븐 (Maven) target/ 디렉토리를 컨테이너에 마운트할 수 있으며, 도커 호스트에 메이븐 (Maven) 프로젝트를 만들 때마다, 컨테이너는 새로 빌드된 아티팩트에 접근할 수 있다. 도커를 이런 방식으로 개발에 사용한다면, 프로덕션 Dockerfile은 바인드 마운트에 의존하기 보다는 프로덕션 레디의 아티팩트를 이미지에 바로 복사할 것이다.

  • 도커 호스트의 파일 또는 디렉토리 구조가 컨테이너가 요구하는 바인드 마운트와 일관성이 보장될 때.

tmpfs 마운트의 적합한 유즈케이스

tmpfs 마운트는 데이터가 호스트 머신이나 컨테이너 내에서 영속되는 것을 원하지 않는 경우에 가장 많이 사용된다. 이는 보안상의 이유 또는 애플리케이션이 많은 양의 비영구 상태 데이터를 써야 할 때 컨테이너의 성능을 보호하기 위한 것일 수 있다.

바인드 마운트 또는 볼륨 사용에 대한 팁

바인드 마운트 또는 볼륨을 사용할 경우 다음 사항을 유의하라.

  • 비어있는 볼륨을 파일이나 디렉토리가 존재하는 컨테이너의 디렉토리에 마운트하면, 이 파일이나 디렉토리가 볼륨으로 전파(복사)된다. 마찬가지로, 컨테이너를 시작하고, 아직 존재하지 않는 볼륨을 지정하면, 빈 볼륨이 생성된다. 이는 다른 컨테이너가 필요로 하는 데이터를 미리 채울 수 있는 좋은 방법이다.

  • 바인드 마운트나 비어 있지 않은 볼륨을 일부 파일이나 디렉토리가 존재하는 컨테이너의 디렉토리에 마운트하면, Linux 호스트의 /mnt에 파일을 저장한 후 USB 드라이브를 /mnt에 마운트한 것처럼, 이들 파일이나 디렉토리가 마운트에 의해 가려진다(obscured). /mnt의 내용은 USB 드라이브가 마운트 해제될 때까지 USB 드라이브의 내용에 의해 가려진다. 가려진 파일은 제거하거나 변경하지 않고, 바인드 마운트나 볼륨이 마운트하는 동안에는 접근할 수 없다.

Yeongpil Yoon

Powered by Hugo & Kiss.