다른 호스트로 Docker 볼륨 마이그레이션 방법

DockerBeginner
지금 연습하기

소개

Docker 볼륨은 컨테이너화된 애플리케이션에 영구적인 스토리지를 제공하여 컨테이너가 중지되거나 제거되더라도 데이터가 그대로 유지되도록 합니다. 인프라가 발전함에 따라, 확장, 업그레이드 또는 서비스 이전을 지원하기 위해 이러한 볼륨을 다른 호스트로 마이그레이션해야 할 수 있습니다.

이 튜토리얼은 호스트 간 Docker 볼륨을 마이그레이션하는 과정을 안내합니다. 볼륨을 생성하고, 데이터를 채우고, 백업하고, 새 호스트에서 복원하는 방법을 배우게 됩니다. 이 랩을 마치면 컨테이너화된 환경에서 데이터 연속성을 보장하기 위한 Docker 볼륨 마이그레이션 기술에 대한 명확한 이해를 얻게 될 것입니다.

Docker 볼륨 이해 및 생성

Docker 볼륨은 컨테이너에 영구적인 스토리지를 제공합니다. 볼륨을 마이그레이션하기 전에, 볼륨이 무엇인지 그리고 어떻게 생성하는지 이해해야 합니다.

Docker 볼륨이란 무엇인가요?

Docker 볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 영구적으로 저장하기 위한 선호되는 메커니즘입니다. 컨테이너가 제거될 때 손실되는 컨테이너의 쓰기 가능한 레이어에 저장된 데이터와 달리, 볼륨은 Docker 에 의해 완전히 관리되며 컨테이너와 독립적으로 존재합니다.

Docker 볼륨의 주요 이점은 다음과 같습니다.

  • 컨테이너 수명 주기 전반에 걸친 데이터 지속성
  • 컨테이너 간 데이터 공유 기능
  • 컨테이너 파일 시스템보다 우수한 성능
  • 컨테이너와 독립적인 관리

첫 번째 Docker 볼륨 생성하기

간단한 Docker 볼륨을 생성하는 것으로 시작해 보겠습니다.

docker volume create my-data-volume

이 명령을 실행하면 Docker 는 my-data-volume이라는 새 볼륨을 생성합니다. 터미널에 볼륨 이름이 출력되는 것을 확인할 수 있습니다.

my-data-volume

다음 명령을 사용하여 시스템의 모든 Docker 볼륨을 나열할 수 있습니다.

docker volume ls

그러면 모든 볼륨의 테이블이 표시됩니다.

DRIVER    VOLUME NAME
local     my-data-volume

Docker 볼륨 검사하기

볼륨에 대한 자세한 정보를 얻으려면 inspect 명령을 사용하십시오.

docker volume inspect my-data-volume

JSON 형식으로 볼륨에 대한 자세한 정보를 볼 수 있습니다.

[
  {
    "CreatedAt": "2023-10-01T12:34:56Z",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-data-volume/_data",
    "Name": "my-data-volume",
    "Options": {},
    "Scope": "local"
  }
]

Mountpoint 값을 확인하십시오. 이것은 Docker 가 호스트 시스템에 볼륨 데이터를 저장하는 위치입니다.

컨테이너와 함께 Docker 볼륨 사용하기

이제 볼륨을 생성했으므로 컨테이너와 함께 사용해 보겠습니다. 볼륨을 마운트하고 데이터를 추가하는 간단한 컨테이너를 생성합니다.

docker run --name my-container -v my-data-volume:/data ubuntu /bin/bash -c "echo 'Hello from Docker volume' > /data/test.txt"

이 명령은 다음을 수행합니다.

  • my-container라는 컨테이너를 생성합니다.
  • my-data-volume을 컨테이너 내부의 /data 디렉토리에 마운트합니다.
  • 해당 디렉토리의 파일에 텍스트를 쓰는 간단한 명령을 실행합니다.

동일한 볼륨을 마운트하는 다른 컨테이너를 생성하여 데이터가 볼륨에 기록되었는지 확인해 보겠습니다.

docker run --rm -v my-data-volume:/data ubuntu cat /data/test.txt

다음 출력을 확인해야 합니다.

Hello from Docker volume

이것은 데이터가 볼륨에 지속적으로 저장되며 다른 컨테이너에서 액세스할 수 있음을 보여줍니다.

볼륨 마이그레이션 준비

Docker 볼륨을 다른 호스트로 마이그레이션하기 전에, 소스 데이터를 준비하고 마이그레이션 프로세스를 이해해야 합니다. 이 단계에서는 볼륨에 더 많은 데이터를 추가하고 마이그레이션을 위해 준비합니다.

볼륨에 더 많은 데이터 추가하기

볼륨에 더 많은 데이터를 추가할 컨테이너를 생성해 보겠습니다. 이렇게 하면 모든 볼륨 데이터가 제대로 마이그레이션되었는지 시연하는 데 도움이 됩니다.

docker run --name data-generator -v my-data-volume:/data ubuntu /bin/bash -c "mkdir -p /data/config && echo 'database_url=postgres://user:password@db:5432/mydb' > /data/config/settings.conf && echo 'This is important data' > /data/important.txt"

이 명령은 볼륨에 샘플 내용이 있는 디렉토리와 파일을 생성합니다.

볼륨의 데이터 구조를 확인해 보겠습니다.

docker run --rm -v my-data-volume:/data ubuntu ls -la /data

다음과 유사한 출력을 확인해야 합니다.

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

파일 중 하나의 내용도 확인해 보겠습니다.

docker run --rm -v my-data-volume:/data ubuntu cat /data/important.txt

출력:

This is important data

볼륨 마이그레이션 접근 방식 이해하기

Docker 볼륨을 마이그레이션하는 데는 여러 가지 접근 방식이 있습니다.

  1. 직접적인 호스트 간 복사: 호스트 간에 볼륨 데이터를 직접 복사합니다.
  2. 백업 및 복원: 백업 아카이브를 생성하고 새 호스트에서 복원합니다.
  3. Docker 플러그인 사용: 일부 스토리지 플러그인에는 내장된 복제 기능이 있습니다.

이 랩에서는 대부분의 환경에서 작동하고 특별한 플러그인이 필요하지 않은 백업 및 복원 접근 방식을 사용합니다.

볼륨 백업 생성하기

볼륨 백업을 생성하기 위해 Docker 컨테이너를 사용하여 볼륨 내용을 아카이브합니다.

docker run --rm -v my-data-volume:/source -v $(pwd):/backup ubuntu tar cvf /backup/my-data-volume-backup.tar -C /source .

이 명령은 다음을 수행합니다.

  • 컨테이너의 /source에 볼륨을 마운트합니다.
  • 컨테이너의 /backup에 현재 디렉토리를 마운트합니다.
  • /source 디렉토리의 모든 항목에 대한 tar 아카이브를 생성하고 /backup/my-data-volume-backup.tar에 저장합니다.

백업 파일이 생성되었는지 확인합니다.

ls -lh my-data-volume-backup.tar

다음과 유사한 내용을 확인해야 합니다.

-rw-r--r-- 1 labex labex 10K Oct  1 12:34 my-data-volume-backup.tar

백업 파일의 내용을 검사하여 모든 항목이 제대로 아카이브되었는지 확인해 보겠습니다.

tar -tf my-data-volume-backup.tar

출력에는 다음이 포함되어야 합니다.

./
./config/
./config/settings.conf
./important.txt
./test.txt

이제 볼륨 백업을 생성했으므로 새 호스트로 마이그레이션하는 것을 시뮬레이션할 준비가 되었습니다.

새 호스트로 볼륨 마이그레이션 시뮬레이션

실제 시나리오에서는 scp, rsync 또는 파일 공유 서비스를 사용하여 백업 파일을 새 호스트로 전송합니다. 이 랩에서는 원래 볼륨을 제거하고 데이터를 복원할 새 볼륨을 생성하여 마이그레이션을 시뮬레이션합니다.

새 호스트 환경 시뮬레이션

먼저, 이전 컨테이너를 정리하여 새 환경으로 이동하는 것을 시뮬레이션해 보겠습니다.

docker rm -f my-container data-generator

이제 원래 볼륨을 제거하여 새 호스트에서 처음부터 시작하는 것을 시뮬레이션해 보겠습니다.

docker volume rm my-data-volume

"새 호스트"에서 볼륨을 나타낼 새 볼륨을 생성합니다.

docker volume create my-new-host-volume

백업에서 볼륨 복원하기

이제 백업을 새 볼륨으로 복원합니다.

docker run --rm -v my-new-host-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xvf /backup/my-data-volume-backup.tar"

이 명령은 다음을 수행합니다.

  • 임시 컨테이너를 생성합니다.
  • 새 볼륨을 /destination에 마운트합니다.
  • 현재 디렉토리 (백업이 있는 곳) 를 /backup에 마운트합니다.
  • tar 아카이브를 /destination 디렉토리로 추출합니다.

복원된 데이터 확인하기

모든 데이터가 새 볼륨으로 제대로 복원되었는지 확인해 보겠습니다.

docker run --rm -v my-new-host-volume:/data ubuntu ls -la /data

이전과 동일한 파일 구조를 확인해야 합니다.

total 12
drwxr-xr-x 3 root root 4096 Oct  1 12:34 .
drwxr-xr-x 1 root root 4096 Oct  1 12:34 ..
drwxr-xr-x 2 root root 4096 Oct  1 12:34 config
-rw-r--r-- 1 root root   21 Oct  1 12:34 important.txt
-rw-r--r-- 1 root root   24 Oct  1 12:34 test.txt

데이터가 손상되지 않았는지 확인하기 위해 파일 중 하나의 내용을 확인합니다.

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/important.txt

출력:

This is important data

구성 파일도 확인합니다.

docker run --rm -v my-new-host-volume:/data ubuntu cat /data/config/settings.conf

출력:

database_url=postgres://user:password@db:5432/mydb

새 컨테이너와 함께 복원된 볼륨 사용하기

이제 볼륨을 성공적으로 "마이그레이션"했으므로 새 컨테이너와 함께 사용해 보겠습니다.

docker run --name my-new-container -v my-new-host-volume:/app/data -d nginx

이렇게 하면 복원된 볼륨을 /app/data에 마운트하는 새 Nginx 컨테이너가 생성됩니다.

컨테이너가 볼륨 데이터에 액세스할 수 있는지 확인해 보겠습니다.

docker exec my-new-container ls -la /app/data

이전과 동일한 파일을 확인해야 하며, 이는 마이그레이션이 성공했음을 확인합니다.

새 볼륨을 사용하도록 애플리케이션 업데이트하기

실제 시나리오에서는 볼륨을 새 호스트로 마이그레이션한 후 새 볼륨 이름 또는 경로를 사용하도록 Docker Compose 파일 또는 컨테이너 실행 명령을 업데이트해야 합니다. 예를 들어 Docker Compose 를 사용하는 경우 다음과 같이 docker-compose.yml 파일을 업데이트할 수 있습니다.

version: "3"
services:
  webapp:
    image: nginx
    volumes:
      - my-new-host-volume:/app/data
volumes:
  my-new-host-volume:
    external: true

이렇게 하면 Docker 가 my-new-host-volume이라는 외부에서 생성된 볼륨을 사용하도록 지시합니다.

마이그레이션 프로세스가 완료되었습니다! 다음을 성공적으로 수행했습니다.

  1. Docker 볼륨을 생성하고 데이터를 추가했습니다.
  2. 볼륨 데이터를 백업했습니다.
  3. 시뮬레이션된 "새 호스트"에 새 볼륨을 생성했습니다.
  4. 백업 데이터를 새 볼륨으로 복원했습니다.
  5. 데이터 무결성을 확인했습니다.
  6. 마이그레이션된 볼륨에 새 컨테이너를 연결했습니다.

모범 사례 및 고급 마이그레이션 기법

Docker 볼륨 마이그레이션의 기본 사항을 이해했으니, 이제 볼륨 마이그레이션을 더욱 효율적이고 견고하게 만들기 위한 모범 사례와 고급 기법을 살펴보겠습니다.

볼륨 마이그레이션 계획

볼륨 마이그레이션을 계획할 때 다음 요소를 고려하십시오.

  1. 볼륨 크기: 볼륨이 클수록 전송 시간이 오래 걸리며 특별한 처리가 필요할 수 있습니다.
  2. 다운타임 요구 사항: 애플리케이션이 허용할 수 있는 다운타임의 양을 결정합니다.
  3. 데이터 민감도: 전송 중에 민감한 데이터가 적절하게 보호되도록 합니다.
  4. 네트워크 대역폭: 호스트 간의 사용 가능한 대역폭을 고려합니다.

마이그레이션 프로세스 자동화

빈번한 마이그레이션 또는 여러 볼륨의 마이그레이션의 경우 자동화를 통해 시간과 오류를 줄일 수 있습니다. 백업 및 복원 프로세스를 자동화하는 간단한 쉘 스크립트를 만들어 보겠습니다.

nano migrate-volume.sh

스크립트에 다음 내용을 추가합니다.

#!/bin/bash
## Simple Docker volume migration script

if [ $## -ne 2 ]; then
  echo "Usage: $0 <source_volume> <destination_volume>"
  exit 1
fi

SOURCE_VOLUME=$1
DEST_VOLUME=$2
BACKUP_FILE="/tmp/${SOURCE_VOLUME}-backup.tar"

echo "Creating backup of ${SOURCE_VOLUME}..."
docker run --rm -v ${SOURCE_VOLUME}:/source -v /tmp:/backup ubuntu tar cf /backup/${SOURCE_VOLUME}-backup.tar -C /source .

echo "Creating destination volume ${DEST_VOLUME}..."
docker volume create ${DEST_VOLUME}

echo "Restoring backup to ${DEST_VOLUME}..."
docker run --rm -v ${DEST_VOLUME}:/destination -v /tmp:/backup ubuntu bash -c "cd /destination && tar xf /backup/${SOURCE_VOLUME}-backup.tar"

echo "Migration complete. Verifying volume contents..."
docker run --rm -v ${DEST_VOLUME}:/data ubuntu ls -la /data

echo "Done!"

파일을 저장하고 (Ctrl+O, Enter) 종료합니다 (Ctrl+X).

스크립트를 실행 가능하게 만듭니다.

chmod +x migrate-volume.sh

이제 단일 명령으로 볼륨을 마이그레이션할 수 있습니다.

./migrate-volume.sh my-new-host-volume another-volume

이 명령은 my-new-host-volume의 백업을 생성하고, another-volume이라는 새 볼륨을 생성한 다음, 백업을 해당 볼륨으로 복원합니다.

대용량 볼륨 처리

대용량 볼륨의 경우 기본 tar 접근 방식이 비효율적일 수 있습니다. 몇 가지 대안은 다음과 같습니다.

  1. 증분 백업: 마지막 백업 이후의 변경 사항만 전송합니다.
  2. 압축: 압축을 사용하여 백업 크기를 줄입니다.
  3. 직접 복사: rsync를 사용하여 호스트 간에 직접 복사합니다.

압축 백업 접근 방식을 구현해 보겠습니다.

docker run --rm -v my-new-host-volume:/source -v $(pwd):/backup ubuntu tar czf /backup/compressed-backup.tar.gz -C /source .

tar에 추가된 z 옵션은 압축을 활성화하여 더 작은 백업 파일을 생성합니다. 이는 특히 텍스트가 많은 데이터에 유용합니다.

압축 백업에서 복원하려면 다음을 수행합니다.

docker volume create compressed-volume
docker run --rm -v compressed-volume:/destination -v $(pwd):/backup ubuntu bash -c "cd /destination && tar xzf /backup/compressed-backup.tar.gz"

프로덕션 환경에서의 볼륨 마이그레이션

프로덕션 환경에서는 다음 추가 접근 방식을 고려할 수 있습니다.

  1. 스토리지 드라이버 복제: 일부 스토리지 드라이버는 내장 복제를 지원합니다.
  2. Docker 볼륨 플러그인: 스토리지 시스템에 대한 특수 플러그인을 사용합니다.
  3. 데이터베이스 백업: 데이터베이스 볼륨의 경우 데이터베이스의 네이티브 백업 도구를 사용합니다.
  4. 예약된 마이그레이션: cron 과 같은 도구를 사용하여 정기적인 백업을 예약합니다.

이로써 Docker 볼륨 마이그레이션 여정이 완료되었습니다. 이제 인프라 변경 중에 컨테이너화된 애플리케이션의 데이터가 손상되지 않도록 보장하면서 호스트 간에 Docker 볼륨을 효과적으로 마이그레이션할 수 있는 지식과 도구를 갖추게 되었습니다.

요약

이 랩에서는 컨테이너화된 애플리케이션을 관리하는 데 필수적인 기술인 Docker 볼륨을 호스트 간에 마이그레이션하는 방법을 배웠습니다. 다음 사항에 대한 실질적인 경험을 얻었습니다.

  • Docker 볼륨 생성 및 관리
  • Docker 볼륨에 데이터 추가 및 액세스
  • tar 명령을 사용하여 볼륨 데이터 백업
  • 새 호스트에서 볼륨 데이터 복원
  • 마이그레이션 후 데이터 무결성 확인
  • 볼륨 마이그레이션을 위한 자동화 스크립트 생성
  • 대용량 볼륨을 포함한 다양한 마이그레이션 시나리오 처리

이러한 기술을 통해 환경 간에 컨테이너를 이동하거나, 인프라를 확장하거나, 시스템 업그레이드를 수행할 때 데이터 연속성을 유지할 수 있습니다. Docker 볼륨 마이그레이션은 필요한 경우 영구 데이터를 안전하고 안정적으로 전송할 수 있다는 것을 알고 컨테이너화된 애플리케이션을 자신 있게 관리할 수 있도록 해주는 기본적인 작업입니다.