Docker Volume 이란?
Docker 컨테이너의 데이터는 휘발성으로 존재한다. 컨테이너가 삭제된다면 그 안에 있던 데이터도 모두 삭제가 된다.
이 때 Docker Volume을 사용하게 된다면 컨테이너 외부에서도 데이터가 저장되기 때문에 데이터 영속성을 부여할 수 있다. 그래서 컨테이너를 삭제하고 다시 생성해도 그 안에 있던 데이터들을 그대로 복원이 가능하다.
저장 방식
Docker Volume에서 사용하고 있는 저장 방식은 Volume, Bind Mount, tmpfs Mount 이렇게 3가지 방식이 존재한다.
1. Volume
•
docker volume create 명령어로 볼륨 생성 가능
•
(Linux 기준) Docker가 /var/lib/docker/volumes 아래에 저장
•
컨테이너끼리 공유 가능
•
Docker가 직접 관리
docker volume create my_data
Bash
복사
•
docker volume create : 새로운 Docker 볼륨을 생성하는 명령어
•
my_data : 생성할 볼륨의 이름
docker run -d --mount type=volume,source=my_data,target=/app/data nginx
Bash
복사
•
docker run : docker 컨테이너 실행
•
-d : 백그라운드 모드로 실행
•
--mount : 볼륨 마운트
◦
type=volume : type은 volume으로 지정 ( volume, bind, tmpfs 중 택 1 )
◦
source=my_data : 사용할 volume 이름
◦
target=/app/data : 컨테이너 측 디렉토리
•
nginx : nginx 이미지를 사용
또는 --mount를 -v로 변경해서 아래와 같이 명령어 입력 가능
docker run -d -v my_data:/app/data nginx
Bash
복사
2. Bind Mount
•
호스트 OS의 저장 경로를 그대로 컨테이너에 연결
•
호스트 OS가 직접 저장을 제어
예시) docker run -v [호스트 OS의 저장 경로]:[컨테이너 속 저장 데이터 경로]
docker run -v C:\jeygeon\docker-mysql\mysql-data:/var/lib/mysql
Bash
복사
•
실시간으로 양방향 바인딩이 가능하여 개발 시 자주 사용된다.
(예시. VSCode에서 로컬 코드를 수정하여 컨테이너에 바로 반영)
3. tmpfs Mount
•
메모리(RAM) 기반 저장 방식이며, 디스크 사용은 하지 않는다
•
컨테이너가 종료되면 데이터 사라진다.
Docker 볼륨 유형 비교
항목 | Volume | Bind Mount | tmpfs |
저장 위치 | Docker 내부 | 호스트 디렉토리 | 메모리 (RAM) |
영속성 | |||
공유 가능 | |||
속도 | 빠름 | 보통 | 매우 빠름 |
용도 | DB, 로그, 공유 데이터 | 개발 환경 공유, 설정 파일 | 캐시, 민감 정보 |
실습
메모리에 저장 하는 방식은 제외하고 Volume 방식과 Bind Mount 두 가지 방식을 이용해서 실습을 진행해 보도록 하겠다.
1. Volume 방식
docker run -d -p 3306:3306 --mount type=volume,source=volume_test,target=/var/lib/mysql mysql
Bash
복사
이렇게 되면 volume_test라는 Docker가 관리하는 실제 저장소로 경로 설정이 된다.
Volume의 실제 위치는 리눅스 기준 /var/lib/docker/volumes/volume_test/_data가 되지 만 직접 접근은 권장되지 않고 Docker 명령어로 접근, 백업하는 것이 일반적이다.
2. Bind Mount 방식
•
Host OS 디렉토리 : C:\jeygeon\docker-mysql\mysql-data
•
Mysql Cotainer 디렉토리 : /var/lib/mysql
$ docker run -d -p 3306:3306 -v C:\jeygeon\docker-mysql\mysql-data:/var/lib/mysql mysql
Bash
복사
위에서도 설명했지만 위의 명령어는 아래로 변경해도 똑같다.
docker run -d -p 3306:3306 --mount type=bind,source=C:\jeygeon\docker-mysql\mysql-data,target=/var/lib/mysql mysql
Bash
복사
변경된 내용:
-v C:\jeygeon\docker-mysql\mysql-data:/var/lib/mysql
--mount type=bind,source=C:\jeygeon\docker-mysql\mysql-data,target=/var/lib/mysql
호스트 OS 의 디렉토리에 Mysql Container 속 데이터 파일들이 정상적으로 동기화 된 모습을 확인 할 수 있다.