Docker를 활용하면 다양한 서비스를 손쉽게 컨테이너로 띄울 수 있습니다. 하지만, 그만큼 컨테이너가 갖는 단점도 분명 존재하죠. 특히 데이터의 영속성 문제는 처음 도커를 사용하는 입장에서 꼭 짚고 넘어가야 할 중요한 포인트입니다.
이번 글에서는 Docker Volume(도커 볼륨) 이 무엇인지, 왜 필요한지 소개하도록 하겠습니다.
기존 방식의 한계
Docker는 새로운 코드나 설정 변경이 있을 때마다 기존 컨테이너를 삭제하고 새로 생성하는 방식으로 업데이트를 진행합니다. 이 방식은 깔끔하고 효율적이지만, 한 가지 큰 단점이 있습니다:
컨테이너가 삭제되면, 그 안의 데이터도 함께 삭제된다.
예를 들어, MySQL 컨테이너를 실행해 데이터를 저장했더라도, 컨테이너를 삭제하면 해당 데이터베이스도 통째로 사라져 버립니다.
Docker Volume이란?
Docker Volume(볼륨) 은 이러한 문제를 해결하기 위한 Docker의 내장 기능입니다. 간단히 말해, 컨테이너와는 별도로 호스트 머신의 데이터를 저장할 수 있는 방법으로 아래와 같은 특징을 가집니다.
- 볼륨은 호스트의 디렉토리를 사용하여 데이터를 보존합니다.
- 컨테이너가 삭제되어도, 볼륨에 저장된 데이터는 남아있습니다.
- 여러 컨테이너가 동일한 볼륨을 공유할 수 있습니다.
사용법
docker run -v [호스트_경로]:[컨테이너_경로] [이미지명]:[태그]
docker run -v /Users/username/mysql_data:/var/lib/mysql mysql # 예시
※ /var/lib/mysql은 MySQL이 데이터를 저장하는 기본 경로입니다.
실습 : 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가 없는 것을 알 수 있습니다.
볼륨 연결 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에 저장되고, 그 이후로는 변경되지 않기 때문입니다.
이미 호스트 볼륨에 데이터가 존재한다면, 새로운 비밀번호 설정은 무시됩니다.
'MLOps > Docker' 카테고리의 다른 글
[Docker#10] Dockerfile COPY (0) | 2025.05.12 |
---|---|
[Docker#9] Dockerfile이란? (0) | 2025.05.12 |
[Docker#7] 컨테이너(Container) 내부 접속 (0) | 2025.04.29 |
[Docker#6] 컨테이너(Container) 로그 조회 (0) | 2025.04.29 |
[Docker#5] 컨테이너(Container) 조회 / 중지 / 삭제 (0) | 2025.04.29 |