도커 볼륨 & 바인드 마운트

JungWooLee·2022년 10월 6일
0

도커

목록 보기
4/4
post-thumbnail

바인드 마운트

소스 코드가 바뀔때마다 이미지를 다시 빌드하지 않는 이상 변화를 감지할 수 없다

이는 도커 이미지가 생성될 때 스냅샷을 찍어 run 되기 때문에 새롭게 컨테이너를 구성하더라도 이는 이미 구축된 이미지에 레이어를 추가하는 것 뿐이기 때문에 변화가 일어나지 않는다

바인드 마운트는 볼륨과 비슷한점이 많지만 한가지 중요한 차이점이 있다

도커에 의해 관리되는 볼륨의 위치, 즉 로컬 머신의 파일 시스템 상의 볼륨이 어디있는지 알수 없다

하지만 바인드 마운트의 경우, 로컬 머신상에 매핑될 컨테이너의 경로를 설정하기 때문에 이 파일이 어디에 위치하는지 알 수 있다

컨테이너는 볼륨을 쓸수도, 읽을수도 있기에 당연히 소스코드를 이러한 바인드 마운트에 넣을 수 있다

그렇게 하며누 컨테이너는 이를 인식하여 소스코드를 실제로 스냅샷에서 복사하는 것이 아니라 바인딩 마운트로부터 복사하게 된다

그렇게 소스코드는 항상 최신의 상태를 유지할 수 있다

스냅샷 뿐만아니라 처음에 이미지를 생성할 때에 그 이미지에도 넣는다

따라서 바인드 마운트는 영구적이고 편집가능한 데이터에 적합하다

이는 일반적인 볼륨과 큰 차이점을 보여준다

익명 볼륨 : 휘발성

명명 볼륨 : 영구성, 편집 불가

바인드 마운트 : 영구성, 편집 가능

바인드 마운트를 추가하는 법

바인드 마운트 또한 명명 볼륨과 같이 Dockerfile 내부에서는 할 수 없다 (실제로 이미지가 아니라 실행하는 컨테이너만 적용되기 때문)

컨테이너를 실행할 때 터미널 내부에서 바인드 마운트를 설정해야한다

※ 만약 경로가 존재하지 않을 시, 추가적으로 디렉토리를 추가한다

바인드 마운트를 추가하기 위해서는 명명 볼륨을 추가한것과 같이 컨테이너에서 관리될 디렉토리의 설정과 로컬에서 관리될 디렉토리를 설정하여 매핑해준다

하지만 이렇게 실행하게 되면 앱이 실행되지 않는 문제가 생긴다

이는 외부 종속성인 express 를 찾을 수 없는 문제에서 발생한다

도커파일을 보자면 다음과 같다


FROM node

 

WORKDIR /app/nodeproject

 

COPY package.json .

 

RUN npm install

 

COPY . . 

 

EXPOSE 80

 

CMD ["node", "server.js"]

이미지를 생성할 때 nom install 을 통하여 필요한 종속성을 추가해주는데 컨테이너 실행당시 프로젝트 내 모든 파일들을 리셋하여 재생성하기 때문에 필요한 종속성을 다운 받지 않았기 때문에 생기는 문제이다

이를 이해하기 위해 컨테이너와 볼륨간의 상호작용을 알 필요가 있다

컨테이너와 볼륨 및 바인드 마운트를 가지고 있다면 컨테이너 내부의 어떤 폴더가 로컬 머신의 폴더에 마운트되거나 연결된다

이미 컨테이너 내부에 파일이 있다 가정했을 때 외부 볼륨에도 파일이 존재, 새 파일을 작성하면 로컬 머신의 파일에도 추가되기 때문

컨테이너를 시작하면 볼륨에서 파일을 찾으며 아직 내부에 파일이 없어 볼륨에서 파일을 로드하게 된다 (바인드 마운트를 사용하는 이유)

컨테이너 내부에 파일이 없고 로컬에서는 파일이 있다 가정했을 때, 바인드 마운트를 사용하게 되면 도커는 로컬 폴더에 덮어쓰지 않기 때문에 문제가 없지만 로컬 폴더의 파일들이 도커 컨테이너에 있는 내용을 덮어쓰게 된다 ( 때문에 npm install 이 진행되지 않음)

문제를 해결하기 위해서는 도커에게 알려야 한다

내부 파일 시스템에 특정 부분이 있다는 것을.. 외부에서 덮어쓰지 않아야 하는 부분이 있다는 것을 말이다

익명 볼륨을 추가하여 덮어쓰지 않는 파일 지정

-v 를 추가하여 /app/nodeproject/node_modules 폴더를 바인딩한다

😕 어떻게 동작?

도커는 항상 컨테이너에 설정하는 모든 볼륨을 평가하며 충돌이 있는 경우에는 더 긴 “내부” 경로를 우선시한다.

현재는 app/nodeproject 라는 볼륨이 있고 무언가에 바인딩된 app/nodeprojcet/node_modules가 있다

도커가 가진 규칙으로 인해 더 구체적인 경로를 채택하게 된다 (만약 충돌이 있을시)

그렇게 되면 node project 에서 외부에서 들어오는 유입 (바인드 마운트된 볼륨의 내용물) 을 덮어쓰게 된다

0개의 댓글