docker volume
개요
Docker Volume은 컨테이너의 데이터를 영속적으로 저장하고 관리하는 메커니즘입니다. 컨테이너는 기본적으로 일회용이기 때문에, 컨테이너가 삭제되면 내부 데이터도 모두 사라집니다. Volume은 이 문제를 해결해줍니다.
volume 종류
1. volume container(volume)
일반적으로 docker에서 접근할 수 있는 volume 을 생성해서 해당 부분에 데이터 저장
# 1. 볼륨 생성 (데이터 저장소 만들기)
docker volume create my-data
# 2. 컨테이너 생성 (볼륨을 연결해서) `볼륨:컨테이너내 주소 `
docker run -d --name my-app -v my-data:/app/data nginx
# 3. 현재 상태 확인
docker ps # 컨테이너 목록
docker volume ls # 볼륨 목록
# 같은 볼륨을 새 컨테이너에 연결
docker run -d --name new-app -v my-data:/app/data nginx
# 볼륨 상세 정보 확인
docker volume inspect my-data
2. bind volume(로컬데이터)
cd /c/Users/myname/myproject
docker run -d -v $(pwd):/app nginx
3. tmpfs Mount(임시파일)
임시저장용, 보안에 민감 데이터 및 일시적인 데이터 저장용
# host의 /tmp/hostdir 의 volume을 container의 /container_dir 로 마운트
docker container run -it -v /tmp/hostdir:/container_dir -v /tmp/reacdonly:/read_dir:ro --name=test02 centos:8
# 네이밍 볼륨
docker container run -it -v /volume --name test03 centos:8
# volume
# 상세확인
docker volume inspect [volume name]
# name이 있는 volume 생성
docker volume create [volume name]
# vloume
docker container run -it --name vol_container -v persistvol:/container centos:8
# persistvol (/var/lib/docker/volumes/persisvol/_data) <--> /container
# vol_container를 volume container를 만들어서 사용
docker container run -it --volumes-from vol_container --name data_container centos:8
docker container run --rm -it --mount type=volume,source=v1,destination=/root,volume-nocopy=true --name=c1 centos:8
Named Volume 데이터를 로컬 폴더로 마이그레이션
현재 n8n_storage
Named Volume에 저장된 n8n 데이터를 C:\workspace\n8n
폴더로 옮기고 싶은 경우
1단계: 로컬 폴더 준비
mkdir C:\workspace\n8n
2단계: Named Volume에서 로컬로 복사
# Windows (Docker Desktop)
docker run --rm \
-v n8n_storage:/source \
-v /c/workspace/n8n:/destination \
alpine sh -c "cp -r /source/* /destination/"
# 또는 tar를 사용한 더 안전한 방법
docker run --rm \
-v n8n_storage:/source \
-v /c/workspace/n8n:/destination \
alpine sh -c "cd /source && tar cf - . | (cd /destination && tar xf -)"
3단계: 권한 수정 (필요시)
# 파일 소유권을 현재 사용자로 변경
docker run --rm \
-v /c/workspace/n8n:/data \
alpine chown -R 1000:1000 /data
방법 3: 단계별 안전한 마이그레이션
1단계: 백업 생성
# 먼저 백업 생성 (안전장치)
docker run --rm \
-v n8n_storage:/data \
-v /c/workspace:/backup \
alpine tar czf /backup/n8n_backup.tar.gz -C /data .
2단계: 로컬 폴더에 복원
# 로컬 폴더 생성
mkdir C:\workspace\n8n
# 백업 파일을 로컬 폴더에 압축 해제
docker run --rm \
-v /c/workspace:/backup \
-v /c/workspace/n8n:/restore \
alpine tar xzf /backup/n8n_backup.tar.gz -C /restore
3단계: docker-compose.yml 수정
n8n:
<<: *service-n8n
hostname: n8n
container_name: n8n
networks: ['demo']
restart: unless-stopped
ports:
- 5678:5678
volumes:
- /c/workspace/n8n:/home/node/.n8n # Named Volume → Bind Mount
- ./n8n/backup:/backup
- ./shared:/data/shared
depends_on:
postgres:
condition: service_healthy
n8n-import:
condition: service_completed_successfully
4단계: 테스트
# 기존 컨테이너 중지
docker-compose stop n8n
# 새 설정으로 시작
docker-compose up -d n8n
# 로그 확인
docker-compose logs -f n8n
마이그레이션 스크립트
# n8n_migration.ps1
# 1. 서비스 중지
Write-Host "Stopping n8n service..."
docker-compose stop n8n
# 2. 로컬 폴더 생성
Write-Host "Creating local directory..."
New-Item -ItemType Directory -Force -Path "C:\workspace\n8n"
# 3. 데이터 복사
Write-Host "Copying data from volume to local directory..."
docker run --rm `
-v n8n_storage:/source `
-v /c/workspace/n8n:/destination `
alpine sh -c "cp -r /source/* /destination/ 2>/dev/null || cp -r /source/.[^.]* /destination/ 2>/dev/null || true"
# 4. 권한 설정
Write-Host "Setting permissions..."
docker run --rm `
-v /c/workspace/n8n:/data `
alpine chown -R 1000:1000 /data
Write-Host "Migration completed! Please update your docker-compose.yml"
Write-Host "Change: n8n_storage:/home/node/.n8n"
Write-Host "To: /c/workspace/n8n:/home/node/.n8n"
데이터 비교
# Named Volume의 파일 목록
docker run --rm -v n8n_storage:/data alpine find /data -type f | sort
# 로컬 폴더의 파일 목록
docker run --rm -v /c/workspace/n8n:/data alpine find /data -type f | sort
# 두 결과가 동일한지 확인
용량 비교
# Named Volume 크기
docker run --rm -v n8n_storage:/data alpine du -sh /data
# 로컬 폴더 크기
docker run --rm -v /c/workspace/n8n:/data alpine du -sh /data
롤백 방법
문제가 생겼을 때 원복:
# docker-compose.yml을 원래대로 되돌리고
docker-compose down
docker-compose up -d n8n
# 또는 백업에서 Named Volume 복원
docker run --rm \
-v /c/workspace:/backup \
-v n8n_storage:/data \
alpine tar xzf /backup/n8n_backup.tar.gz -C /data