Docker Volume이란? 데이터 영구 저장과 Bind Mount·Named Volume 차이 완벽 이해

Docker를 처음 사용할 때 가장 많이 겪는 문제 중 하나는 컨테이너를 삭제하면 데이터도 함께 사라진다는 점입니다.

예를 들어 MySQL 컨테이너에 중요한 데이터를 저장했는데 컨테이너를 삭제하자 데이터베이스까지 모두 삭제되는 경우가 있습니다.

이 문제를 해결하기 위해 Docker에서는 Volume 기능을 제공합니다.

이번 글에서는 Docker Volume의 개념부터 Bind Mount와 Named Volume의 차이, 데이터 영구 저장 방법, 실무 활용 예제까지 자세히 알아보겠습니다.

Docker Volume이란?

Docker Volume은 컨테이너와 독립적으로 데이터를 저장하는 기능입니다.

컨테이너가 삭제되어도 Volume은 유지되므로 데이터를 계속 사용할 수 있습니다.

구조는 다음과 같습니다.

Application

↓

Container

↓

Docker Volume

↓

Host Storage

Volume은 컨테이너의 생명주기와 별도로 관리됩니다.

Volume이 필요한 이유

컨테이너 내부에 저장한 데이터는 기본적으로 영구적이지 않습니다.

예를 들어

docker run mysql

를 실행하여 데이터를 저장한 후 컨테이너를 삭제하면 데이터도 함께 삭제됩니다.

하지만 Volume을 사용하면

Container 삭제

↓

Volume 유지

↓

새 Container 연결

↓

기존 데이터 사용

이 가능합니다.

Docker의 저장 방식

Docker는 크게 세 가지 방식으로 데이터를 저장할 수 있습니다.

  • Container Writable Layer
  • Bind Mount
  • Named Volume

실무에서는 대부분 Bind Mount와 Named Volume을 사용합니다.

Container Writable Layer

기본적으로 컨테이너 내부 파일은 Writable Layer에 저장됩니다.

Container

↓

Writable Layer

하지만 컨테이너 삭제 시 함께 삭제됩니다.

따라서 중요한 데이터 저장에는 적합하지 않습니다.

Bind Mount란?

Bind Mount는 호스트의 특정 디렉터리를 컨테이너와 연결하는 방식입니다.

예를 들어

docker run -v /home/user/data:/app/data nginx

의미는 다음과 같습니다.

Host

/home/user/data

↓

Container

/app/data

호스트에서 파일을 수정하면 컨테이너에서도 즉시 반영됩니다.

Bind Mount의 장점

다음과 같은 장점이 있습니다.

  • 실시간 파일 수정
  • 개발 환경에 적합
  • 호스트에서 직접 접근 가능
  • 별도 Volume 생성 불필요

웹 개발이나 소스 코드 테스트 시 자주 사용됩니다.

Bind Mount의 단점

단점도 있습니다.

  • 운영체제 경로 의존
  • 권한 문제 발생 가능
  • 서버 이동 시 경로 변경 필요

운영 환경에서는 Named Volume을 선호하는 경우가 많습니다.

Named Volume이란?

Named Volume은 Docker가 자체적으로 관리하는 저장 공간입니다.

예를 들어

docker volume create mysql-data

를 실행한 후

docker run -v mysql-data:/var/lib/mysql mysql

를 실행하면

Docker

↓

mysql-data

↓

MySQL Data

형태로 저장됩니다.

Named Volume의 장점

Named Volume은 다음과 같은 장점이 있습니다.

  • Docker가 자동 관리
  • 운영 환경에 적합
  • 백업이 쉬움
  • 컨테이너 삭제 후에도 유지
  • 여러 컨테이너에서 공유 가능

실무에서는 데이터베이스 저장소로 많이 사용됩니다.

Volume 생성

Named Volume 생성

docker volume create myvolume

확인

docker volume ls

예시

DRIVER

local

VOLUME NAME

myvolume

Volume 상세 정보

docker volume inspect myvolume

확인 가능한 정보

  • Mount Point
  • Driver
  • Name
  • Labels

JSON 형식으로 출력됩니다.

Volume 사용

컨테이너 실행 시 연결합니다.

docker run -d \
-v myvolume:/data \
ubuntu

컨테이너 내부 /data는 Volume과 연결됩니다.

Volume 삭제

사용하지 않는 Volume 삭제

docker volume rm myvolume

현재 사용 중인 Volume은 삭제되지 않습니다.

사용하지 않는 Volume 정리

불필요한 Volume을 한 번에 삭제합니다.

docker volume prune

주의

사용하지 않는 모든 Volume이 삭제됩니다.

Docker Compose에서 Volume 사용

Compose에서는 다음과 같이 작성합니다.

services:

  mysql:

    image: mysql:8.4

    volumes:
      - mysql-data:/var/lib/mysql

volumes:

  mysql-data:

Compose가 자동으로 Volume을 생성합니다.

MySQL 데이터 영구 저장

대표적인 실무 예제입니다.

docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4

MySQL 컨테이너를 삭제해도 Volume은 유지됩니다.

새 컨테이너를 연결하면 기존 데이터베이스를 그대로 사용할 수 있습니다.

Nginx 웹 파일 연결

Bind Mount 예제입니다.

docker run -d \
-p 80:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx

현재 디렉터리의 html 폴더가 웹 루트와 연결됩니다.

파일을 수정하면 웹페이지도 즉시 변경됩니다.

Volume 저장 위치

Linux에서는 일반적으로 다음 위치에 저장됩니다.

/var/lib/docker/volumes/

Docker가 자동으로 관리합니다.

직접 수정하는 것은 권장되지 않습니다.

Volume 백업

Volume 내용을 백업할 수 있습니다.

예를 들어

docker run --rm \
-v myvolume:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/myvolume.tar.gz /data

백업 파일을 생성하여 다른 서버에서도 사용할 수 있습니다.

Bind Mount와 Named Volume 비교

항목Bind MountNamed Volume
저장 위치사용자가 지정Docker 관리
운영체제 의존성있음없음
개발 환경매우 적합적합
운영 환경보통매우 적합
데이터 관리직접Docker 자동 관리

실무에서 자주 사용하는 명령어

Volume 생성

docker volume create myvolume

Volume 목록

docker volume ls

Volume 정보

docker volume inspect myvolume

Volume 삭제

docker volume rm myvolume

사용하지 않는 Volume 삭제

docker volume prune

Volume 연결

docker run -v myvolume:/data ubuntu

Bind Mount 연결

docker run -v /host/data:/app/data ubuntu

실무 사례

온라인 쇼핑몰 서비스를 운영한다고 가정해 보겠습니다.

MySQL 컨테이너를 실행하면서 상품 정보와 주문 데이터를 저장해야 합니다.

운영자는 mysql-data라는 Named Volume을 생성한 뒤 MySQL 컨테이너에 연결합니다.

이후 컨테이너를 업데이트하거나 새 버전으로 교체하더라도 Volume은 그대로 유지되므로 데이터는 안전하게 보존됩니다.

반면 웹 애플리케이션의 소스 코드는 Bind Mount를 사용하여 개발자가 로컬에서 파일을 수정하면 컨테이너에 즉시 반영되도록 구성합니다.

이처럼 운영 환경에서는 Named Volume, 개발 환경에서는 Bind Mount를 적절히 조합하는 것이 일반적인 방법입니다.

자주 묻는 질문

Volume과 Container는 어떤 관계인가요?

Volume은 컨테이너와 독립적으로 존재합니다. 컨테이너를 삭제해도 Volume은 그대로 유지되며, 새로운 컨테이너에서 다시 사용할 수 있습니다.

Bind Mount와 Named Volume 중 어느 것을 사용하는 것이 좋나요?

개발 환경에서는 실시간 파일 변경이 가능한 Bind Mount가 편리합니다. 운영 환경에서는 Docker가 관리하는 Named Volume이 더 안정적이고 관리하기 쉽습니다.

Volume을 삭제하면 데이터도 함께 삭제되나요?

네. Volume을 삭제하면 해당 Volume에 저장된 데이터도 함께 삭제됩니다. 중요한 데이터는 삭제 전에 반드시 백업해야 합니다.

마무리

Docker Volume은 컨테이너와 데이터를 분리하여 안전하게 보관할 수 있는 핵심 기능입니다. 특히 데이터베이스와 같이 중요한 정보를 다루는 서비스에서는 반드시 Volume을 사용해야 하며, 개발 환경에서는 Bind Mount, 운영 환경에서는 Named Volume을 적절히 활용하는 것이 좋은 설계 방법입니다.

댓글 남기기