본문 바로가기

Back-End/Docker

Docker Volume

컨테이너가 가진 문제점

Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있습니다. 이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 합니다. 이 때, Docker는 기존 컨테이너에서 변경된 부분을 수정하지 않고 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 합니다.

이런 특징 때문에 기존 컨테이너를 새로운 컨테이너로 교체하면 기존 컨테이너 내부에 있던 데이터도 같이 삭제됩니다. 만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였더면 MySQL에 저장된 데이터도 같이 삭제 되어버립니다.

따라서 컨테이너 내부에 저장된 데이터가 삭제되면 안되는 경우에는 볼륨(Volume)이라는 개념을 활용해야 합니다.

 

Docker Volume이란?

도커의 볼륨이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법입니다. 볼륨은 컨테이너 자체의 저장 공간을 사용하지 않고 호스트 자체의 저장 공간을 공유해서 사용하는 형태입니다.

그럼 볼륨은 어떻게 사용할까?

$ docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
  • [호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우 호스트의 디렉토리가 컨테이너의 디렉토리를 덮어씌웁니다.(중요)
    • 쉽게 비유해보자면, 마치 내 방(호스트 컴퓨터)에 이미 똑같은 이름의 폴더가 있다고 상상해보세요.
    • 도커는 "아, 이 호스트 폴더가 우선이구나!" 하고 생각해서 컨테이너 안에 있던 디렉토리 내용을 전부 덮어씌어 버립니다.
    • 즉 호스트 폴더가 컨테이너 폴더보다 우위에 있어서 호스트 폴더 안의 내용만 최종적으로 유지가 됩니다.
    • 그래서 컨테이너 안에 중요 파일이 들어있는데 호스트 쪽에 미리 만들어둔 빈 폴더만 남아있다면 컨테이너 쪽 파일들이 사라진 것처럼 보일 수 있으니 주의해야한다!!

  • [호스트의 디렉토리 절대 경로] 에 디렉토리가 존재하지 않을 경우 호스트의 디렉토리 절대 경로에 디렉토리를 새로 만들고 컨테이너의 디렉토리에 있는 파일들을 호스트의 디렉토리로 복사해옵니다.(중요)
    • 쉽게 비유해보자면, 내 방(호스트)에 해당 폴더가 없으니 도커가 직접 새로 폴더를 만들어주고 컨테이너에 있던 디렉토리 내용을 복사해옵니다.
    • 그래서 이때는 컨테이너의 디렉토리에 있던 파일이 그대로 호스트 쪽에 복제되어 나중에 직접 확인하고 수정할 수 있게 됩니다.

  • 즉, 호스트 디렉토리가 있으면 그 디렉토리로 컨테이너 쪽을 덮어씌우고, 호스트 디렉토리가 없으면 컨테이너 쪽 디렉토리를 그대로 복사해온다는 개념입니다.