업무하는 내용 중 관리자가 서버에 파일을 올려두면,
사용자가 그 파일을 다운 받아 조회 할 수 있는 기능이 있었는데 어느날부터 파일 다운로드가 불가능 한 현상이 발생했다.
문제 원인을 확인 해 보니 원래는 배포 할때 docker
를 사용하지 않았었는데,
docker
를 사용한 이후로 배포가 진행 될 때 마다 Container
가 지워지게 되면서 서버에 저장된 파일들도 모두 사라지고 있던 것이였다.
사실 잘 이해가 되지 않아서 정리 된 내용을 확인 해 보니,
Docker를 실행하게 되면 프로세스 위에
Container
가 돌아가게 된다.
이런Container
들은Docker image
를 기반으로 만들어지고 실행된다.
여기서Container
들은Image layer
위에 write형식으로 데이터들을 저장하게 되고,
이러한 것들을sha256 digest
형태로 저장하고 관리하게 된다.
이제layer
는 Overlay2 드라이버로 저장되며,/var/lib/docker/image/overlay2/layerdb/sha256
라는 경로에 저장되게 된다.
해당 경로 안에는Container
에 작성되고 저장된 모든 데이터와 파일이 담겨있다.
단,Container
가 지워지면 기존에 write형식으로 저장되었던 layer도 지워지게 되므로 내가 발생했던 문제 처럼 기존 Image를 지우고 새로운 Image로 배포를 진행하게 될 경우 기존 파일들이 모두 삭제되는 것 이다.
따라서 Docker에서 제공하는 데이터 관리 방법을 통해 데이터를 별도로 관리 해 줘야 할 필요가 있다!
Docker에서는 데이터를 저장하고 관리하기 위해 여러가지 방법을 제공하는데,
그 중 대표적으로 사용되는 것이 Docker Volume, Docker Bind mount
다.
Docker Volume
은 Docker에 의해 만들어지고 관리되는 하나의 Volume이다.
주로 Host의 /var/lib/docker/volumes/
경로에 저장되며, Container에 마운트 하지 않아도 미리 생성이 가능하다.
출처 : https://docs.docker.com/storage/volumes/
Docker Volume
은 데이터를 컨테이너 밖에 저장하기 위해 사용된다.
호스트와 독립적으로 관리되며, 컨테이너의 생명주기와 독립적으로 존재하기 때문에 컨테이너가 삭제 되더라도 데이터가 보존된다.
Bind Mount
는 Host의 디렉토리에 직접 Access 하는것을 말한다.
Host의 디렉터리와 서로 공유함으로써 Container가 지워져도 Host는 남게되어 데이터 보존이 가능하다.
출처 : https://docs.docker.com/storage/bind-mounts/
Bind Mount
는 호스트의 파일 시스템에 있는 경로를 직접 컨테이너에 연결하여 사용한다.
호스트 파일 시스템의 특정 경로를 컨테이너 경로와 바인딩 하고, 호스트 파일 시스템의 변경 사항이 즉시 컨테이너에 반영되며 컨테이너의 변경 사항도 호스트에 영향을 미친다.
직접 접근하기 때문에 볼륨보다 빠르게 접근이 가능하지만, 컨테이너 종료 시 바인딩이 해제되어 컨테이너 내부의 변경 사항이 영구적으로 보존되지는 않는다.
이 둘의 차이점은 다음과 같다
따라서
Docker Volume을 사용하는 경우:
Bind Mount를 사용하는 경우:
요즘은 Volume형식
을 좀 더 선호하는 추세라고 한다~