Docker Storage - Overview

seheon·2023년 9월 3일
0

Docker Storage

목록 보기
1/1

원문

도커의 데이터 관리 방법

도커의 컨테이너 안에 생성되는 모든 파일들은 기본적으로 컨테이너의 쓰기 가능 레이어에 생성됩니다. 이로 인해 컨테이너에 생성되는 파일들은 다음과 같은 특징을 갖습니다.

영속적이지 않음

데이터는 컨테이너가 지워지면 같이 지워지며 영속적이지 않습니다. 또한 다른 프로세스에서 데이터에 접근하기 어렵습니다.

옮기기 어려움

쓰기 가능한 레이어는 도커 호스트 머신과 강하게 연관되어 있기 때문에 데이터를 다른 곳으로 옮기기 쉽지 않습니다.

스토리지 드라이버

쓰기 가능한 레이어는 파일 시스템을 관리할 스토리지 드라이버가 필요합니다. 스토리지 드라이버를 통해 추상화된 파일 시스템은 도커 호스트의 파일 시스템에 직접 작성하는 것에 비해 성능이 떨어집니다.

영속적인 데이터 만들기

데이터베이스의 스토리지, 서비스의 로그 등 컨테이너가 사라지더라도 데이터를 보존해야 하는 상황이 있습니다. 기본적으로 컨테이너에 작성되는 파일은 영속적이지 않기 때문에 도커는 데이터를 영속적으로 보존하기 위한 두 가지 방법을 제공합니다.

  • 볼륨 (Volumes)
  • 바인드 마운트 (Bind mounts)

또한 도커는 도커 호스트 머신의 메모리에 파일을 저장하는 방법을 지원합니다. 이 파일들은 영속적이지 않지만, 속도, 보안 등의 장점을 가지고 있습니다. 리눅스에서 실행되는 도커는 해당 방법을 tmpfs 마운트를 통해 지원합니다.

  • tmpfs 마운트

각 방법의 특징들

어떤 마운트 타입을 선택하더라도 컨테이너는 모두를 같은 데이터로 보입니다. 하지만 마운트 타입마다 각각의 특징을 갖고 있습니다.

  • 볼륨은 도커에 의해 관리되는 도커 호스트의 파일시스템 특정 부분에 저장됩니다. 이 파일들은 오직 도커 프로세스만 수정할 수 있으며, 도커에 영속적인 데이터를 제공하는 가장 좋은 방법입니다.
  • 바인드 마운트는 도커 호스트 시스템의 어느 곳에나 존재할 수 있기 때문에, 중요한 파일이나 디렉토리를 바인드 마운트를 통해 컨테이너에 제공하기도 합니다. 이 파일들은 도커 호스트나 도커 컨테이너의 모든 프로세스에 의해 수정될 수도 있습니다.
  • tmpfs 마운트는 도커 호스트의 메모리에만 저장되며, 호스트 시스템의 파일 시스템에는 절대 저장되지 않습니다.

Volumes

볼륨은 도커에 의해 생성되고 관리됩니다. docker volume create 명령을 통해 볼륨을 명시적으로 생성할 수도 있고 도커가 컨테이너 또는 서비스를 생성하면서 생성할 수도 있습니다.

볼륨이 생성되면 도커 호스트의 파일시스템에 저장되며, 볼륨을 컨테이너에 마운트하면 이 디렉토리가 컨테이너에 마운트 되게 됩니다. 이는 바인드 마운트와도 매우 비슷하지만 도커에 의해 관리되며 호스트 머신의 여러 다른 프로세스 및 기능에 독립적이라는 점이 다릅니다.

볼륨은 컨테이너에 마운트되어 사용되지만 컨테이너에 독립적입니다. 하나의 볼륨은 여러 컨테이너에 동시에 마운트될 수 있으며, 또한 어떤 컨테이너에 마운트되지 않더라도 도커에서 삭제되지 않습니다. 사용되지 않는 볼륨은 docker volume prune 을 통해 삭제할 수 있습니다.

볼륨은 언제나 이름이 있어야 합니다. 이 이름은 생성할 때 지정할 수도 있고, 지정하지 않는다면 컨테이너에 볼륨이 처음 마운트될 때 도커가 랜덤으로 생성해줍니다.

볼륨은 데이터를 원격 호스트 또는 클라우드에 저장하기 위한 볼륨 드라이버를 사용할 수도 있습니다.

Bind mounts

바인드 마운트는 도커의 초창기부터 사용 가능했던 기능입니다. 바인드 마운트는 볼륨에 비해서는 제한적인 기능을 제공합니다. 바인드 마운트를 사용하면 호스트 머신의 파일 또는 디렉토리가 컨테이너에 마운트됩니다. 해당 파일 또는 디렉토리가 호스트에 존재하지 않는다면 직접 만들기 때문에 도커 호스트에 미리 존재할 필요는 없습니다.

⚠️ 바인드 마운트를 통해 민감한 데이터가 노출될 수 있습니다

바인드 마운트를 사용하는 사이드 이펙트 중 하나는 컨테이너 내부에서 실행중인 프로세스가 호스트의 파일 시스템을 변경할 수 있다는 것입니다. 중요한 파일 시스템이나 디렉토리를 생성하거나 접근할 수 있으며 이는 도커 호스트 머신의 다른 프로세스에 영향을 줄 수 있는 보안적으로 아주 영향이 큰 강력한 기능입니다.

tmpfs mounts

tmpfs 마운트는 영속적이지 않습니다. 이는 컨테이너가 동작중인 동안 일시적인 상태를 저장하거나 민감한 정보를 저장하기 위해 사용할 수 있습니다. 실제로 Docker Swarm 서비스는 tmpfs 마운트를 통해 서비스의 시크릿을 컨테이너에 마운트합니다.

사용 예시

Volumes의 사용 예시

  • 볼륨은 동시에 여러 컨테이너에 마운트될 수 있으므로 여러 컨테이너 간 데이터를 공유할 때 볼륨이 사용될 수 있습니다.
  • 컨테이너가 실행중에 특정 디렉토리 또는 파일 구조를 필요로 할 때 볼륨을 통해 디렉토리 또는 파일 구조의 존재를 보장할 수 있습니다.
  • 볼륨은 특정 드라이버를 사용할 수 있으므로 컨테이너의 데이터를 로컬이 아닌 원격 호스트 또는 클라우드 프로바이더에 저장하고 싶을 때 사용할 수 있습니다.
  • 볼륨은 레이어가 아닌 파일 시스템에 저장되기 때문에 데이터를 백업할 때 사용될 수 있습니다. 볼륨을 사용중인 컨테이너를 중지한 후 볼륨의 디렉토리를 백업할 수 있습니다.
  • 볼륨은 호스트가 아닌 리눅스 VM에 저장되고, 리눅스 VM은 읽고 쓰는데 적은 레이턴시와 높은 가용량을 가지고 있기 때문에 더 빠른 성능의 I/O가 필요한 경우 볼륨을 사용할 수 있습니다.
  • 볼륨은 리눅스 VM에 저장되며 파일 시스템의 정밀한 컨트롤을 제공하기 때문에 온전한 파일 시스템이 필요할 때 볼륨을 사용할 수 있습니다. 예를 들어 데이터베이스는 트랜젝션의 내구성을 위해 디스크 플러시 등 아주 정밀한 컨트롤을 필요로 하며 볼륨은 이를 제공해줄 수 있습니다.
    • 바인드 마운트는 macOS, Windows 등에 저장되므로 파일 시스템이 조금 다르게 동작합니다.

Bind mounts의 사용 예시

대부분의 경우 볼륨을 사용하는 것이 일반적이지만 바인드 마운트를 사용할 수 있는 경우가 종종 있습니다.

  • 호스트 머신에서 컨테이너로 설정 파일 등을 공유할 때 바인드 마운트를 사용할 수 있습니다. 이는 도커가 DNS resolution을 제공할 때 사용되는 방법입니다. 도커는 /etc/resolv.conf 를 각 컨테이너에 마운트합니다.
  • 빌드 결과물을 호스트 머신에서 컨테이너로 전달할 때 사용할 수 있습니다. 예를 들어 Maven 프로젝트의 target/ 을 컨테이너에 마운트하면 프로젝트를 빌드할 때마다 컨테이너는 그 결과물에 바로 접근할 수 있습니다.
    만약 이러한 방법으로 개발 환경을 만들었다면, 실제 프로덕션 환경의 도커 파일에서는 최종 빌드 결과물을 이미지에 복사하도록 해야 합니다. 프로덕션 환경에서의 바인드 마운트는 적절하지 않습니다.
  • 컨테이너에서 도커 호스트에 파일을 생성하거나 수정해야 하는 경우 바인드 마운트를 사용할 수 있습니다.

tmpfs mounts의 사용 예시

tmpfs 마운트는 데이터를 호스트나 컨테이너 모두에 영속적으로 보관하고 싶지 않을 때 사용할 수 있는 최고의 방법입니다. 이는 보안상의 이유일 수도 있고 성능을 위한 이유일 수도 있습니다. 예를 들어 컨테이너의 응용프로그램이 아주 큰 영속적이지 않은 상태 데이터를 작성해야 하는 경우 tmpfs 마운트를 통해 성능을 보호할 수 있습니다.

이미 존재하는 파일 또는 디렉토리에 마운트하는 경우

빈 볼륨을 마운트하는 경우

비어있는 볼륨을 컨테이너에 마운트하는 경우, 그리고 마운트되는 경로에 이미 파일 또는 디렉토리가 이미 존재하는 경우, 컨테이너의 파일과 디렉토리가 볼륨으로 복사됩니다. 마찬가지로 컨테이너를 시작하고 아직 존재하지 않는 볼륨을 지정하면 빈 볼륨이 자동으로 생성됩니다. 이 방법을 통해 컨테이너에 필요한 데이터를 다른 컨테이너에서 복사해올 수 있습니다.

바인드 마운트 또는 비어있지 않은 볼륨을 마운트하는 경우

비어있지 않은 볼륨을 컨테이너에 마운트하는 경우, 또는 바인드 마운트를 하는 경우, 그리고 마운트되는 경로에 이미 파일 또는 디렉토리가 이미 존재하는 경우, 마운트되는 파일 또는 디렉토리가 존재하는 파일들을 가리게 됩니다. 이는 리눅스에서 /mnt 에 파일을 생성한 후 USB가 /mnt 에 마운트되는 경우와 완벽히 같습니다. 이미 존재하는 파일들은 USB가 마운트 해제될 때까지 가려진 상태로 있으며, 가려진 파일들은 삭제되거나 변경되지 않습니다. 또한 어떠한 방법으로도 접근할 수 없습니다.

0개의 댓글