42서울/Inception

Docker Volume이란? [42 inception 과제 개념 10]

뜨거운 개발자 2023. 6. 24. 17:58

Docker Volume 왜 그리고 어떻게 쓰나요?

데이터의 지속성을 위해서 도커 볼륨을 쓰고 싶어합니다.

🚨
컨테이너를 제거하거나 stop하면 모든 데이터가 사라지고 처음부터 시작합니다. 그 이유는 컨테이너에서 사용하는 파일 시스템은 실제로 저장을 할 수 있는게 아니라 가상 파일 시스템 이기 때문입니다.
👨🏻‍💻
그래서 컨테이너 run타임 중에는 데이터를 저장할 수는 있지만 컨테이너도 하나의 프로세스에 불과하기 때문에 프로세스가 종료되면 저장을 할 수가 없습니다.

하지만 컨테이너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

728x90