- Docker에서의 데이터 종류
Docker에서의 데이터는 크게 3가지로 나눌 수 있다.
우리가 이미지를 만들고 컨테이너를 실행하는 데 필요한 데이터와 런타임 중에 임시로 생성되는 데이터, 그리고 런타임 중에 생성이 되며 영구적으로 저장해야 하는 데이터가 있다.
스프링부트를 사용하면 사용자로부터 파일 업로드를 받을 때가 있는 데, 이때 영구적인 데이터로 저장을 하는 것 같다.
이미지는 읽기 전용이기 때문에, 이 부분에 데이터를 추가할 수는 없다.
이 때는 volume을 사용해야 한다고 한다.
- 기존의 방법으로 컨테이너에 데이터 저장
기존의 방식으로 런타임 도중에 파일을 저장해보도록 하자.
run 할 때 --rm 의 옵션을 추가했다.
이 앱을 이용해서 해당 파일을 저장한다.
이렇게 저장된 파일에 접속이 가능한 것을 볼 수 있다.
과연 해당 파일은 컨테이너를 재실행하더라도 접속이 가능할까?
재실행하고 접속을 해보았지만
접속이 불가능한 것을 확인할 수 있다.
컨테이너가 삭제되고 재실행되었기 때문에 해당 파일도 삭제되어서 그런 것임을 알 수 있다.
--rm을 제거하여 컨테이너를 삭제하지 않고 재실행만 해보자.
stop 후 start로 재실행하니 해당 데이터는 삭제되지 않아 다시 접속이 가능한 것을 볼 수 있다.
하지만 여기서 한 가지 문제를 찾을 수 있다.
해당 데이터가 컨테이너 내부에 저장이 되기 때문에 컨테이너가 제거되면 데이터도 제거가 된다.
동일한 이미지를 사용하더라도 말이다.
WAS에서는 업로드 한 데이터들을 삭제하면 안되는 경우가 생길 수도 있기 해당 데이터를 가지고 있어야 한다.
그렇기 때문에 Docker의 volume을 사용하여 데이터를 유지할 수 있도록 해야 한다.
- volume이란?
volume은 호스트 머신의 폴더이다. 컨테이너나 이미지에 있는 것이 아니다.
volume은 도커가 인식하는 호스트 머신에 있는 폴더로서 도커 컨테이너 내부의 폴더에 매핑된다.
그리고 두 폴더의 변경 사항은 다른 폴더에 반영이 된다.
호스트 머신에 파일을 추가하면, 컨테이너 내부에서 액세스 할 수 있다.
컨테이너가 매핑된 경로에 파일을 추가하면, 호스트 머신에서도 사용할 수 있다.
이렇게 volume을 통해 데이터를 유지할 수 있다.
해당 volume은 컨테이너가 종료되더라도 유지되기 때문이다.
Docker의 volume에는 2가지 종류가 있다.
익명 volume과 명명된 volume이다.
익명 volume은 진짜 호스트 머신의 어딘가로 연결이 되며, 보통은 그 경로를 모를 것이다.
신경 쓸 필요가 없어 편하지만, 해당 익명 volume은 컨테이너가 종료된 경우에 삭제가 된다.
그렇기 때문에 이런 경우에는 Named volume을 사용해야 한다.
Named volume을 사용하는 방법은 run 할 때 -v 옵션을 사용하는 것이다.
docker run -v {volume 이름:컨테이너 내부 path} {image ID || image Name}
이렇게 실행을 하면 --rm 옵션으로 컨테이너를 삭제하더라도 데이터가 보존되는 것을 볼 수 있다.
- 바인드 마운트
개발하는 과정에서 스프링부트의 코드가 조금이라도 변경이 된다면, 이미지를 새로 만들고 해당 이미지로 컨테이너를 만들어야 했다.
해당 과정은 시간이 굉장히 오래 걸리고, 이미지가 쌓인다는 문제가 있었다.
바인드 마운트는 volume과는 다르게 해당 위치를 개발자가 알 수 있으며, 호스트 머신 상에 매핑될 컨테이너의 경로를 설정한다.
COPY로 소스코드를 복사하는 것이 아니라, 해당 마운트의 파일을 최신버전으로 유지하면서 배포할 수 있다는 장점이 있다.
바인드 마운트도 -v를 사용한다.
volume과는 거꾸로 {복사하고 싶은 디렉터리 : 컨테이너 디렉터로}로 실행할 수 있다.
docker run -v {바인드 마운트 할 경로:컨테이너 내부 path} {image ID || image Name}
하지만 이 과정에서 덮어쓰기 때문에 필요한 종속성들이 날아갈 수 있다.
그렇기 때문에 종속성이 있는 폴더는 익명 volume으로 유지하면서 run을 하면 종속성을 유지한 채로 최신 버전으로 실행이 가능하다.
- 컨테이너에서 데이터 관리하는 방법들 간의 비교
'백엔드 > Docker' 카테고리의 다른 글
Docker에서 볼륨과 바인드 마운트 관리하기 (0) | 2024.02.12 |
---|---|
DockerHub 사용하기 (0) | 2024.02.11 |
이미지와 컨테이너 관리 (1) | 2024.02.11 |
Docker 이미지와 컨테이너 (0) | 2024.02.03 |
Docker란? (0) | 2024.02.01 |