
Docker는 컨테이너 기반의 애플리케이션 배포와 관리를 쉽게 해줍니다. 그러나 컨테이너가 삭제되거나 생성될 때마다 데이터가 사라지는 문제를 해결하기 위해 데이터 저장소를 관리할 필요가 있습니다. 이때 사용되는 것이 바로 볼륨 마운트와 바인드 마운트입니다. 이번 포스팅에서는 이 두 가지 마운트 방식과 그 활용법에 대해 상세히 알아보겠습니다.
볼륨과 마운트 개념
볼륨: 하드디스크나 SSD와 같은 저장소의 한 영역을 분할하여 데이터를 보관하는 방식입니다.
마운트: 특정 저장소를 운영체제나 소프트웨어에 연결하여 관리할 수 있도록 하는 과정입니다.
컨테이너는 계속 삭제되고 생성되지만, 데이터는 지속적으로 유지되어야 하므로, 별도로 관리할 수 있는 공간 마련이 필요합니다. 이를 통해 데이터 퍼시스턴시가 가능해집니다.
데이터 영속성이 필요한 이유
- 컨테이너는 임시적인 특성을 가지고 있어 삭제 시 모든 데이터가 사라집니다
- 애플리케이션 업데이트나 재배포 시 데이터 보존이 필요합니다
- 여러 컨테이너 간 데이터 공유가 필요한 경우가 있습니다
- 백업과 복구를 위한 안정적인 데이터 저장소가 필요합니다
스토리지 마운트 종류
볼륨 마운트
Docker 엔진이 관리하는 볼륨을 생성하고 이를 다른 컨테이너와 연결합니다. 관리가 복잡할 수 있지만, 운영체제에 의존하지 않고 안정적입니다.
바인드 마운트
호스트 컴퓨터의 특정 폴더 및 파일을 컨테이너에 직접 마운트하는 방식입니다. 파일 접근이 용이하고 사용이 간편합니다.
스토리지 마운트 차이점
| 스토리지 영역 | Docker 볼륨 | 호스트의 폴더 및 파일 |
| 물리적 위치 | Docker 엔진 관리 영역 | 호스트의 임의 위치 |
| 마운트 절차 | 볼륨 생성 후 마운트 | 기존 폴더 및 파일 마운트 |
| 내용 편집 | Docker 컨테이너를 통해 | 일반 폴더 및 파일처럼 |
| 백업 | 절차가 복잡함 | 일반 폴더 및 파일처럼 |
| 보안 | Docker가 관리하여 안전 | 호스트 파일시스템 노출 |
| 성능 | 최적화됨 | 호스트 파일시스템 의존 |
| 이식성 | 높음 | 낮음 (경로 의존적) |
임시 메모리 (tmpfs) 마운트
임시 메모리 마운트는 디스크가 아닌 주 메모리 영역을 마운트하여, 디스크보다 빠른 속도로 읽기 및 쓰기가 가능합니다. 그러나 Docker 엔진이 정지되거나 호스트가 재부팅되면 데이터가 사라지므로 주의가 필요합니다.
# tmpfs 마운트 예시
docker run -d --name redis-cache --tmpfs /data:rw,noexec,nosuid,size=100m redis스토리지 마운트 커맨드
스토리지 경로와 컨테이너의 특정 경로를 연결하는 명령어입니다. 볼륨을 생성한 후 컨테이너를 생성하면서 마운트합니다.
볼륨 생성 예제
# 볼륨 생성
docker volume create volex001
# 볼륨 목록 확인
docker volume ls출력 예시:
DRIVER VOLUME NAME
local ollama-webui_ollama
local ollama-webui_open-webui
local open-webui
local repo
local volex001볼륨 제거 예제
# 볼륨 삭제
docker volume rm volex001
# 볼륨 목록 재확인
docker volume ls주요 하위 커맨드
| create | 볼륨을 생성 |
| inspect | 볼륨의 상세 정보를 출력 |
| ls | 볼륨 목록을 출력 |
| prune | 마운트되지 않은 볼륨 제거 |
| rm | 대상 볼륨 제거 |
| update | 볼륨 업데이트 (클러스터 볼륨만) |
컨테이너에 스토리지를 마운트하는 커맨드
바인드 마운트
docker run --name 컨테이너이름 -v 호스트경로:컨테이너경로 httpd
# 실제 예시
docker run --name web-server -v /home/user/website:/usr/local/apache2/htdocs httpd볼륨 마운트
docker run --name 컨테이너이름 -v 볼륨명:컨테이너경로 httpd
# 실제 예시
docker run --name web-server -v my-volume:/usr/local/apache2/htdocs httpd--mount 플래그 사용 (권장)
# 볼륨 마운트 (권장 방식)
docker run --mount type=volume,source=my-volume,target=/usr/local/apache2/htdocs httpd
# 바인드 마운트 (권장 방식)
docker run --mount type=bind,source=/home/user/website,target=/usr/local/apache2/htdocs httpd
# 읽기 전용 마운트
docker run --mount type=volume,source=my-volume,target=/app/data,readonly httpd아파치에 스토리지를 마운트하여 index.html 파일 호출
먼저, 호출할 HTML 파일을 생성합니다:
Docker 볼륨 테스트
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 100px;
background-color: #f0f8ff;
}
.container {
background-color: white;
padding: 30px;
border-radius: 15px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
display: inline-block;
}
안녕하세요!
Docker 볼륨 마운트 테스트 페이지입니다.
현재 시간:
function updateTime() {
const now = new Date();
document.getElementById('time').textContent = now.toLocaleString('ko-KR');
}
updateTime();
setInterval(updateTime, 1000);
아파치 컨테이너 생성 및 실행 + 바인드 마운트
docker run --name apaex010 -d -p 8080:80 \
-v /Users/test/Downloads/mount:/usr/local/apache2/htdocs httpd실행 결과:
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
7ce705000c39: Pull complete
1cfbb68d32bc: Pull complete
4f4fb700ef54: Pull complete
60e4ed7f50dd: Pull complete
e219b11acd47: Pull complete
8dffd7e864fd: Pull complete
Digest: sha256:4c7788695c832bf415a662dfb5160f1895e65fc65c025e85f436ee2c9e7d7f3e
Status: Downloaded newer image for httpd:latest볼륨 생성 후 아파치 컨테이너 생성 및 실행 + 볼륨 마운트
# 볼륨 생성
docker volume create volex020
# 볼륨 상세 정보 확인
docker volume inspect volex020출력 결과:
[
{
"CreatedAt": "2025-01-23T08:29:21Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/volex020/_data",
"Name": "volex020",
"Options": null,
"Scope": "local"
}
]# 볼륨 마운트로 컨테이너 실행
docker run --name apaex020 -d -p 8181:80 -v volex020:/usr/local/apache2/htdocs httpd볼륨 마운트 확인
볼륨 마운트는 직접 호스트의 파일을 확인할 수 없지만, docker volume inspect 및 docker container inspect 명령어를 통해 확인할 수 있습니다.
볼륨 정보 확인
docker volume inspect volex020컨테이너 마운트 정보 확인
docker container inspect apaex020출력 예시 (Mounts 섹션):
"Mounts": [
{
"Type": "volume",
"Name": "volex020",
"Source": "/var/lib/docker/volumes/volex020/_data",
"Destination": "/usr/local/apache2/htdocs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]볼륨 데이터 조작 예시
# 볼륨에 파일 추가 (임시 컨테이너 사용)
docker run --rm -v volex020:/data alpine sh -c "echo 'Hello from Volume!' > /data/index.html"
# 볼륨 내용 확인
docker run --rm -v volex020:/data alpine ls -la /data
# 웹 브라우저에서 http://localhost:8181 접속하여 확인볼륨 백업
볼륨 마운트를 백업하기 위해서는 리눅스 컨테이너를 이용해 압축하고 복사합니다.
바인드 마운트는 호스트 연결 파일 및 폴더를 별도 공간에 복사하면 되지만 볼륨 마운트는 볼륨을 복사할 수 없으므로 리눅스 컨테이너를 연결하여 압축 및 복사합니다.
busybox 운영체제를 생성하는데 바로 삭제할 것이기 때문에 --rm 옵션이 붙었고, 볼륨을 마운트, 백업할 호스트의 위치를 바인드 마운트 하여 볼륨 위치에 있는 파일을 tar로 압축해서 바인드된 호스트 위치로 백업파일을 생성합니다.
* 중요: 볼륨을 압축해서 백업할때는 반드시 원래 사용중인 컨테이너를 정지하고 진행해야 합니다.
백업하기 예제
# 컨테이너 정지
docker stop apaex020
# 볼륨 백업
docker run --rm \
-v volex020:/source_bak \
-v /backup:/backup \
busybox tar cvzf /backup/volex020_backup.tar.gz -C /source_bak .복원하기 예제
# 새 볼륨 생성
docker volume create volex020_restored
# 볼륨 복원
docker run --rm \
-v volex020_restored:/source_bak \
-v /backup:/backup \
busybox tar xvzf /backup/volex020_backup.tar.gz -C /source_bak고급 백업 스크립트
#!/bin/bash
# volume-backup.sh
VOLUME_NAME=$1
BACKUP_DIR=${2:-/backup}
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${VOLUME_NAME}_${TIMESTAMP}.tar.gz"
if [ -z "$VOLUME_NAME" ]; then
echo "사용법: $0 [백업디렉토리]"
exit 1
fi
echo "볼륨 '$VOLUME_NAME' 백업 시작..."
# 백업 디렉토리 생성
mkdir -p "$BACKUP_DIR"
# 볼륨 백업
docker run --rm \
-v "$VOLUME_NAME":/source \
-v "$BACKUP_DIR":/backup \
busybox tar czf "/backup/$(basename "$BACKUP_FILE")" -C /source .
if [ $? -eq 0 ]; then
echo "백업 완료: $BACKUP_FILE"
echo "파일 크기: $(du -h "$BACKUP_FILE" | cut -f1)"
else
echo "백업 실패!"
exit 1
fi실무 활용 예시
데이터베이스 데이터 영속성
# MySQL 데이터 볼륨 생성
docker volume create mysql_data
# MySQL 컨테이너 실행
docker run --name mysql-server -d \
-e MYSQL_ROOT_PASSWORD=admin123 \
-e MYSQL_DATABASE=myapp \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 mysql:8.0웹 애플리케이션 로그 관리
# 로그 볼륨 생성
docker volume create app_logs
# 애플리케이션 컨테이너 실행
docker run --name web-app -d \
-v app_logs:/var/log/app \
-p 8080:8080 my-web-app
# 로그 확인용 컨테이너
docker run --rm -it \
-v app_logs:/logs \
alpine tail -f /logs/app.log개발 환경 설정
# 개발 코드 바인드 마운트 (실시간 반영)
docker run --name dev-server -d \
-v "$(pwd)/src":/app/src \
-v "$(pwd)/config":/app/config:ro \
-p 3000:3000 node:18-alpine npm run dev결론
Docker의 볼륨 마운트와 바인드 마운트는 데이터 관리를 위한 강력한 도구입니다. 각 방식의 특성과 장단점을 이해하고, 필요에 따라 적절한 방법을 선택하여 데이터의 지속성을 확보할 수 있습니다.
핵심 포인트:
- 볼륨 마운트: Docker가 관리하는 안전하고 이식성 높은 스토리지
- 바인드 마운트: 호스트 파일시스템과 직접 연결되는 간편한 방식
- 적절한 백업 전략: 볼륨 백업을 통한 데이터 보호
- 성능 최적화: tmpfs 마운트를 활용한 고속 임시 스토리지
- 보안 고려사항: 읽기 전용 마운트와 권한 관리
Docker 스토리지 관리를 마스터하면 컨테이너 기반 애플리케이션의 데이터 영속성과 안정성을 크게 향상시킬 수 있으며, 프로덕션 환경에서도 안심하고 사용할 수 있는 견고한 시스템을 구축할 수 있습니다.
'IT기술 > 도커 (docker)' 카테고리의 다른 글
| Docker 컨테이너 개조 완벽 가이드: 실행 중인 컨테이너 커스터마이징 방법 (14) | 2025.07.12 |
|---|---|
| Docker 이미지 생성과 배포 완벽 가이드: 컨테이너에서 커스텀 이미지 만들기 (4) | 2025.07.11 |
| Docker 컨테이너와 호스트 간 파일 복사 완벽 가이드: 효율적인 파일 관리 방법 (4) | 2025.07.09 |
| RKE2 Containerd 완벽 가이드: 차세대 컨테이너 런타임의 핵심 장점과 실전 활용법 (2) | 2025.07.09 |
| Docker Redmine과 MariaDB 연동 완벽 가이드: 프로젝트 관리 시스템 구축하기 (5) | 2025.07.09 |