본문 바로가기

STUDY/Docker & Kubernetes: 실전 가이드 -2022년판

7. 도커 데이터 관리2: 익명 볼륨, 지명된 볼륨, 바인드 마운트

도커 볼륨의 종류

 

도커 볼륨은 익명볼륨, 지명된 볼륨, 바인드 마운트 볼륨 3가지가 존재한다. 익명 볼륨은 -v {컨테이너 폴더 경로} 옵션으로 컨테이너를 실행하면 만들어진다. 볼륨으로 지정된 컨테이너 경로에 파일이 저장하려고 하면 컨테이너가 아니라 연결된 로컬 파일시스템에 해당 파일이 저장된다. 도커가 컨테이너의 폴더와 로컬 폴더를 연결하기때문에 개발자는 로컬 폴더가 어디인지는 알 수 없다. 또 컨테이너가 사라지면 해당 익명볼륨도 함께 사라진다.

 

지명된 볼륨은 -v {볼륨 이름}:{컨테이너 폴더 경로} 옵션으로 컨테이너를 실행하면 만들어진다. 익명 볼륨과 마찬가지로 컨테이너의 폴더와 로컬 폴더가 맵핑되고 개발자는 자세한 로컬 폴더의 위치를 알 수 없다. 하지만 컨테이너를 삭제해도 볼륨은 삭제되지않기 때문에 데이터를 컨테이너와 상관없이 유지할 수 있다.

 

바인드 마운트 볼륨은 -v {로컬 폴더 경로}:{컨테이너 폴더 경로} 옵션으로 컨테이너를 실행하면 만들어진다. 개발자가 지정한 로컬 폴더와 컨테이너의 폴더가 맵핑되고 컨테이너를 삭제해도 볼륨은 삭제되지 않는다. 또 로컬 폴더의 위치를 알 기 때문에 해당 폴더를 편집해서 컨테이너에 영향을 줄 수도 있다.

 

 


익명 볼륨

 

> docker volume ls
...
volume 개수 확인
...
> docker run -d --name feedback-app -p 3000:80 --rm -v /app/feedback feedback-app
> docker volume ls
...
volume 개수 1개 증가
...
> docker stop feedback-app
> docker volume ls
...
volume 개수 1개 감소
...
> docker run -d --name feedback-app -p 3000:80 --rm -v /app/feedback feedback-app

-v 옵션을 사용하여 익명볼륨과 함께 feedback-app을 컨테이너에 실행시켰다. 그리고 이전과 같이 피드백을 입력한후 컨테이너를 삭제/실행한 후 피드백 파일에 접속해보았다. 하지만 볼륨을 사용하지 않았을 때와 마찬가지로 피드백 파일은 유지되지 않았다. 또 docker volume ls 명령어를 사용해서 볼륨의 개수를 확인해보면 익명볼륨이 컨테이너와 함께 만들어지고 삭제되는것을 확인할 수 있다.

 

 


지명된 볼륨

 

> docker run -d --name feedback-app -p 3000:80 --rm -v feedback-volume1:/app/feedback feedback-app
> docker stop feedback-app
> docker run -d --name feedback-app -p 3000:80 --rm -v feedback-volume1:/app/feedback feedback-app

-v 옵션을 볼륨의 이름을 지정하여 feedback-app을 실행시켰다. 그리고 이전과 같이 피드백을 입력한후 컨테이너를 삭제/실행한 후 피드백 파일에 접속해보면 파일이 유지되어있는것을 확인 할 수 있다. 또 docker volume ls 명령어를 사용해서 볼륨의 개수를 확인해보면 지정된 이름으로 볼륨이 생성되어 있고, 컨테이너를 삭제해도 볼륨은 유지된다.

 

 


바인드 마운드

 

> docker run -d --name feedback-app -p 3000:80 --rm -v ${pwd}/feedback:/app/feedback feedback-app

개발단계에서는 로컬에서 파일을 수정했을 때, 컨테이너에도 반영되길 바라는 요구사항이 있다. 이때 -v 옵션에 로컬 환경의 경로를 지정하면 바인드 마운트 볼륨을 사용하여 컨테이너를 실행할 수 있다. 위와 같이 컨테이너를 실행하고 피드백을 제출하면, 피드백 파일이 지정한 폴더에 저장되는 것을 확인할 수 있다. 그리고 피드백 파일을 수정하면, 컨테이너로 조회한 파일의 내용도 수정된다.

 

 


볼륨 병합

 

> docker run --name feedback-app -p 3000:80 --rm -v ${pwd}:/app feedback-app
...
Error: Cannot find module 'express'
...

로컬에서의 폴더를  /app 폴더에 바인드 마운트로 연결하여 컨테이너를 실행하였다. 하지만 모듈을 찾을 수 없다는 에러와 함게 컨테이너 실행에 실패하였다. 바인드 마운트의 정책과 관련이 있다. Dockerfile에는 "RUN npm install"이라는 명령어가 있어서 /app/node_modules 폴더에 모듈 파일이 저장되고 이 상태로 이미지가 만들어진다. 그리고 결과적으로 컨테이너에는 /app/node_modules 폴더에 모듈 파일이 들어있다. 하지만 로컬에는 node_modules 폴더가 없다. 바인드 마운트로 로컬과 컨테이너의 폴더를 연결할 때 로컬에 데이터가 있고 컨테이너에 없다면 컨테이너에 해당 데이터를 넣어주고, 로컬에 데이터가 없고 컨테이너에 있다면 컨테이너의 데이터를 삭제한다.  node_modules 폴더는 로컬에 없으므로 컨테이너의 폴더를 삭제하였고, 그 결과 실행에 필요한 모듈을 찾지 못하여 에러가 발생한 것이다.

 

> docker run --name feedback-app -p 3000:80 --rm -v ${pwd}:/app -v /app/node_modules feedback-app

이 문제는 node_modules 폴더를 익명볼륨으로 지정하여 해결할 수 있다. 하나의 폴더에 여러 볼륨 경로가 포함되어 있다면, 더 구체적인 경로를 가진 볼륨을 따르는게 정책이다. node_modules 폴더는 /app과 /app/node_modules 두 경로에 모두 포함되지만 /app/node_module가 더 구체적이기 때문에 익명볼륨의 정책을 따른다. 이렇게 다른 볼륨으로부터 보호하거나 분리하기 위해 세부 경로를 익명 볼륨으로 만들수도 있다.

728x90