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