Docker Volume1: Volumes & Bind Mounts

su-mmer·2022년 10월 2일
0

아묻따 도커 공부

목록 보기
14/18

Docker Volume

Anonymous Volume: 익명 볼륨

  • 컨테이너 하나만 접근할 수 있는 일회성 볼륨이다.
  • 외부 경로보다 컨테이너 내부 경로의 우선 순위를 높이는 데 사용 가능(bind mount에 설명)
  • Dockerfile에서도 설정할 수 있다.
	VOLUME [ "/app/feedback" ]  # Dockerfile
  • docker run -v /app/feedback 명령으로도 실행할 수 있다. 컨테이너 내의 /app/feedback을 로컬의 익명볼륨과 연결시킨다.
  • docker run 명령 실행 시 --rm 옵션을 주면 컨테이너가 종료될 때 컨테이너와 관련된 리소스까지 깨끗하게 제거된다(볼륨도 마찬가지).
    --rm 옵션을 주지 않을 경우, 익명 볼륨이 남게 되는데 이를 제거해주지 않으면 익명 볼륨이 쌓이게 된다.

$ docker volume rm <VOL_NAME>`
$ docker volume prune

둘 중 하나의 명령으로 익명 볼륨을 삭제할 수 있다.


Named Volume: 이름 있는 볼륨

names volume을 한글로 뭐라고 하는지 모르겠다..

  • Dockerfile에서 설정하지 않고 명령줄에서 실행한다.
$ 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 볼륨에 저장된 문구 확인 가능
여러 컨테이너에서 같은 볼륨에 접근 가능함을 알 수 있다.


Bind Mounts

  • 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

volume 삭제

docker volume rm <volume_name>
볼륨이 사용중이면 삭제가 되지 않으므로 삭제할 볼륨을 사용하는 컨테이너를 먼저 중지시켜야 한다.

0개의 댓글