MLOps/Docker

[Docker#8] 볼륨(Volume)이란?

j.d 2025. 5. 8. 14:26

Docker를 활용하면 다양한 서비스를 손쉽게 컨테이너로 띄울 수 있습니다. 하지만, 그만큼 컨테이너가 갖는 단점도 분명 존재하죠. 특히 데이터의 영속성 문제는 처음 도커를 사용하는 입장에서 꼭 짚고 넘어가야 할 중요한 포인트입니다.

 

이번 글에서는 Docker Volume(도커 볼륨) 이 무엇인지, 왜 필요한지 소개하도록 하겠습니다.

 

 

기존 방식의 한계

Docker는 새로운 코드나 설정 변경이 있을 때마다 기존 컨테이너를 삭제하고 새로 생성하는 방식으로 업데이트를 진행합니다. 이 방식은 깔끔하고 효율적이지만, 한 가지 큰 단점이 있습니다:

컨테이너가 삭제되면, 그 안의 데이터도 함께 삭제된다.

 

예를 들어, MySQL 컨테이너를 실행해 데이터를 저장했더라도, 컨테이너를 삭제하면 해당 데이터베이스도 통째로 사라져 버립니다.

 

 

Docker Volume이란?

Docker Volume(볼륨) 은 이러한 문제를 해결하기 위한 Docker의 내장 기능입니다. 간단히 말해, 컨테이너와는 별도로 호스트 머신의 데이터를 저장할 수 있는 방법으로 아래와 같은 특징을 가집니다.

 

 

  • 볼륨은 호스트의 디렉토리를 사용하여 데이터를 보존합니다.
  • 컨테이너가 삭제되어도, 볼륨에 저장된 데이터는 남아있습니다.
  • 여러 컨테이너가 동일한 볼륨을 공유할 수 있습니다.

 

출처: https://blog.devops.dev/inspect-volume-sizes-in-docker-5c9af8cc8dca

 

사용법

docker run -v [호스트_경로]:[컨테이너_경로] [이미지명]:[태그]

 

docker run -v /Users/username/mysql_data:/var/lib/mysql mysql # 예시

※ /var/lib/mysql은 MySQL이 데이터를 저장하는 기본 경로입니다.

Docker Hub 내 MySQL official image document

 

실습 : Docker로 MySQL 실행하고 볼륨 연결하기

볼륨 연결 x

docker run -e MYSQL_ROOT_PASSWORD=[패스워드] -p 3306:3306 -d mysql

# 컨테이너 접속
docker exec -it [컨테이너_ID] bash
  • -e: 환경변수 지정
echo $MYSQL_ROOT_PASSWORD

설정된 환경변수 확인

# 컨테이너 내 MySQL 실행
mysql -u root -p

# 현재 데이터베이스 조회
show databases;

# 데이터베이스 생성
create database tempDB;

 

이제 컨테이너를 삭제하고 똑같은 과정을 통해서 현재 데이터베이스를 조회해보면 아래와 같이 아까 생성했던 tempDB가 없는 것을 알 수 있습니다.

삭제 후 재생성된 MySQL 컨테이너 내 데이터베이스

 

볼륨 연결 o

# 공유 폴더 준비
mkdir [경로]

※ 해당 경로는 사전에 생성하지 않는 것이 안전합니다. 

docker run -e MYSQL_ROOT_PASSWORD=[패스워드] -p 3306:3306 -v [경로]:/var/lib/mysql -d mysql

# 주의(윈도우)
docker run -e MYSQL_ROOT_PASSWORD=[패스워드] -p 3306:3306 -v "[경로]:/var/lib/mysql" -d mysql

 

  • -v: 호스트와 컨테이너 간 볼륨 설정

앞선 과정과 동일하게 tempDB를 생성해주겠습니다.

 

 

그리고 해당 컨테이너를 삭제 후 볼륨 경로를 지정해서 다시 생성해주면 해당 컨테이너 내 tempDB가 그대로 남아있는 것을 알 수 있습니다.

 

추가적으로 볼륨 폴더에 임시 데이터를 넣어주고 컨테이너 내 폴더를 확인해보겠습니다.

cd /var/lib/mysql # 호스트 폴더와 연결된 컨테이너 내 폴더
ls # 데이터 목록 반환

 

다음과 같이 방금 로컬에서 넣어준 데이터가 폴더 내 동일하게 존재하는 것을 알 수 있습니다.

 

 

주의

컨테이너를 새로 띄우며 비밀번호를 바꿨는데도 MySQL이전 비밀번호로 접속이 되는 경우가 있습니다.

 

초기 비밀번호는 최초 실행 시 /var/lib/mysql에 저장되고, 그 이후로는 변경되지 않기 때문입니다.
이미 호스트 볼륨에 데이터가 존재한다면, 새로운 비밀번호 설정은 무시됩니다.