오늘은 컨테이너가 삭제되어도 우리의 소중한 데이터를 지켜주는 볼륨(Volume)과 다양한 마운트(Mount) 방식에 대해 알아보겠습니다.
도커 컨테이너는 기본적으로 '휘발성'입니다. 컨테이너 내부에서 생성하거나 수정한 데이터는 컨테이너가 삭제되면 함께 사라집니다.
(이것을 도커의 Writable Layer라고 합니다.) 데이터베이스의 데이터나 사용자가 업로드한 파일이 컨테이너 삭제와 함께 사라진다면 정말 끔찍하겠죠?
이 문제를 해결하고 데이터의 영속성(Persistence)을 보장하며, 호스트 PC와 컨테이너 간, 또는 컨테이너 간 데이터를 공유하기 위해 사용하는 것이 바로 볼륨과 마운트입니다.

1. 도커 볼륨(Volume)의 특징과 종류
핵심 특징
- 독립된 라이프사이클: 컨테이너의 생성, 정지, 삭제와 별개로 데이터 영역은 유지됩니다. 컨테이너를 삭제하고 다시 생성하더라도 기존 볼륨을 연결하면 데이터가 그대로 복원됩니다.
- 데이터 공유: 여러 컨테이너가 하나의 볼륨에 동시에 연결하여 데이터를 공유할 수 있습니다. (호스트 <-> 컨테이너, 컨테이너 <-> 컨테이너 모두 가능)
마운트 종류 (데이터 저장 위치에 따른 분류)
도커에서 호스트의 저장공간을 컨테이너에 연결하는 방식은 크게 세 가지가 있습니다.
- 볼륨 마운트 (Volume Mount): 가장 권장되는 방식입니다. 도커 엔진이 직접 관리하는 호스트 파일 시스템의 특정 영역(/var/lib/docker/volumes/...)에 데이터를 저장합니다.
- 바인드 마운트 (Bind Mount): 호스트 OS의 사용자가 지정한 임의의 절대 경로를 컨테이너 내부 경로와 직접 연결합니다. 도커 엔진 외부의 파일 시스템을 사용하므로 도커가 관리하지 않습니다.
- 메모리 마운트 (tmpfs Mount): 호스트의 디스크가 아닌 메모리(RAM) 영역에 데이터를 저장합니다. 호스트 OS가 리눅스인 경우에만 사용 가능하며, 보안이 중요하거나 성능이 매우 중요하지만 영구 저장할 필요가 없는 임시 데이터에 사용합니다. 컨테이너 정지 시 데이터가 사라집니다.
2. 볼륨 마운트 (Volume Mount) 실습
도커 엔진이 관리하는 전용 볼륨을 생성하고 활용하는 방법입니다.
주요 명령어
# 도커 볼륨 관련 도움말 확인
docker volume --help
# 현재 생성된 볼륨 목록 확인
docker volume ls
# 새로운 볼륨 'my-vol' 생성
docker volume create my-vol
# 볼륨 'my-vol'의 상세 정보 확인
docker volume inspect my-vol
docker volume inspect 실행 결과 (예시):
[
{
"CreatedAt": "2026-07-20T06:14:13Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data", <- 호스트 도커 엔진상의 실제 경로
"Name": "my-vol",
"Options": null,
"Scope": "local"
}
]
결과에서 Mountpoint가 실제 데이터가 저장되는 도커 전용 영역입니다.
도커 엔진(리눅스 VM 환경) 내부 경로이므로 호스트 PC에서 직접 접근하기는 어렵습니다.
볼륨 마운트 적용 및 데이터 유지 확인
컨테이너 생성 시 -v <볼륨명>:<컨테이너내부경로> 옵션을 사용하여 마운트합니다.
주의: 볼륨 마운트는 컨테이너 생성 시(run)에만 지정할 수 있으며, 구동 중인 컨테이너에 추후에 추가 지정할 수 없습니다. 따라서 통상적으로 docker compose 파일에 정의하여 관리하는 것이 일반적입니다.
# 'my-vol' 볼륨을 ubuntu 컨테이너의 /home 경로에 마운트하여 실행
docker run -itd --name my-ubuntu-vol -v my-vol:/home ubuntu
# 컨테이너 접속
docker exec -it my-ubuntu-vol sh
# 컨테이너 내부의 공유 폴더(/home)로 이동하여 테스트 파일 생성
# cd /home
# echo "hello docker" > t.txt
# ls -al
total 16
drwxr-xr-x 3 root root 4096 Jul 20 06:23 .
drwxr-xr-x 1 root root 4096 Jul 20 06:19 ..
-rw-r--r-- 1 root root 13 Jul 20 06:23 t.txt
drwxr-x--- 2 ubuntu ubuntu 4096 Jul 20 06:19 ubuntu
# cat t.txt
hello docker
# 컨테이너 나가기 (exit)
이제 my-vol 볼륨 안에 t.txt 파일이 저장되었습니다.
# 테스트 컨테이너 중지 및 삭제
docker container stop my-ubuntu-vol
docker container rm my-ubuntu-vol
# 데이터를 유지하는지 확인하기 위해 새로운 컨테이너(my-ubuntu-vol2) 구성
# 동일한 볼륨(my-vol)을 다시 /home에 마운트
docker run -itd --name my-ubuntu-vol2 -v my-vol:/home ubuntu
# 새로운 컨테이너 접속 후 데이터 확인
docker exec -it my-ubuntu-vol2 bash -c "cat /home/t.txt"
실행 결과:
hello docker
컨테이너가 삭제되어도 볼륨에 저장된 데이터는 유지되며, 새로운 컨테이너에 그대로 복원되는 것을 확인할 수 있습니다! 이것이 바로 데이터 영속성입니다
.
추가 지식: 사용하지 않는 볼륨을 정리하려면 docker volume rm <볼륨명>을 사용합니다. 마운트되지 않은 모든 볼륨을 일괄 삭제하려면 docker volume prune 명령어를 사용할 수 있습니다.
3. 바인드 마운트 (Bind Mount) 실습
호스트 PC의 특정 폴더를 컨테이너와 직접 연결하는 방식입니다. 소스 코드 개발이나 설정 파일 공유에 매우 유용합니다.
옵션 지정 방식
docker run ... -v <호스트상절대경로>:<컨테이너상경로>:<권한>
- 호스트 경로에는 반드시 절대 경로를 사용해야 합니다.
- 권한은 생략 가능하며, 기본값은 읽기/쓰기(rw)입니다. 읽기 전용으로 마운트하려면 ro를 추가합니다 (예: -v /host/path:/container/path:ro).
팁 (현재 경로 활용): 호스트 PC의 터미널 종류에 따라 현재 경로(pwd)를 절대 경로로 넘기는 방식이 다릅니다.
- PowerShell (ps): ${pwd}
- Bash/Zsh: $(pwd)
- CMD: 풀 경로(상대경로 불가) 사용
바인드 마운트 적용 및 공유 확인
실제로는 작업 디렉토리를 기준으로 상대적인 절대 경로를 주로 사용합니다. 여기서는 Nginx 설정 폴더를 공유하는 예시입니다.
# 호스트 PC의 특정 경로(~workspace/docker)를 Nginx 설정 폴더와 바인드 마운트
# 호스트 경로 예시: C:\Users\User\Desktop\workspace\docker
# 컨테이너 경로: /etc/nginx/conf.d
docker run -itd --name my-nginx-vol -v C:\Users\User\Desktop\workspace\docker:/etc/nginx/conf.d nginx
# 컨테이너 내부 셸 접속
docker exec -it my-nginx-vol bash
# 마운트된 컨테이너 내부 경로(/etc/nginx/conf.d) 확인
root@963d1c7cbd97:/# ls /etc/nginx/conf.d -al
total 4
drwxrwxrwx 1 root root 4096 Jul 20 06:38 .
drwxr-xr-x 3 root root 4096 Jul 15 23:30 ..
연결된 호스트 폴더가 비어있다면, 컨테이너 내부의 해당 폴더 내용도 비어 보일 수 있습니다
(바인드 마운트는 호스트 경로가 우선합니다).
# 컨테이너 내부에서 파일 생성
root@963d1c7cbd97:/# cd /etc/nginx/conf.d
root@963d1c7cbd97:/etc/nginx/conf.d# echo "test bind mount" > a.txt
이제 호스트 PC의 마운트 했던 폴더(C:\Users\User\Desktop\workspace\docker)로 이동해서 확인해 보세요.
컨테이너 내부에서 생성한 a.txt 파일이 호스트 폴더에도 똑같이 생성되어 있는 것을 볼 수 있습니다.
반대로 호스트에서 파일을 수정하면 컨테이너 내부에서도 즉시 반영됩니다.
요약 및 권장사항
| 특징 | 볼륨 마운트 (Volume) | 바인드 마운트 (Bind) |
| 저장 위치 | 도커 엔진 전용 영역 (/var/lib/docker/...) | 호스트 PC의 임의의 절대 경로 |
| 관리 주체 | 도커 엔진이 직접 관리 | 사용자가 OS 파일 시스템에서 관리 |
| 성능 | 상대적으로 고성능 | 호스트 파일 시스템 성능에 의존 |
| 이식성 | 볼륨 이름만 지정하므로 이식성이 높음 | 호스트마다 다른 경로 구조에 의존하여 낮은 이식성 |
| 사용 목적 | 데이터베이스, 로그 저장 등 데이터 영속성 보장 | 소스 코드 실시간 반영(개발), 호스트 설정 파일 공유 |
도커 공식 문서에서는 데이터의 영속성이 필요한 대부분의 프로덕션 환경에서는 도커 엔진이 관리하는 볼륨 마운트 사용을 권장합니다.
소스 코드를 수정하고 바로 컨테이너에 반영하여 테스트하는 개발 환경이나 도커 엔진 외부의 특정 설정 파일을 공유해야 할 때는 바인드 마운트가 유용합니다.
상황에 맞는 적절한 마운트 방식을 선택하여 효율적인 도커 데이터 관리를 하시길 바랍니다!
'코딩 개발 > Docker' 카테고리의 다른 글
| Docker - Dockerfile ADD, COPY (0) | 2026.08.07 |
|---|---|
| Dockerfile 기본 활용법 - FROM (0) | 2026.08.06 |
| Docker - Network 네트워크 (0) | 2026.08.04 |
| Docker - Container 컨테이너 (0) | 2026.08.03 |
| Docker - Image 이미지 (0) | 2026.07.31 |