Docker 볼륨 활용하기

DockerBeginner
지금 연습하기

소개

이 실습에서는 볼륨을 사용하여 Docker 컨테이너의 데이터를 관리하는 방법을 배웁니다. Docker 볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 영구적으로 보존하기 위해 가장 권장되는 메커니즘입니다. 이 실습을 통해 볼륨의 생성, 관리, 데이터 공유, 백업 및 복구 등 Docker 볼륨의 다양한 측면을 살펴보게 됩니다. 실습을 마칠 때쯤이면 Docker 환경에서 데이터를 효과적으로 관리하는 방법을 확실히 이해하게 될 것입니다.

이 과정은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습 (Guided Lab) 입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 통계 데이터에 따르면 이 실습은 초급 수준이며 97%의 완료율을 기록하고 있습니다. 또한 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

Docker 스토리지 옵션 이해하기

Docker 볼륨을 본격적으로 다루기 전에, Docker 에서 사용할 수 있는 다양한 스토리지 옵션을 이해하는 것이 중요합니다. Docker 는 데이터를 저장하기 위한 세 가지 주요 옵션을 제공합니다.

  1. 볼륨 (Volumes): Docker 에서 데이터를 영구적으로 보존하기 위해 가장 권장되는 방식입니다.
  2. 바인드 마운트 (Bind mounts): 호스트 머신의 특정 경로를 컨테이너에 직접 연결합니다.
  3. tmpfs 마운트 (tmpfs mounts): 데이터를 호스트 머신의 메모리에 임시로 저장합니다.

이 실습에서는 Docker 에서 데이터를 관리할 때 가장 유연하고 권장되는 옵션인 볼륨에 주로 집중할 것입니다.

먼저 현재 시스템에 있는 볼륨 목록을 확인해 보겠습니다.

docker volume ls

다음과 유사한 출력이 표시됩니다.

DRIVER    VOLUME NAME
local     jenkins-data

이 명령은 시스템의 모든 Docker 볼륨을 나열합니다. 출력 결과에는 볼륨 드라이버 (보통 "local") 와 볼륨 이름이 표시됩니다. 기존에 생성된 볼륨이 보일 수도 있고, 아직 볼륨을 생성한 적이 없다면 목록이 비어 있을 수도 있습니다.

다른 볼륨 이름이 보이거나 볼륨이 전혀 없더라도 걱정하지 마세요. 이는 정상이며 이전에 시스템에서 Docker 로 어떤 작업을 했는지에 따라 달라집니다.

이름이 지정된 볼륨 생성 및 관리

이제 이름이 지정된 새로운 볼륨 (Named Volume) 을 생성해 보겠습니다. 이름이 지정된 볼륨은 사용자가 명시적으로 생성하고 특정 이름을 부여한 볼륨입니다. 이렇게 하면 나중에 참조하고 관리하기가 훨씬 쉬워집니다.

다음 명령을 실행하여 새 볼륨을 생성합니다.

docker volume create my_data

이 명령은 my_data라는 이름의 새 볼륨을 생성합니다. Docker 는 이 볼륨이 호스트 시스템의 어디에 어떻게 저장되는지에 대한 모든 세부 사항을 자동으로 처리합니다.

볼륨이 성공적으로 생성되었는지 확인해 봅시다.

docker volume ls

이제 볼륨 목록에서 기존 볼륨들과 함께 my_data를 확인할 수 있습니다.

볼륨에 대한 더 자세한 정보를 얻으려면 조사 (inspect) 명령을 사용할 수 있습니다.

docker volume inspect my_data

그러면 다음과 같은 내용이 출력됩니다.

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

이 출력은 볼륨에 대한 여러 정보를 알려줍니다.

  • 생성된 시간
  • 사용 중인 드라이버 (이 경우 local)
  • 마운트 포인트 (호스트 시스템에서 데이터가 실제로 저장되는 위치)
  • 부여한 이름

지금 당장 이 모든 세부 사항을 이해하지 못해도 괜찮습니다. 우리에게 가장 중요한 부분은 이름 (Name) 과 마운트 포인트 (Mountpoint) 입니다.

컨테이너에서 볼륨 사용하기

이제 볼륨이 준비되었으니 컨테이너와 함께 사용해 보겠습니다. 새 컨테이너를 시작하고 방금 만든 볼륨을 마운트하겠습니다.

다음 명령을 실행하세요.

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

이 명령의 구성을 살펴보겠습니다.

  • docker run: Docker 에게 새 컨테이너를 실행하도록 지시합니다.
  • -d: 컨테이너를 백그라운드 (데몬 모드) 에서 실행합니다.
  • --name my_container: 컨테이너에 이름을 부여하여 나중에 쉽게 참조할 수 있게 합니다.
  • -v my_data:/app/data: my_data 볼륨을 컨테이너 내부의 /app/data 디렉토리에 마운트합니다.
  • ubuntu:latest: 컨테이너에 사용할 이미지입니다.
  • sleep infinity: 컨테이너가 실행할 명령입니다. 컨테이너가 종료되지 않고 계속 실행 상태를 유지하게 합니다.

이제 볼륨이 마운트된 상태로 컨테이너가 실행 중입니다. 볼륨 안에 데이터를 생성해 보겠습니다.

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

이 명령은 다음과 같은 작업을 수행합니다.

  • docker exec: 실행 중인 컨테이너에서 명령을 실행합니다.
  • my_container: 대상 컨테이너의 이름입니다.
  • sh -c "...": 컨테이너 내부에서 셸 명령을 실행합니다.
  • 실제 명령은 볼륨 내에 "Hello from Docker volume"이라는 내용이 담긴 test.txt 파일을 생성합니다.

데이터가 제대로 기록되었는지 확인하기 위해 파일을 읽어보겠습니다.

docker exec my_container cat /app/data/test.txt

콘솔에 "Hello from Docker volume" 메시지가 출력되는 것을 확인할 수 있습니다.

컨테이너 간 데이터 공유

Docker 볼륨의 큰 장점 중 하나는 컨테이너 간에 데이터를 공유할 수 있다는 점입니다. 동일한 볼륨을 사용하는 또 다른 컨테이너를 만들어 보겠습니다.

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

이 명령은 이전과 매우 유사하지만, 컨테이너 이름을 다르게 지정하고 볼륨을 컨테이너 내부의 다른 경로에 마운트했습니다.

이제 이 새 컨테이너가 이전에 생성한 데이터에 접근할 수 있는지 확인해 봅시다.

docker exec another_container cat /app/shared_data/test.txt

앞서 작성했던 것과 동일한 "Hello from Docker volume" 메시지가 표시될 것입니다. 이는 두 컨테이너가 동일한 데이터를 공유하고 있음을 보여줍니다.

이 새 컨테이너에서 데이터를 더 추가해 보겠습니다.

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

이 명령은 test.txt 파일에 새로운 줄을 추가합니다.

이제 어느 컨테이너에서든 파일 내용을 확인하면 두 줄의 텍스트가 모두 보여야 합니다.

docker exec my_container cat /app/data/test.txt

출력 결과에 "Hello from Docker volume"과 "Data from another container"가 모두 표시되는 것을 확인할 수 있습니다.

이것은 Docker 볼륨이 컨테이너 간에 데이터를 공유하는 데 어떻게 사용될 수 있는지를 잘 보여주며, 이는 많은 애플리케이션에서 매우 유용하게 활용됩니다.

볼륨 백업 및 복구

Docker 볼륨을 백업하고 복구하는 것은 데이터 보존을 위해 매우 중요합니다. 그 과정을 단계별로 진행해 보겠습니다.

먼저, 볼륨을 사용 중인 컨테이너들을 중지하고 제거해야 합니다. 볼륨이 사용 중일 때는 볼륨을 제거하거나 안전하게 관리하기 어렵기 때문입니다.

docker stop my_container another_container
docker rm my_container another_container

이제 볼륨의 백업본을 생성해 보겠습니다.

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source .

이 명령이 다소 복잡해 보일 수 있으니 분석해 보겠습니다.

  • docker run --rm: 임시 컨테이너를 실행하고 작업이 끝나면 자동으로 제거합니다.
  • -v my_data:/source:ro: 백업할 볼륨을 읽기 전용 (ro) 으로 컨테이너에 마운트합니다.
  • -v $(pwd):/backup: 현재 디렉토리를 컨테이너의 /backup 경로로 마운트합니다.
  • ubuntu: Ubuntu 이미지를 사용합니다.
  • tar cvf /backup/my_data_backup.tar -C /source .: 볼륨 데이터를 tar 아카이브 파일로 생성합니다.

이제 원본 볼륨을 삭제해 보겠습니다.

docker volume rm my_data

데이터를 복구하기 위해 새 볼륨을 생성하고 백업 파일을 그 안에 압축 해제하겠습니다.

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

이렇게 하면 새 볼륨이 생성되고 백업 데이터가 그 안에 복원됩니다.

데이터가 제대로 복구되었는지 확인해 봅시다.

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

이전에 생성했던 파일의 내용이 그대로 출력되는 것을 확인할 수 있습니다.

요약

이 실습에서는 Docker 볼륨을 다루는 방법을 배웠습니다. 이름이 지정된 볼륨을 생성 및 관리하고, 컨테이너에서 볼륨을 사용하며, 컨테이너 간에 데이터를 공유하고, 백업 및 복구 작업을 수행해 보았습니다. 이러한 기술은 Docker 환경에서 효과적인 데이터 관리를 위해 필수적입니다.

주요 학습 내용:

  • Docker 볼륨은 컨테이너의 영구 데이터를 관리하는 유연하고 효율적인 방법을 제공합니다.
  • Docker CLI 명령을 사용하여 볼륨을 쉽게 생성, 조사 및 제거할 수 있습니다.
  • 볼륨 내의 데이터는 여러 컨테이너 간에 공유될 수 있습니다.
  • 볼륨 백업 및 복구는 데이터 보존을 위해 매우 중요하며, 표준 Linux 명령을 사용하여 수행할 수 있습니다.

앞으로 Docker 를 계속 사용하면서 데이터 영속성과 관리를 컨테이너화된 애플리케이션의 핵심 요소로 고려하시기 바랍니다. 특히 운영 환경에서는 항상 데이터 백업 및 복구 계획을 세워야 합니다.