Docker를 사용하여 개발하다 보면 반드시 마주치게 되는 문제가 있습니다. 바로 컨테이너가 삭제되면 내부 데이터도 함께 사라진다는 점입니다. 개발 환경에서 데이터베이스 컨테이너를 재시작할 때마다 기존 데이터가 모두 사라진다면, 매번 초기 설정을 다시 해야 하는 번거로움이 발생합니다. Docker Volume은 이러한 문제를 해결하여 컨테이너의 생명주기와 독립적으로 데이터를 보존할 수 있게 해주는 기능입니다.
컨테이너 데이터의 근본적 한계
일시적 데이터 저장소로서의 컨테이너
Docker 컨테이너는 태생적으로 임시적인 특성을 가지고 있습니다. 컨테이너가 실행되는 동안 생성되는 모든 데이터는 컨테이너의 내부 파일 시스템에 저장되는데, 이는 컨테이너와 함께 생성되고 소멸됩니다.
이러한 특성은 무상태(stateless) 애플리케이션에서는 장점이 될 수 있지만, 데이터베이스나 파일 저장이 필요한 애플리케이션에서는 큰 제약이 됩니다. 개발 과정에서 컨테이너를 업데이트하거나 재시작해야 할 때마다 데이터가 사라지는 것은 매우 비효율적입니다.
데이터 영속성의 중요성
실제 개발 환경에서는 다음과 같은 상황들이 빈번하게 발생합니다. 애플리케이션 코드를 수정한 후 컨테이너를 재빌드하거나, 컨테이너 설정을 변경하기 위해 재시작하거나, 시스템 오류로 인해 컨테이너가 예기치 않게 종료되는 경우입니다. 이런 상황에서 데이터가 보존되지 않는다면 개발 효율성이 크게 떨어질 수밖에 없습니다.
Docker Volume의 개념과 작동 원리
Volume의 기본 개념
Docker Volume은 컨테이너에서 데이터를 영속적으로 저장하기 위한 메커니즘입니다. 핵심 아이디어는 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 시스템의 저장 공간을 공유하여 사용하는 것입니다.
이는 마치 USB 드라이브와 같은 개념으로 이해할 수 있습니다. 컴퓨터가 꺼져도 USB 드라이브의 데이터는 보존되는 것처럼, 컨테이너가 삭제되어도 볼륨에 저장된 데이터는 호스트에 그대로 남아있습니다.
Volume 마운트 문법
Docker Volume을 사용하기 위한 기본 문법은 다음과 같습니다.
docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
이 문법에서 -v 옵션이 볼륨 마운트를 의미하며, 콜론(:)을 기준으로 왼쪽은 호스트의 디렉토리, 오른쪽은 컨테이너 내부의 디렉토리를 나타냅니다.
Volume의 동작 메커니즘
Docker Volume의 동작 방식은 호스트 디렉토리의 존재 여부에 따라 달라집니다.

호스트 디렉토리가 이미 존재하는 경우, 해당 디렉토리가 컨테이너의 디렉토리를 덮어씌웁니다. 이는 기존에 작업하던 데이터를 컨테이너에서 계속 사용하고 싶을 때 유용합니다.

호스트 디렉토리가 존재하지 않는 경우, Docker가 자동으로 해당 경로에 디렉토리를 생성하고, 컨테이너 내부의 데이터를 호스트로 복사합니다. 이는 새로운 볼륨을 초기화할 때 발생하는 동작입니다.
실전 활용: MySQL 컨테이너 운영
Volume 없이 MySQL 실행하기
먼저 일반적인 MySQL 컨테이너 실행 방식을 살펴보겠습니다. MySQL 컨테이너는 루트 패스워드를 환경변수로 설정해야 정상적으로 실행됩니다.
docker run -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
여기서 -e 옵션은 컨테이너의 환경변수를 설정하는 데 사용됩니다. MySQL이 정상적으로 실행되면 컨테이너에 접속하여 데이터베이스를 생성해볼 수 있습니다.
# MySQL 컨테이너 접속
docker exec -it [MySQL 컨테이너 ID] bash
# MySQL 클라이언트 실행
mysql -u root -p
# 데이터베이스 생성 및 확인
mysql> create database mydb;
mysql> show databases;
이렇게 생성한 데이터베이스는 컨테이너가 실행되는 동안에만 존재합니다. 컨테이너를 삭제하고 새로 생성하면 이전에 만든 mydb 데이터베이스는 완전히 사라집니다.

Volume을 활용한 데이터 영속화
이제 Volume을 사용하여 MySQL 데이터를 영속적으로 보존하는 방법을 알아보겠습니다. 먼저 호스트에서 데이터를 저장할 디렉토리를 준비합니다.
# 볼륨 저장공간으로 사용할 폴더 생성
cd /Users/seungyeon/Documents/Develop
mkdir docker-mysql
# 현재 위치의 절대 경로 확인
pwd
MySQL 컨테이너의 데이터 디렉토리는 /var/lib/mysql입니다. 이 경로를 호스트의 디렉토리와 연결하여 데이터를 보존할 수 있습니다.
docker run -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 \
-v /Users/seungyeon/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql \
-d mysql
이제 동일한 방식으로 데이터베이스를 생성한 후, 컨테이너를 삭제하고 재생성해보겠습니다.
# 데이터베이스 생성 후 컨테이너 종료
docker stop [MySQL 컨테이너 ID]
docker rm [MySQL 컨테이너 ID]
# 동일한 볼륨 설정으로 새 컨테이너 생성
docker run -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 \
-v /Users/seungyeon/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql \
-d mysql
# 데이터베이스 확인
mysql> show databases; # 이전에 생성한 mydb가 그대로 존재
이번에는 컨테이너를 재생성했음에도 불구하고 이전에 생성한 데이터베이스가 그대로 보존되어 있는 것을 확인할 수 있습니다.

다양한 데이터베이스 적용 사례
PostgreSQL 볼륨 설정
PostgreSQL 역시 동일한 방식으로 볼륨을 설정할 수 있습니다. PostgreSQL의 데이터 디렉토리는 /var/lib/postgresql/data입니다.
cd /Users/seungyeon/Documents/Develop
mkdir docker-postgresql
docker run -e POSTGRES_PASSWORD=root -p 5432:5432 \
-v /Users/seungyeon/Documents/Develop/docker-postgresql/postgresql_data:/var/lib/postgresql/data \
-d postgres
MongoDB 볼륨 설정
MongoDB는 좀 더 복잡한 환경변수 설정이 필요하지만, 볼륨 사용법은 동일합니다. MongoDB의 데이터 디렉토리는 /data/db입니다.
cd /Users/seungyeon/Documents/Develop
mkdir docker-mongodb
docker run -e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=root \
-p 27017:27017 \
-v /Users/seungyeon/Documents/Develop/docker-mongodb/mongodb_data:/data/db \
-d mongo
Volume 사용 시 주의사항
기존 디렉토리 존재 시 문제점
Volume 사용 시 가장 주의해야 할 점은 호스트의 디렉토리가 이미 존재할 경우입니다. 특히 MySQL에서 이미 mysql_data 폴더가 존재하는 상태에서 새로운 컨테이너를 생성하려고 하면 예기치 못한 오류가 발생할 수 있습니다.
이는 Docker Volume의 동작 원리 때문입니다. 호스트의 디렉토리가 이미 존재할 경우, 해당 디렉토리의 내용이 컨테이너 디렉토리를 덮어씌우게 됩니다. 만약 기존 폴더에 호환되지 않는 데이터가 들어있다면 컨테이너가 정상적으로 시작되지 않을 수 있습니다.
환경변수 변경의 제한사항
MySQL에서 MYSQL_ROOT_PASSWORD 값을 변경해서 새로 컨테이너를 실행해도 실제 비밀번호는 변경되지 않습니다. 이는 볼륨 생성 시점에 모든 사용자 정보와 인증 데이터가 저장되기 때문입니다.
따라서 데이터베이스 설정을 변경하고 싶다면 기존 볼륨을 삭제하고 새로 생성하거나, 데이터베이스 내부에서 직접 설정을 변경해야 합니다.
경로 설정의 중요성
Volume 설정 시 절대 경로를 정확히 입력하는 것이 중요합니다. 상대 경로를 사용하거나 경로가 잘못되면 의도하지 않은 위치에 데이터가 저장되거나, 볼륨이 제대로 마운트되지 않을 수 있습니다.
마무리
Docker Volume은 컨테이너 기반 개발에서 데이터 영속성을 보장하는 핵심 기술입니다. 특히 데이터베이스와 같이 상태를 유지해야 하는 서비스를 컨테이너로 운영할 때는 필수적인 기능입니다. Volume을 올바르게 활용하면 개발 환경의 일관성을 유지하면서도 데이터 손실 없이 안전하게 컨테이너를 관리할 수 있습니다.
'Infra > Docker' 카테고리의 다른 글
| Docker Compose 2 (3) | 2025.06.17 |
|---|---|
| Docker Compose 1 (7) | 2025.06.16 |
| Dockerfile (3) | 2025.06.13 |
| 자주 사용되는 Docker CLI (6) | 2025.06.07 |
| Docker 기본 개념 (2) | 2025.06.05 |