현재 사용 중인 Web 구조
title과 text를 적어서 save 하면 내부에 /feedback 디렉토리가 생기고 그 안에 내용이 저장된다.
title에 맞춰 /feedback/awesome.txt로 접속했을 때 해당 내용이 나타난다.
1. Code 작성
2. dockerfile 작성
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
VOLUME [ "/app/feedback" ]
CMD [ "node", "server.js" ]
3. docker build -t feedback-node:volume
feedback-node 이름으로 이미지 작성
4. docker run -d --rm -p 3000:80 --name feedback-app feedback-node:volume
detach 모드(백그라운드) 실행, 도커 내부 3000포트와 로컬 80포트 연결, feedback-node:volume 이미지를 기반으로 feedback-app 이름의 컨테이너 실행
문제 이해
현재 feedback-app 컨테이너에서 파일 저장 시 컨테이너 내부에만 저장되어 컨테이너 삭제 후에는 내용을 알 수가 없다. 일회성 내용은 상관없지만 영구 저장되어야 하는 내용들은 어떻게 해야 할까?
도커의 데이터 및 볼륨 관리
익명 볼륨
위와 같은 방식으로 사용했을 때 자동으로 생성된다.
컨테이너를 생성할 때 볼륨에 대한 명령을 주지 않았다.
컨테이너를 삭제(--rm 옵션으로 자동 삭제 걸어놓은 상태)하면 자동으로 익명 볼륨도 사라진다.
--rm 옵션
--rm 옵션을 걸어 컨테이너를 생성하면 컨테이너 중지 시에 자동으로 연결된 익명 볼륨도 사라진다. 하지만 --rm 옵션이 없으면 익명 볼륨은 그대로 남게 되므로 사용자가 직접 삭제해주어야 한다.docker volume prune
네임드 볼륨
컨테이너 생성 시 feedback
이란 이름의 볼륨을 생성하고 컨테이너 내부의 /app/feedback
과 매핑시킨다.
docker volume ls 명령으로 생성된 네임드 볼륨을 확인할 수 있다.
Web에서 test를 하나 저장해 주었다.
컨테이너를 삭제(--rm으로 자동 삭제됨)시킨 후에도 docker volume ls
를 통해 확인해 보면 볼륨이 남아있는 것을 확인할 수 있다.
새 컨테이너를 만들 때 이 볼륨의 이름을 사용하면 볼륨에 저장된 내용 그대로 새 컨테이너에 연결시킬 수 있다.
컨테이너를 삭제해도 네임드 볼륨은 자동으로 삭제되지 않으므로 사용자가 직접 삭제해야 한다.
당연히 web에서 접속해서 저장된 test 내용을 볼 수 있다.
바인드 마운트
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "server.js" ]
Dockerfile과 컨테이너 실행 명령을 보면 문제가 좀 있다.
package.json 파일을 컨테이너로 복사 후 npm install로 종속성 설치하면 node_modules 폴더가 생김 > 모든 코드 복사 > 그런데 바인드 마운팅(-v $(pwd):/app)
으로 인해 로컬의 모든 것을 컨테이너의 /app으로 덮어쓰기 때문에 컨테이너에 설치된 node_modules가 사라짐
이를 해결하기 위해서는 익명 볼륨을 사용해주는 것이 좋다. node_modules를 저장할 익명 볼륨을 만들어주는 것이다.
-v feedback:/app/feedback
- 네임드 볼륨
- feedback 이름의 볼륨을 생성하여 컨테이너 내부의 /app/feedback과 매핑
- Web에서 받아들이는 내용을 볼륨에 저장
-v /c/study/volume/data-volumes-02-added-dockerfile:/app
- 바인드 마운팅
- data-volumes-02-added-dockerfile 폴더를 컨테이너 내부의 /app에 그대로 덮어쓰기 함
- data-volumes-02-added-dockerfile 폴더의 내용이 변경되면 컨테이너 내부의 /app에 그대로 반영됨
-v /app/node_modules
- 익명 볼륨
- 컨테이너 내부의 /app/node_modules에 대한 볼륨
- npm install로 종속성 설치 후에 생기는 node_modules 폴더가 바인드 마운팅 이후에 삭제되지 않고 볼륨에 남아있을 수 있도록 함
도커에서는 컨테이너 내부 경로가 더 긴 순서대로 볼륨을 평가하기 때문에 /app/node_moduels > /app 순서대로 볼륨을 생성한다.
txt 파일이 아주 잘 생성된 것을 볼 수 있다.
더불어 로컬에서 코드를 수정했을 때 web 상에서도 변경되는 것을 확인할 수 있다. 바인드 마운팅과 익명 볼륨의 조합 덕분에 가능한 것이다.
콜론(:) 앞에 로컬 머신 경로가 붙으면 바인드 마운트, 경로가 아닌 것이 붙으면 네임드 볼륨, 콜론이 없으면 익명 볼륨
바인드 마운트를 이용하여 컨테이너를 실행시킬 경우 코드의 변경 사항을 즉시 컨테이너에 반영시킬 수 있는데, 이것은 개발 환경에서만 써야한다. 실제 배포시에 바인드 마운트로 코드 변경을 반영시키지는 않을 것이므로 COPY . .
가 도커 파일에 작성되어야 하는 이유다.
읽기 전용 볼륨으로 생성하기 위해서는 :ro를 붙여준다.
기본으로 rw 기능이다.