Post

[Docker] 06-Docker 스토리지와 데이터 관리

[Docker] 06-Docker 스토리지와 데이터 관리

도커 스토리지와 데이터 관리

컨테이너는 기본적으로 데이터를 “휘발성”으로 다룬다. 도커의 파일 시스템 구조(Union File System)와 Copy-on-Write 전략을 이해하고, 데이터를 영구적으로 보존하기 위한 도커 볼륨(Docker Volume)바인드 마운트(Bind Mount)의 차이점 및 활용법을 다룬다.

도커 컨테이너 파일 시스템

모든 컨테이너는 독립된 파일 시스템을 갖는다. 도커는 유니언 파일 시스템(Union File System) 기술을 사용하여 여러 개의 파일 시스템 레이어를 하나의 논리적인 드라이브처럼 합쳐서 보여준다. 이 구조는 크게 두 가지 영역으로 나뉜다.

  • 이미지 레이어 (Image Layer): 읽기 전용(Read-Only). 이미지를 구성하는 모든 레이어이며, 같은 이미지를 사용하는 모든 컨테이너가 이 데이터를 공유한다.
  • 컨테이너 레이어 (Container Layer): 읽기/쓰기(Read-Write). 컨테이너가 생성될 때 최상단에 추가되는 레이어다. 컨테이너가 실행 중에 생성하거나 변경한 데이터는 모두 이곳에 저장된다.

CoW (Copy-on-Write) 전략 컨테이너는 효율성을 위해 Copy-on-Write 전략을 사용한다.

  1. 읽기: 하위 이미지 레이어에 있는 파일을 그대로 읽는다.
  2. 쓰기: 이미지 레이어에 있는 파일을 수정해야 할 경우, 해당 파일을 최상단의 컨테이너 레이어로 복사한 뒤 수정을 가한다.
  3. 결과: 원본 이미지 레이어는 변하지 않으며, 수정된 내용은 해당 컨테이너에서만 유효하다.

하지만 컨테이너 레이어는 컨테이너가 삭제되면 함께 사라지는 휘발성 데이터다. 따라서 데이터베이스의 데이터나 로그처럼 보존해야 하는 데이터는 별도의 저장소 관리 방법이 필요하다.

데이터 영속성을 위한 스토리지 옵션(바인드 마운트)

도커 컨테이너의 파일 시스템은 컨테이너가 삭제되면 함께 사라진다. 따라서 데이터를 영구적으로 보존하거나, 다른 컨테이너와 데이터를 공유하기 위해서는 별도의 스토리지 마운트 기능이 필요하다.

스토리지를 구성하는 방식은 데이터의 위치와 용도에 따라 크게 3가지로 구분된다.

  1. 로컬 바인드 마운트 : 호스트 컴퓨터의 파일 시스템에 있는 특정 디렉터리나 파일을 컨테이너 내부로 직접 연결
    • 작동 원리: 호스트 컴퓨터(내 PC 또는 서버)의 물리적 경로와 컨테이너의 가상 경로를 1:1로 매핑
    • 주요 용도: 개발자가 로컬 환경에서 코드를 수정하면 컨테이너에 즉시 반영되게 하거나, 설정 파일을 컨테이너에 주입할 때 사용
    • 특징: 호스트와 컨테이너가 데이터를 실시간으로 공유할 수 있다. 하지만 호스트의 파일 시스템 구조(OS, 디렉터리 경로 등)에 의존하므로 이식성이 떨어짐
  2. 분산 바인드 마운트 : 네트워크 스토리지(NAS, 클라우드 스토리지 등)를 호스트 운영체제에 먼저 마운트한 뒤, 그 경로를 다시 컨테이너에 바인드 마운트
    • 작동 원리: 네트워크상의 단일 저장소를 여러 호스트 컴퓨터가 공유하고, 컨테이너는 이 공유된 경로를 바인드 마운트하여 사용
    • 주요 용도: 여러 대의 서버로 구성된 도커 스웜(Swarm)이나 클러스터 환경에서 가용성을 높이기 위해 사용한
    • 특징: 컨테이너가 실행되는 서버(노드)가 변경되더라도, 모든 서버가 동일한 네트워크 스토리지를 바라보고 있다면 데이터에 접근할 수 있다. 이를 통해 컨테이너는 물리적 위치에 구애받지 않고 데이터를 유지 가능
  3. 볼륨 마운트 : 도커 엔진이 직접 관리하는 스토리지 영역(도커 볼륨)을 컨테이너에 연결하는 방식
    • 작동 원리: 호스트의 파일 시스템 구조와 무관하게, 도커가 관리하는 별도의 공간에 데이터를 저장하고 컨테이너와 연결
    • 주요 용도: 데이터베이스의 데이터 파일, 애플리케이션의 로그 등 영구적으로 보존해야 하는 데이터를 저장할 때 표준적으로 사용한
    • 특징:
    • 안전성: 실수로 호스트의 파일을 지우거나 수정할 위험이 적음
    • 이식성: 호스트의 경로에 의존하지 않으므로, 어떤 운영체제나 서버 환경에서도 동일하게 작동
    • 보존성: 컨테이너를 삭제하거나 업데이트(교체)하더라도 볼륨에 저장된 데이터는 그대로 유지되므로, 새로운 컨테이너에 다시 연결하여 서비스를 지속 가능

도커 볼륨

도커 볼륨은 도커에서 스토리지를 다루는 단위이다. 도커 볼륨은 컨테이너와 독립적으로 존재하며 별도의 생애주기를 갖는다. 컨테이너를 삭제해도 볼륨은 남아있으며, 이를 다른 컨테이너에 연결하여 데이터를 재사용할 수 있다.

Dockerfile 내 VOLUME 인스트럭션은 “이 경로는 볼륨으로 쓰겠다”는 선언일 뿐, 실제 볼륨의 이름을 지정하지 않으면 해시값으로 된 익명 볼륨(Anonymous Volume)이 생성된다. 이는 관리가 어렵기 때문에, 명시적으로 이름을 가진 볼륨(Named Volume)을 생성하여 관리하는 것이 좋다.

볼륨 생성 및 연결 예시

1
2
3
4
5
# 1. 'my-db-data'라는 이름의 도커 볼륨 생성
docker volume create my-db-data

# 2. 컨테이너 실행 시 볼륨 연결 (-v [볼륨이름]:[컨테이너경로])
docker container run -d -v my-db-data:/var/lib/mysql --name db-v1 mysql:5.7

도커 볼륨은 컨테이너 간 파일 공유보다는 컨테이너 업데이트(교체) 시 데이터를 보존하기 위한 용도로 사용한다.

  1. 기존 컨테이너 삭제: db-v1 컨테이너를 중지하고 삭제한다. 볼륨 my-db-data는 삭제되지 않고 남아있다.
  2. 새 컨테이너 실행: 새로운 버전(예: mysql:8.0)의 컨테이너를 실행하면서 기존과 동일한 볼륨을 마운트한다.
  3. 결과: db-v2 컨테이너는 my-db-data에 저장된 이전 데이터를 그대로 읽어들여 서비스를 지속한다.
This post is licensed under CC BY 4.0 by the author.