웹 개발
도커 볼륨을 지우기 전에 확인하는 것들
docker volume rm은 되돌릴 수 없다. 지우기 전에 딱 세 가지만 확인하면 실수를 막을 수 있다.
볼륨을 잘못 지워서 데이터를 날린 경험이 한 번 있고 나면 docker volume rm을 치기 전에 자동으로 손이 멈춘다. 그 전에 확인할 것들을 정리해뒀다.
어떤 컨테이너가 쓰고 있는지
실행 중인 컨테이너가 마운트한 볼륨은 Docker가 지우지 못하게 막아준다. 문제는 이미 종료된 컨테이너다. 종료 상태여도 볼륨 참조가 남아 있으면 docker volume rm이 실패하는 건 아니다. 즉 아무도 안 쓴다고 착각하기 쉽다.
# 해당 볼륨을 마운트한 컨테이너 목록 (실행 중 + 종료된 것 모두)
docker ps -a --filter volume=my-volume
# 또는 inspect로 직접 확인
docker volume inspect my-volume
inspect 출력의 Mountpoint에서 실제 경로를 알 수 있고, 어떤 레이블이 붙었는지도 볼 수 있다. Docker Compose로 만든 볼륨이라면 com.docker.compose.project 레이블이 붙어 있어서 어느 프로젝트 것인지 알 수 있다.
안에 뭐가 들었는지
볼륨 이름만 봐서는 내용을 알기 어렵다. 특히 자동 생성된 이름(a3f8b2c1d0e9... 형식)은 더 그렇다. 직접 열어보는 게 빠르다.
docker run --rm -v my-volume:/data alpine ls -la /data
DB 파일이 있거나, 업로드 파일들이 쌓여 있거나, 로그가 있다면 지우기 전에 백업을 먼저 뜬다.
# 볼륨 내용을 tar로 백업
docker run --rm \
-v my-volume:/data \
-v "$(pwd)":/backup \
alpine tar czf /backup/volume-backup.tar.gz -C /data .
재생성이 가능한 데이터인지
볼륨에 담긴 내용이 npm install 결과물(node_modules 캐시)이나 빌드 캐시라면 지워도 무방하다. 반면 사용자 업로드 파일, SQLite 파일, 인증서, 시크릿은 한 번 지우면 복구가 안 된다.
미사용 볼륨을 한꺼번에 정리할 때는 docker volume prune을 쓰는데, 이 명령은 어떤 컨테이너에도 연결되지 않은 볼륨을 모두 지운다. -f 플래그 없이 실행하면 지울 목록을 먼저 보여주므로, 반드시 확인 후 진행한다.
docker volume prune
# WARNING! This will remove anonymous local volumes not used by at least one container.
# Are you sure you want to continue? [y/N]
삭제 전에 docker volume ls로 전체 목록을 한 번 훑어보고, 이름이 낯선 볼륨은 inspect로 확인하는 습관이 안전하다.