도커 컨테이너의 데이터 관리 개요
컨테이너 기반 애플리케이션 배포 과정에서 가장 주의해야 할 점은 데이터의 생명주기입니다. 일반적인 컨테이너는 삭제되거나 재부팅될 경우 내부 파일 시스템에 저장된 정보가 함께 소실되는 휘발성 특성을 가집니다. 이러한 문제를 해결하고, 생성된 데이터를 영구적으로 보관하며 다른 컴포넌트와 정보를 교환하기 위해 도커는 다양한 스토리지 솔루션을 제공합니다.
주요한 두 가지 접근 방식을 통해 이 문제를 해결할 수 있습니다.
- 외부화된 데이터 볼륨 (Data Volumes)
- 데이터 전용 컨테이너 (Data Volume Containers)
데이터 볼륨의 구성 및 활용
데이터 볼륨은 컨테이너 내부가 아닌 호스트 시스템이나 도커 매니저가 제어하는 영역에 저장 공간을 할당하여 데이터를 영구화하는 메커니즘입니다. 이는 단일 인스턴스를 넘어선 복수의 컨테이너 간의 자원 공유와 안전성을 보장합니다.
주요 특징은 다음과 같습니다:
- 여러 컨테이너 예체가 동일한 스토리지 공간에 접근 가능
- 볼륨 내 파일 직접 수정 시 변경 사항이 즉시 반영
- 베이스 이미지의 버전 업데이트로 인해 기존 데이터 손실 방지
- 모든 컨테이너가 종료되더라도 볼륨 자체는 유지됨
볼륨 할당 실행
docker run 명령어에서 -v 플래그를 사용하여 새 볼륨을 정의하거나 기존 것을 연결할 수 있습니다. 하나의 명령문 내에 여러 볼륨 경로를 지정한 후 시작할 수도 있습니다. 예를 들어 웹 서비스 이미지를 구동하면서 특정 디렉토리를 볼륨으로 연결하는 과정은 아래와 같습니다.
$ docker run -dt --name frontend-service -v /app-storage myregistry/web-project:latest ./run.py
이와 같이 실행하면 컨테이너 실행 환경 내에서 /app-storage 경로에 대응하는 독립적인 볼륨이 생성됩니다. 또한 Dockerfile 작성 단계에서 VOLUME 지시어를 사용하면 해당 이미지로 만든 모든 컨테이너에 자동으로 초기화되어 사용할 수 있는 공간을 설정할 수 있습니다.
호스트 디렉터리 바인딩 (Bind Mount)
볼륨 명령은 도커가 관리하는 무명 디렉터리에만 해당하는 것이 아닙니다. 호스트 운영체제의 특정 폴더를 컨테이너 내부에 직접 매핑하는 바인드 마운트 역시 동일하게 적용 가능합니다.
$ docker run -d --publish-all --name dev-server -v /home/user/project/src:/srv/app backend-image python serve.py
위 명령어는 로컬 호스트의 /home/user/project/src 내용을 컨테이너 내부의 /srv/app 위치에 연결합니다. 개발 테스트 환경에서는 매우 유용한 기법으로, 소스 코드를 호스트 상에서 수정하면 컨테이너 내부에서 즉시 확인 가능하므로 빌드 과정을 생략할 수 있습니다. 이때 호스트 측 경로명은 절대 경로로 명시해야 하며, 지정된 디렉터리가 없을 경우 도커 데몬이 자동으로 생성해 줍니다.
기본적으로 읽기/쓰기 권한이 부여되나, 보안 강화를 위해 읽기 전용(RW Only) 모드로 제한할 수도 있습니다.
$ docker run -dt --name secure-node -v /etc/configs:/opt/conf:ro static-page-generator nginx
여기서 마지막 파라미터 :ro는 Read-Only 옵션을 의미하며, 컨테이너 내부에서의 파일 수정을 차단하여 설정값을 보호합니다.
데이터 볼륨 컨테이너 아키텍처
복수의 애플리케이션 간에 대용량 데이터를 분산하여 관리해야 하거나, 임시 컨테이너를 사용하여 데이터를 처리한 뒤 소멸시키는 경우가 있습니다. 이때 별도의 이름이 붙은 데이터 전용 컨테이너를 생성하여 거점처럼 사용하는 패턴이 효과적입니다.
먼저 주 데이터를 보유할 용량의 컨테이너를 생성합니다.
$ docker run -d -v /mnt/dbsnapshot --id store-backend legacy-postgres:9.6
이후 다른 작업 컨테이너들이 이 저장소를 공유하도록 --volumes-from 옵션을 활용합니다.
$ docker run -d --name worker-01 --volumes-from store-backend legacy-postgres:9.6
$ docker run -d --name worker-02 --volumes-from store-backend legacy-postgres:9.6
이렇게 하면 store-backend 가 보유한 모든 볼륨이 worker-01 과 worker-02 에 투명하게 노출됩니다. 또한, --volumes-from 를 중첩하여 사용하지 않고 이미 연결된 컨테이너들을 참조사슬 형태로 확장할 수 있습니다.
데이터 백업 및 이식 절차
볼륨을 활용한 또 하나의 강력한 시나리오는 일회성 작업을 통한 데이터 아카이빙입니다. 별도의 유틸리티 컨테이너를 일시적으로 구동하여 스크립트를 수행하고 종료함으로써 안정적으로 백업이나 복원을 진행할 수 있습니다.
백업 작업의 경우, 저장 대상 컨테이너의 볼륨과 로컬 디스크를 동시에 연결하고 압축 도구를 실행합니다.
$ docker run --rm --volumes-from store-backend -v /tmp/archive:/target alpine tar czvf /target/db_backup.tar.gz /mnt/dbsnapshot
이 명령어는 store-backend 의 데이터를 가져와 호스트의 /tmp/archive 경로에 .tar.gz 파일로 변환합니다. 작업 완료 시 컨테이너는 자동으로 제거되며 파일만 남게 됩니다.
반대로 복구 과정이 필요할 때는 새로운 컨테이너를 띄우고 압축 파일을 추출 명령어로 되돌리면 됩니다.
$ docker run -d -v /mnt/dbsnapshot --id restore-target alpine sleep infinity
$ docker run --rm --volumes-from restore-target -v /tmp/archive:/source busybox tar xzvf /source/db_backup.tar.gz -C /mnt
위와 같은 프로세스를 자동화 도구와 결합하여 정기적인 스냅샷 생성이나 서버 마이그레이션 작업에 적용할 수 있습니다.