컨테이너의 파일시스템은 이미지 위에 얹힌 얇은 쓰기 레이어라, 컨테이너를 지우면 그 안에 쓴 데이터도 사라진다. 데이터를 남기거나 호스트와 파일을 공유하려면 컨테이너 밖의 저장 공간을 마운트한다. 방법은 named volume과 bind mount 두 가지다.
| named volume | bind mount | |
|---|---|---|
| 호스트 위치 | 도커가 관리 | 내가 지정한 경로 |
예(-v) | pgdata:/var/lib/postgresql/data | $(pwd):/app |
| 주 용도 | DB 데이터처럼 남겨야 할 상태 | 개발 중 소스 코드 공유 |
| 이식성 | 높음 | 호스트 경로에 묶임 |
docker volume create pgdata
docker run -d -v pgdata:/var/lib/postgresql/data postgres:17
docker volume inspect pgdata # Mountpoint = 실제 저장 위치
docker run -d -p 3000:3000 -w /app -v "$(pwd):/app" node:22 sh -c "npm i && npm run dev"- 이미지는 "무엇을 실행할지"를 담은 불변 설계도이고, 볼륨은 실행 중 쌓이는 데이터를 담는 보관함이다(컨테이너와 이미지)
- 같은 볼륨을 붙이면 컨테이너를 다시 만들어도 데이터가 이어진다. 여러 컨테이너가 공유할 수도 있다
- bind mount로 소스를 붙이면 호스트에서 고친 코드가 바로 컨테이너에 보여, 파일 감시 개발 서버와 함께 로컬 개발에 많이 쓴다
- macOS·Windows의 Docker Desktop에서는 bind mount 파일 I/O가 느릴 수 있다.
node_modules처럼 파일이 많은 폴더는 named volume으로 따로 빼기도 한다
Docker Compose에서는 named volume을 최상위 volumes에 선언해야 하고, docker compose down은 기본적으로 볼륨을 지우지 않는다(-v를 주면 지운다). 상태를 어디에 두느냐는 결국 저장소 역할 분담의 문제다.
출처: Docker 볼륨: When to use volumes · Bind mounts: When to use bind mounts