Docker Volume 왜 그리고 어떻게 쓰나요?
데이터의 지속성을 위해서 도커 볼륨을 쓰고 싶어합니다.

stop하면 모든 데이터가 사라지고 처음부터 시작합니다. 그 이유는 컨테이너에서 사용하는 파일 시스템은 실제로 저장을 할 수 있는게 아니라 가상 파일 시스템 이기 때문입니다.
하지만 컨테이너를 stop 할 때마다 데이터가 사라진다고, 항상 컨테이너를 Running 상태로 두는 건 너무 비효율적 입니다. 갑자기 전원이 나가서 컨테이너가 꺼지면 모든 데이터가 없어지는 상태가 발생할 수도 있기 때문에 문제 해결이 필요해졌습니다.
저희는 컨테이너의 가상 파일 시스템을 Host 컴퓨터의 파일 시스템(실제 파일시스템) 과 연결을 하는게 어떨까라는 생각을 하게 됩니다. 이 아이디어로 등장한 것이 도커 볼륨 입니다.
Docker Volume 은 호스트의 파일 시스템에 컨테이너의 파일 시스템을 마운트합니다.컨테이너에서 사용하던 데이터를 저장하기 위해서 Docker Volume이 필요합니다.
일반적으로 볼륨을 만드는 명령은 docker run -v옵션을 줘서 사용합니다.
3가지 타입의 도커볼륨
1. 호스트 볼륨
docker run -v 호스트_디렉토리: 컨테이너_디렉토리호스트 파일 시스템을 컨테이너에 마운트 하는 방식입니다.

2. Anonymous Volumes
docker run -v 컨테이너_디렉토리
자동으로 생성된 폴더에 대한 참조가 없기 때문에 익명 볼륨이라고 불립니다.
- 익명 볼륨은 컨테이너의 생명주기 동안 유지되며, 컨테이너를 재시작할 때도 유지됩니다.
- 익명 볼륨은 주로 임시 데이터나 캐시 데이터를 저장하는 용도로 사용됩니다.
- 익명 볼륨은 볼륨 이름을 지정하지 않기 때문에 컨테이너의 설정 파일이나 Compose 파일에서 볼륨 이름을 관리할 필요가 없습니다.
3. Named Volumes
docker run -v 이름:컨테이너_디렉토리
세번째는 익명 볼륨을 개선한 것으로 호스트 파일시스템에서 해당 폴더의 이름을 지정하며, 이름을 사용자가 결정합니다. 가장 많이 사용되는 방식입니다.
Named Volumes은 볼륨 이름을 지정하여 컨테이너에게 고유한 볼륨을 할당합니다. Named Volumes은 컨테이너의 생명주기와 상관없이 독립적으로 유지됩니다. Named Volumes은 주로 데이터베이스 파일, 설정 파일, 로그 등 영속적인 데이터를 저장하는 용도로 사용됩니다.
도커 컴포즈 파일 예시
volumes :
-db-data:/var/lib/mysql/data여기서는 Named Volumes을 의미하고 앞에 db-data같은 경우 볼륨의 이름이 되고, /var/lib/mysql/data는 컴테이너 내부의 경로입니다.
만약 다른 컨테이너 볼륨을 마운트 하고싶더라도, 그렇게 밑에 적어주면 마운트가 됩니다.
이는 호스트의 하나의 볼륨에 여러개의 컨테이너 타입을 지정할 수 있다는 장점이 있습니다. 이런 특징은 컨테이너끼리 데이터를 공유해야하는 경우 상당히 유용합니다!

각자 볼륨을 저장하는 위치
- 윈도우 :
C:\ProgramData\docker\volumes
- 리눅스 :
/var/lib/docker/volumes
- mac : /
var/lib/docker/volumes
다만 맥에서 실제로 이렇게 폴더를 찾아보면 없는 것을 볼 수가 있습니다. 그 이유는 어플리케이션용 도커가 실제로 백그라운드에서 리눅스vm을 생성하기 때문에 그렇습니다.

따라서 vm에 접속해서 물리 주소를 확인 할 수 있습니다.

그리고 ls /var/lib/docker/volumes/ 를 해보면 다음과 볼륨의 실제 저장된 것을 볼 수 있습니다.

Uploaded by N2T
'Backend > Docker' 카테고리의 다른 글
| best practices for writing Dockerfiles (과제 요구사항) [42 inception 과제 개념12] (2) | 2023.06.24 |
|---|---|
| 컨테이너 빌드에 대한 권장사항 [PID 1] [42 inception 과제 개념11] (0) | 2023.06.24 |
| Dockerfiles이란? [42 inception 과제 개념 9] (0) | 2023.06.24 |
| docker compose를 사용한 네트워크 [42 inception 과제 개념 8] (0) | 2023.06.24 |
| docker compose 명령어 [42 inception 과제 개념 7] (0) | 2023.06.24 |