Docker를 실행시키면 Container가 만들어지고 이를 실행하면 독립적인 환경에서 프로그램을 실행할 수 있다. 하지만 이 Container를 종료 시키면 Container안에서 만들었던 모든 데이터들이 사라지게 되므로 이를 방지하기 위하여 Permanent하게 저장을 하고 싶은 파일들은 Volumes를 이용하여 저장을 하게 된다.
컨테이너를 실행할대 명명된 Volumes을 만들어야한다.
build후 ->
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback feedback-node:volumes
=> /app/feedback에 저장한다 => container가 종료가 되도 사라지지 않는다
익명 볼륨은 사라지게 된다. => 하나의 컨테이너에만 연결되지 않는다.
컨테이너가 제거되면 익명 볼륨이 자동으로 제거가 되는데, 이는 --rm 옵션으로 컨테이너를 실행할대 발생하는 것이다. 이 옵션이 없다면 제거되지 않는다. 즉, 사용하지 않는 익명의 볼륨들이 쌓이기 시작하고 이는
docker vlume rm VOL_NAME
docker volume prune
을 통해서 그러한 볼륨을 삭제할 수 있다.
실행중인 프로그램을 수정하고 reload해도 변경사항이 바로 반영되지 않는다.
=> 우리는 도커 이미지가 생성될 때 이들 폴더의 스냅샷만 복사를 한다. 따라서 해당폴더의 모든항목이 미래의 변경 사항은 이미지에 반영되지 않으므로 컨테이너에도 반영되지 않는것이다.
하지만 개발중에 도커를 사용하면 변경사항이 반영되는것이 중요하다 -> 매번 리빌드하고 재시작하는것은 번거롭기 때문이다
도커에 의해 볼륨 위치, 우리는 잘 모르지만 bind mounts는 위치를 안다.
=> 호스트 머신 상에 매핑될 컨테이너의 경로를 설정하기 때문이다.
컨테이너는 인식해서 코드의 스냅샷에서 복사하는것이 아니라 바인딩 마운트에서 복사를 한다.
영구적이고 편집가능한 데이터에 좋다.
호스팅 머신의 컨테이너의 app 폴더에 바인딩 하고자 할때
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v "/Users/maximilianschwarzmuller/development/teaching/udemy/docker-complete:/app" feedback-node:volumes
=> 이 명령어를 수행을 하게 되면 결국 'app' 폴더의 모든것을 로컬 폴더로 덮어쓰게 된다. 그리고 이 폴더는 종속성이 있는 node_modules가 있다. 하지만 로컬에서는 npm install 을 하지 않았기 때문에 덮어씌우면 오류가 나게 된다.
도커는 로컬 호스트 폴더를 덮어쓰지 않는다. 하지만 로컬 호스트 폴더와 그 안에 있는 콘텐츠가도커 컨테이너의 내용을 덮어 쓴다. 이 문제르 ㄹ해결하려면 도커에게 내부 파일 시스템에 특정부분이 있고 외부에서 덮어쓰지 않아야 한다는 것을 알려준다. 이는 또다른 익명 볼륨을 추가하는 것으로 막을 수 있다.
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback -v "/Users/maximilianschwarzmuller/development/teaching/udemy/docker-complete:/app" -v /app/node_modules feedback-node:volumes
여기서 차이점 콜론 앞에 로컬 머신 경로가 붙으면 바인드 마운트
콜론 앞에 경로가 아닌것이 붙으면 볼륨이름으로 취급되어 명명된 볼륨
도커의 규칙: 더 길고 더 구체적인 경로를 채택한다는 것이다
'app'폴더에 바인딩 할 수 있지만 'app'폴더 내부의 'node_modules'폴더에 바인딩 한다.
외부에서 들어오는 유입. 즉, 이 앞의 볼륨 때문에 발생한 것들을 덮어쓰게 된다. -> 바인드 마운트 된 볼륨의 내용물을 덮어쓴다
이렇게 하면 html을 변경하면 바로 reload했을때 적용이 되는것을 확인 할 수 있다.
하지만 server.js파일을 변경을 하면 오류가 나는것을 확인 할 수 있다.
노드 런타임으로 실행되는데, 웹 서버를 재시작하여 js코드의 변경사항이 적용이 되어야한다.
-> 컨테이너의 서버만 재시작하는것은 쉽지 않다.
: 개발중 변경사항 즉시반영 패키지를 추가해야한다.
"scripts":{
"start": "nodemon server.js"
},
"devDependencies"{
"nodemon": "2.0.4"
}
Dockerfile
CMD ["npm", "start"]
를 사용하면 내부적으로 nodemon을 사용하게 된다
Anonymous Volume: 이미 존재하는 특정 데이터를 잠그는데 유용하다/ 덮어쓰기를 방지
=> 허스트 머신에 폴더를 생성한다. -> 컨테이너 제거시 삭제
모든 데이터를 저장하고 관리할 필요없이 아웃소싱하면 성능과 효율성이 도움이 된다
temp folder
Named Volumes: -v 명령어로 만든다
- 컨테이너에 연결되지 않아 컨테이너가 삭제되도 사라지지 않는다
여러 컨테이너간의 소통할 수 있다.
Bind Mounts: 저장되는 위치를 안다. 다수의 컨테이너 연결가능, 제거후에도 유지된다.
호스트머신에서 삭제해야지 사라진다.
docker 명령어로도 삭제 불가능
볼륨은 도커에 의해 관리가 된다
바인드 마운트는 도커에의해 관리가 되는것이 아니다.
호스트머신의 알려진 폴더일 뿐이다
관리된다는것은 볼륨이 존재하지 않으면 도커가 생성을 한다는 뜻이다.
Volume 삭제
docker volume rm feedback-files
docker stop feedback-app
docker volume rm feedback
사용중인 볼륨은 오류가 난다