NAS Docker 컨테이너 데이터 자동 백업 및 복구 가이드

NAS Docker 컨테이너의 중요 데이터를 자동으로 백업하고 복구하는 단계별 가이드입니다. 바인드 마운트된 데이터를 tar와 크론탭을 활용하여 안전하게 관리하세요.

데이터 손실은 개인이나 비즈니스에 치명적일 수 있으며, NAS에서 운영하는 Docker 컨테이너의 중요한 데이터는 주기적인 백업이 필수입니다. 이 가이드는 여러분의 NAS Docker 컨테이너 데이터를 안전하게 자동 백업하고, 필요한 경우 신속하게 복구하는 구체적인 방법을 안내합니다.

목차

  1. 왜 Docker 데이터 백업이 중요한가?
  2. Docker 데이터 저장 방식 이해
  3. 수동 데이터 백업
  4. 자동 백업 스크립트 작성
  5. 크론탭으로 자동화 설정
  6. 데이터 복구 절차

가정 및 전제조건

NAS의 Docker 데이터를 파일로 백업하려면 중요한 데이터가 어느 호스트 경로에 바인드 마운트돼 있는지부터 확인하세요. 이 글의 tar 절차는 설정 파일·정적 파일처럼 백업 순간에 쓰기가 멈춘 데이터 또는 관련 컨테이너를 중지한 뒤의 파일 백업을 대상으로 합니다. PostgreSQL처럼 실행 중 계속 쓰이는 데이터베이스 파일을 서비스 가동 상태에서 그대로 tar로 묶는 용도로는 사용하지 않습니다. 실행 중 논리 백업이 필요하면 데이터베이스 전용 도구인 pg_dump 같은 방법을 사용하세요. 즉, 컨테이너 내부의 데이터가 NAS 파일 시스템의 특정 폴더와 직접 연결되어 있다는 의미입니다. 이 방식은 NAS에서 Docker를 운영할 때 데이터를 직접 관리하기에 가장 일반적이고 효율적인 방법 중 하나입니다.

1. 왜 Docker 데이터 백업이 중요한가?

Docker 컨테이너는 애플리케이션을 효율적으로 격리하고 실행하는 강력한 도구이지만, 컨테이너 자체가 사라지거나 손상될 경우 내부 데이터도 함께 유실될 위험이 있습니다. 특히 NAS에서 파일 서버, 미디어 서버, 스마트 홈 자동화 등 중요한 서비스를 Docker로 운영한다면, 설정 파일, 데이터베이스, 사용자 파일 등 핵심 데이터의 정기적인 백업은 필수적입니다.

예상치 못한 시스템 오류, 실수로 인한 삭제, 하드웨어 고장 등의 상황에서도 백업된 데이터를 통해 빠르게 정상 상태로 돌아갈 수 있습니다. 백업은 단순한 선택이 아니라, 여러분의 소중한 정보를 보호하기 위한 가장 기본적인 안전장치입니다.

2. Docker 데이터 저장 방식 이해

Docker는 컨테이너 데이터를 관리하기 위해 주로 두 가지 방식을 사용합니다. 하나는 ‘볼륨(Volume)’이고, 다른 하나는 ‘바인드 마운트(Bind Mount)’입니다. 볼륨은 Docker가 관리하는 특수 공간에 데이터를 저장하며, 보통 /var/lib/docker/volumes 경로에 위치합니다. 반면, 바인드 마운트는 호스트(NAS) 파일 시스템의 특정 경로를 컨테이너 내부에 직접 연결하는 방식입니다.

NAS 환경에서는 데이터의 접근성과 관리 편의성을 위해 바인드 마운트 방식이 널리 사용됩니다. 예를 들어, docker run -v /volume1/docker/mydata:/app/data와 같이 설정했다면, 컨테이너의 /app/data 경로는 NAS의 /volume1/docker/mydata 폴더와 동기화됩니다. 따라서 백업은 주로 이 호스트 경로의 데이터를 대상으로 이루어집니다.

3. 수동 데이터 백업

자동화를 시작하기 전에, 먼저 수동으로 데이터를 백업하는 방법을 익히는 것이 중요합니다. NAS의 SSH 터미널에 접속하여 백업할 데이터가 저장된 호스트 경로를 확인합니다. 이 경로는 docker inspect <컨테이너 이름 또는 ID> 명령어를 통해 확인할 수 있습니다. Mounts 섹션에서 Source 경로를 찾으면 됩니다.

데이터 경로를 확인했다면, tar 명령어를 사용하여 해당 폴더를 압축하고 백업용 폴더에 저장할 수 있습니다. 예를 들어, /volume1/docker/mydata 폴더를 /volume1/backups 폴더에 백업하려면 다음과 같이 실행합니다.

sudo tar -C /volume1/docker -czvf "/volume1/backups/mydata_$(date +%Y%m%d%H%M%S).tar.gz" mydata

이 명령어는 현재 날짜와 시간을 포함한 압축 파일을 생성하여 백업 폴더에 저장합니다. c는 생성, z는 gzip 압축, v는 진행 상황 표시, f는 파일명을 지정하는 옵션입니다.

4. 자동 백업 스크립트 작성

수동 백업 명령어를 매번 입력하는 대신, 이를 자동화하기 위한 셸 스크립트를 작성합니다. 이 스크립트는 백업 대상 경로, 백업 저장 경로, 그리고 오래된 백업 파일을 정리하는 로직을 포함할 수 있습니다. 예를 들어, /volume1/scripts 폴더에 backup_docker_data.sh 파일을 생성하고 다음 내용을 추가합니다.

#!/bin/bash

# 백업 대상 폴더 목록
BACKUP_TARGETS=(
  "/volume1/docker/mydata"
  "/volume1/docker/another_app_data"
)

# 백업 저장 폴더
BACKUP_DIR="/volume1/backups/docker"

# 보관 일수 (예: 7일)
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"

for TARGET_PATH in "${BACKUP_TARGETS[@]}"; do
  # 폴더 이름 추출 (백업 파일명에 사용)
  FOLDER_NAME=$(basename "$TARGET_PATH")

  # 백업 파일명 (날짜_폴더명.tar.gz)
  BACKUP_FILE="${BACKUP_DIR}/$(date +%Y%m%d%H%M%S)_${FOLDER_NAME}.tar.gz"

  echo "[$(date +%Y-%m-%d %H:%M:%S)] Backing up ${TARGET_PATH} to ${BACKUP_FILE}"
  if tar -C "$(dirname "$TARGET_PATH")" -czf "$BACKUP_FILE" "$(basename "$TARGET_PATH")"; then
    echo "백업 성공: ${BACKUP_FILE}"
  else
    echo "백업 실패: ${TARGET_PATH}" >&2
    exit 1
  fi
done

# 오래된 백업 파일 정리
echo "[$(date +%Y-%m-%d %H:%M:%S)] Cleaning up old backups..."
sudo find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
echo "정리 완료."

스크립트 작성 후, 실행 권한을 부여합니다. sudo chmod +x /volume1/scripts/backup_docker_data.sh

5. 크론탭으로 자동화 설정

작성한 스크립트를 주기적으로 실행하려면 ‘크론탭(Crontab)’을 사용합니다. 크론탭은 리눅스/유닉스 시스템에서 특정 시간에 명령어를 자동으로 실행해주는 스케줄러입니다. NAS의 SSH 터미널에서 crontab -e 명령어를 입력하여 크론탭 편집기를 엽니다.

편집기 하단에 다음 줄을 추가합니다. 이 예시는 대상 폴더와 백업 폴더를 읽고 쓸 권한이 있는 계정의 crontab에서 매일 새벽 3시에 백업 스크립트를 실행하는 설정입니다. 비대화형 cron에서 로그인 셸 환경에 기대지 않도록 SHELL과 PATH를 명시합니다. MAILTO=""는 cron 실행 결과를 이메일로 받지 않도록 설정합니다.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""
0 3 * * * /volume1/scripts/backup_docker_data.sh

0 3 * * *는 각각 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-7, 일요일은 0 또는 7)을 의미합니다. 위 설정은 매일 3시 0분에 스크립트를 실행하라는 의미입니다. 저장을 위해 Ctrl+X를 누르고 Y를 입력한 뒤 Enter를 누릅니다.

6. 데이터 복구 절차

복원 예제에서 확인할 점

2026년 9월 16일 임시 디렉터리에서 mydata/a.txt와 mydata/sub/b.txt를 위와 같은 tar -C <부모경로> ... mydata 방식으로 백업·복원해 테스트해 보니, 빈 복원 디렉터리에 --strip-components=1로 푼 두 파일의 내용이 원본과 일치했습니다. 이 예제는 tar 아카이브의 경로 구조와 복원 위치를 보여줍니다. NAS별 권한 설정과 cron 실행 계정은 환경에 따라 다를 수 있고, 실제 컨테이너 데이터베이스는 해당 데이터베이스의 일관성 있는 백업·복구 절차를 따라야 합니다.

백업된 데이터를 복구해야 할 상황이 발생하면 다음 단계를 따릅니다.

1. 컨테이너 중지: 복구하려는 데이터와 관련된 Docker 컨테이너를 먼저 중지합니다. sudo docker stop [컨테이너 이름 또는 ID]

2. 기존 데이터 보존: 바로 삭제하지 말고 /volume1/docker/mydata.before-restore처럼 다른 이름으로 이동한 뒤 빈 /volume1/docker/mydata 폴더를 만듭니다. 복구가 검증될 때까지 이전 데이터는 남겨 둡니다.

3. 백업 파일 선택 및 복원: 가장 최신 또는 원하는 시점의 .tar.gz 백업 파일을 선택하여 원본 데이터 경로에 복원합니다. 예를 들어, /volume1/backups/docker/20231026030000_mydata.tar.gz 파일을 /volume1/docker/mydata 경로로 복원하려면 다음 명령어를 사용합니다.

sudo tar -xzvf /volume1/backups/docker/20231026030000_mydata.tar.gz -C /volume1/docker/mydata --strip-components=1

-C 옵션은 압축을 풀 경로를 지정하고, --strip-components=1은 압축 파일 내의 최상위 디렉토리(보통 백업 대상 폴더 이름)를 제거하여 내용물만 정확히 복원 경로에 위치하도록 합니다.

4. 컨테이너 시작: 데이터 복구가 완료되면, 중지했던 Docker 컨테이너를 다시 시작합니다. sudo docker start [컨테이너 이름 또는 ID]

백업·복구 체크리스트

  • 백업 전: docker inspect <컨테이너 이름 또는 ID>의 Mounts 섹션에서 Source 경로가 바인드 마운트 대상인지 확인합니다.
  • 백업 대상 구분: 설정·정적 파일처럼 쓰기가 멈춘 데이터만 tar로 백업하고, 서비스가 계속 쓰는 데이터베이스 파일은 tar로 묶지 않고 pg_dump 같은 데이터베이스 전용 도구를 사용합니다.
  • 복원 전: 기존 데이터를 바로 삭제하지 않고 mydata.before-restore처럼 다른 이름으로 옮겨 복구가 검증될 때까지 보존합니다.
  • 복원 후: 컨테이너를 다시 시작하기 전에 복원된 파일이 예상한 내용과 일치하는지 확인합니다.
  • 컨테이너 순서: 복구 전 중지 → 데이터 교체 → 복구 확인 → 시작 순서를 지킵니다.

결론

NAS Docker 컨테이너 데이터의 자동 백업 및 복구는 데이터 손실로부터 여러분의 서비스를 보호하는 핵심적인 과정입니다. 이 가이드에서 제시된 스크립트와 크론탭 설정을 통해 중요한 데이터를 안전하게 관리하고, 만일의 사태에 대비할 수 있기를 바랍니다. 꾸준한 백업 관리로 안심하고 NAS를 활용하세요. 이 글이 도움이 됐다면 구독과 공유 부탁드립니다!

관련 글