볼륨: 컨테이너 데이터가 실제로 저장되는 위치
이름 있는 볼륨과 바인드 마운트의 차이, 디스크에서 실제로 저장되는 위치, 그리고 컨테이너를 다시 만들 때 데이터베이스를 잃지 않는 방법을 설명해요.
업데이트 2026년 8월 23일
컨테이너는 일회용이에요. 그 안에 작성한 모든 것은 컨테이너와 함께 사라져요. 데이터는 외부에 있어야 하며, 방법은 정확히 두 가지예요: 이름 있는 볼륨과 호스트 디렉터리 바인드 마운트예요.
두 가지 방법과 각각의 사용 시점
services:
db:
image: postgres:17
volumes:
- db-data:/var/lib/postgresql/data # named volume
app:
image: nginx:1.27
volumes:
- ./site:/usr/share/nginx/html:ro # directory bind mount
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
db-data:
이름 있는 볼륨은 Docker 자체에서 생성하고 /var/lib/docker/volumes/<name>/_data에 저장해요. 내부 권한은 이미지가 자동으로 설정해요. 데이터베이스와 내부 서비스 상태를 이렇게 보관해요.
디렉터리 바인드 마운트는 머신 디스크의 일반 경로예요. 설정 파일, 웹사이트 정적 자산, 인증서를 이렇게 제공해요: 편집기에서 편하게 수정하고 저장소에 보관할 수 있어요.
:ro 플래그는 마운트를 읽기 전용으로 만들어요. 컨테이너에 쓰기 권한이 필요 없는 모든 곳에 사용하세요 — 값싼 보호 장치예요.
모든 것이 물리적으로 저장되는 위치
docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail
마지막 명령은 디스크 공간이 부족할 때 가장 먼저 실행할 명령이에요. 자세한 내용: 디스크 공간.
docker compose down -v와docker volume prune은 볼륨을 영구적으로 삭제해요. 데이터베이스가 있는 볼륨은 컨테이너가 중지된 동안 "사용되지 않는" 것처럼 보여서 정리 대상에 포함돼요. 정리하기 전에 목록을 확인하세요:docker volume ls -f dangling=true.
복사와 마이그레이션
일회용 컨테이너로 이름 있는 볼륨을 복사하기:
docker run --rm -v db-data:/from -v $(pwd):/to alpine \
tar czf /to/db-data.tar.gz -C /from .
복원하기:
docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
tar xzf /from/db-data.tar.gz -C /to
데이터베이스의 경우 이 방법은 컨테이너가 중지된 상태에서만 적합해요: 실행 중인 데이터베이스의 파일 수준 복사는 일관성이 깨질 수 있어요. 데이터베이스 자체 도구인 pg_dump, mysqldump로 덤프하는 것이 더 좋아요. 정확히 무엇을 복사할지를 참고하세요.
권한
바인드 마운트에서 가장 흔한 실수는 소유자 불일치예요. 컨테이너 내부에서 프로세스는 자체 UID로 실행되며, 호스트가 root로 생성한 파일은 프로세스가 접근할 수 없어요.
docker compose exec app id
sudo chown -R 1000:1000 ./data
많은 이미지가 PUID/PGID 변수를 지원해요 — 디렉터리 소유자를 변경하는 것보다 편리해요.
흔한 실수
- 컨테이너 내부에 데이터를 작성했어요. 업데이트 중 컨테이너를 다시 생성했더니 — 데이터가 사라졌어요. 확인:
docker diff <container>는 파일 시스템에서 무엇이 변경되었는지 보여줘요; 그곳에 큰 쓰기가 있다면 경고 신호예요. - 이미지의 비어 있지 않은 경로 위에 디렉터리를 바인드 마운트했어요. 이미지의 내용이 가려지고 서비스가 자체 파일을 찾지 못해요.
- 바인드 마운트에 상대 경로를 사용했어요. 이는 현재 디렉터리가 아니라
compose.yaml이 있는 디렉터리를 기준으로 해석돼요. 다른 위치에서 실행하면 새 빈 디렉터리가 생성돼요. - OS 재설치 중 볼륨을 잊었어요. 재설치는 디스크를 완전히 지워요. 복사본은 이 머신이 아닌 곳에 보관해야 해요.