VOLUME [ "/app/feedback" ] # Dockerfile
docker run -v /app/feedback
명령으로도 실행할 수 있다. 컨테이너 내의 /app/feedback을 로컬의 익명볼륨과 연결시킨다.--rm
옵션을 주면 컨테이너가 종료될 때 컨테이너와 관련된 리소스까지 깨끗하게 제거된다(볼륨도 마찬가지).--rm
옵션을 주지 않을 경우, 익명 볼륨이 남게 되는데 이를 제거해주지 않으면 익명 볼륨이 쌓이게 된다.$ docker volume rm <VOL_NAME>`
$ docker volume prune
둘 중 하나의 명령으로 익명 볼륨을 삭제할 수 있다.
names volume을 한글로 뭐라고 하는지 모르겠다..
$ docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes
-v feedback:/app/feedback
이 부분이 볼륨 설정 부분인데, feedback
이 호스트 경로이고 /app/feedback
이 컨테이너 내부 위치이다.
-v feedback:/app/feedback
명령을 이용해 볼륨명 feedback과 컨테이너 내의 /app/feedback 디렉토리를 연결시킨다.
여기서 feedback 볼륨의 위치는 우리가 알 수 없다.
feedback 볼륨에 저장된 txt파일 내용
실행 중인 feedback-app 컨테이너 정지, 삭제
docker volume ls
명령으로 feedback 볼륨이 있는 것 확인
같은 이미지로 새로운 컨테이너 실행
새로 생성한 컨테이너에서 feedback 볼륨에 저장된 문구 확인 가능
여러 컨테이너에서 같은 볼륨에 접근 가능함을 알 수 있다.
Dockerfile build시 코드를 스냅샷(캐시 데이터)에서 가져오지 않고 바인딩 마운트에서 가져온다. -> 컨테이너가 항상 새로운 코드를 사용할 수 있음
바인드 마운트를 할 때 컨테이너의 내부를 덮어버릴 수가 있는데 그걸 방지하기 위해 익명 볼륨을 함께 사용할 수 있다.
docker run -d -p 3000:80 --rm --name feedback-app\
-v feedback:/app/feedback\
-v "<호스트경로>:/app"\
-v /app/node_modules\
feedback-node:volumes
도커는 볼륨 생성 시 더 구체적인 경로를 우선시하게 되는데, 위와 같은 명령을 할 경우,
1. 로컬에 feedback 이름을 가진 볼륨을 생성하고 컨테이너의 /app/feedback과 연결(named volume)
2. 호스트경로와 컨테이너의 /app 연결(bind mount)
3. 컨테이너의 /app/node_modules를 익명볼륨 생성(anonymous volume)
=> 컨테이너 내부 /app/node_modules를 먼저 볼륨 생성한 후 bind mount를 하기 때문에 node_modules 내의 파일은 bind mount에 의해 덮어씌워지지 않는다.(Anonymous Volume의 중요성)
명령 | 볼륨 종류 |
---|---|
docker run -v /app/data .. | Anonymous Volume |
docker run -v data:/app/data .. | Named Volume |
docker run -v /path/to/code:/app/code .. | Bind Mount |
docker volume rm <volume_name>
볼륨이 사용중이면 삭제가 되지 않으므로 삭제할 볼륨을 사용하는 컨테이너를 먼저 중지시켜야 한다.