Docker 볼륨에 Docker 컨테이너 데이터를 저장하는 방법


이 페이지에서

  1. 전제 조건
  2. 익명의 Docker 볼륨 검색
  3. 도커 볼륨 만들기
  4. 사용하지 않는 볼륨 제거\n
  5. 결론

데이터로 컨테이너를 자동화하는 한 가지 옵션은 데이터를 컨테이너 이미지 내에 저장하는 것입니다. 그러나 이렇게 하려면 실행하는 각 컨테이너에 데이터 복사본이 있어야 하므로 컨테이너가 확장되면 리소스가 낭비될 수 있습니다. 더 나은 옵션은 하나의 데이터 사본을 Docker 볼륨에 저장한 다음 해당 볼륨을 컨테이너 간에 공유하는 것입니다.

Docker 볼륨은 컨테이너 파일 시스템 외부에 있지만 동일한 호스트에서 실행 중인 컨테이너에서 여전히 액세스할 수 있는 폴더로 생각할 수 있습니다. 새 컨테이너를 만들 때 기존 볼륨을 탑재하거나 새 볼륨을 만들 수 있습니다. 새 볼륨을 생성하면 Docker는 기본 호스트 파일 시스템에 새 스토리지 계층을 자동으로 생성하고 지정한 데이터로 초기화합니다.

볼륨을 생성하면 이를 사용하여 정적 파일, 애플리케이션 데이터 또는 로그를 비롯한 모든 유형의 데이터를 저장할 수 있습니다. 볼륨을 사용하여 컨테이너 간에 데이터를 공유할 수도 있습니다.

예를 들어 하나의 컨테이너에서 실행되는 웹 애플리케이션이 있는 경우 배포의 다른 컨테이너가 액세스할 수 있도록 볼륨을 사용하여 애플리케이션 소스 코드를 저장할 수 있습니다. 이를 통해 애플리케이션 소스 코드를 런타임 환경과 별도로 유지할 수 있으므로 애플리케이션 업데이트 및 재배포가 더 쉬워집니다.

컨테이너 간에 데이터를 공유하는 것 외에도 볼륨을 사용하여 컨테이너를 중지하고 시작할 때 데이터를 유지할 수 있습니다. 이는 컨테이너가 실수로 삭제되거나 중지된 경우에도 데이터를 안전하게 유지하는 좋은 방법입니다.

이 가이드에서는 Docker 볼륨이 컨테이너와 상호 작용하는 방법을 배웁니다. 새 컨테이너를 만들고 볼륨을 사용하여 컨테이너 간에 데이터를 저장하고 공유하면 됩니다. 그런 다음 컨테이너에 의해 자동으로 생성되는 익명 볼륨에 의해 남겨진 공간을 정리하는 방법을 알아봅니다. 마지막으로 Docker 볼륨 데이터를 백업하는 방법을 배웁니다.

시작하자!

전제 조건

  • 이 가이드를 따르려면 Docker 컨테이너 작업의 기본 사항을 잘 알고 있어야 합니다.\n
  • 이 가이드는 Linux 호스트를 사용하고 있다고 가정합니다. 이 가이드는 CentOS를 사용하지만 동일한 단계가 다른 Linux 배포판에서도 작동합니다.\n
  • 호스트에 Docker가 설치되어 실행 중이어야 합니다. 아직 설치하지 않은 경우 설치 가이드의 지침을 따르십시오.\n
  • 루트 권한이 있는 사용자 계정\n
  • Linux 호스트에 Docker가 설치되어 있습니다.\n

익명 Docker 볼륨 검색

새 Docker 컨테이너를 생성하면 기본적으로 호스트 파일 시스템에 새 익명 볼륨이 생성됩니다. 이 볼륨은 컨테이너에 필요한 데이터를 저장하는 데 사용됩니다.

1. 다음 명령을 실행하여 도커가 실행 중이고 활성화되어 있는지 확인합니다.

sudo systemctl status docker

2. sudo를 사용하지 않고 docker 명령을 실행할 수 있도록 다음 명령을 실행하여 사용자 계정을 docker 그룹에 추가합니다. 사용자 계정을 docker 그룹에 추가한 후 로그아웃했다가 다시 로그인하면 변경 사항이 적용됩니다.

sudo usermod -aG docker $(whoami)

3. 다음 명령어를 실행하여 Docker 레지스트리에서 호스트로 일부 이미지를 가져옵니다. 이러한 이미지를 사용하여 Docker 볼륨 생성 및 작업을 연습합니다.

docker pull postgres:12.1
docker pull bash 
docker pull httpd:2.4

4. 다음 명령어를 실행하여 현재 호스트에 있는 이미지를 나열하여 이미지를 가져왔는지 확인합니다.

docker images

5. 다음 명령어를 실행하여 호스트에 활성 볼륨이 있는지 확인합니다. 다음과 유사한 출력이 표시되어야 합니다.

docker volume ls

빈 출력이 표시되어야 합니다.

6. 다음 명령을 실행하여 새 컨테이너를 생성하고 호스트에 새 익명 볼륨이 생성되었는지 확인합니다. 터미널에서 계속 작업할 수 있도록 분리 모드에서 컨테이너를 실행하려면 -d 플래그를 사용합니다. --name 플래그를 사용하여 쉽게 식별할 수 있도록 컨테이너에 이름을 지정합니다. Postgres는 데이터를 저장하기 위해 백그라운드 볼륨이 필요하므로 여기서는 postgres:12.1 이미지를 사용합니다. 적절한 측정과 더 많은 정보를 보려면 각각의 Postgres 데이터베이스에 대해 하나씩 두 개의 컨테이너를 실행해야 합니다.

docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1

7. 아래 docker 명령을 실행하여 호스트에서 현재 실행 중인 컨테이너를 나열합니다.

docker ps

이제 아래와 같이 db1과 db2라는 두 개의 컨테이너가 생성되었습니다.

8. 이제 호스트에 생성된 볼륨을 나열합니다.

docker volume ls

다음과 유사한 출력이 표시됩니다. Postgres가 시작되면 데이터를 저장할 장소가 필요합니다. Postgres는 데이터 손실을 원하지 않으므로 Postgres는 자동으로 익명 볼륨을 생성합니다. 볼륨 이름은 임의의 16진수 문자열이 추가되어 지정됩니다(e9f338... 및 ee3423...).

docker inspect 명령을 사용하여 볼륨을 자세히 살펴보겠습니다.

9. 아래 명령을 실행하여 db1 컨테이너에 대한 자세한 정보를 사람이 읽을 수 있는 형식으로 가져옵니다.

docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

아래에서 볼 수 있듯이 e9f338 이름 줄은 위의 docker volume ls 명령 출력과 일치합니다. 이 줄은 이 볼륨이 db1 컨테이너와 연결되고 마운트되었음을 알려줍니다.

10. 동일한 작업을 수행하여 db2 컨테이너를 검사합니다.

docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

다른 볼륨 이름을 제외하고 출력이 db1 컨테이너와 정확히 동일한 것을 볼 수 있습니다. 이 출력은 Docker가 생성된 각 컨테이너에 대해 새로운 익명 볼륨을 생성함을 확인합니다.

11. 컨테이너를 하나 더 실행합니다. 그러나 이번에는 --rm 플래그를 사용하여 볼륨에 어떤 일이 발생하는지 살펴보겠습니다. 이 컨테이너의 이름을 dbTmp로 지정했습니다. 알아 보자!

docker run -d --rm --name dbTmp postgres:12.1

이제 db1, db2 및 dbTmp의 세 가지 컨테이너가 준비되어 실행 중입니다.

docker ps

12. 볼륨을 다시 나열하십시오.

docker volume ls

dbTmp 컨테이너에 대해 세 번째 볼륨이 생성되었음을 알 수 있습니다.

13. 이제 아래 명령을 사용하여 dbTmp 컨테이너와 함께 db2를 중지합니다.

13. 컨테이너와 볼륨을 다시 나열합니다.

docker volume ls

아래와 같이 실행 중인 유일한 컨테이너는 db1 컨테이너입니다. 그러나 이제 dbTemp 컨테이너의 볼륨은 사라졌지만 db2 컨테이너(ee3423...)의 볼륨은 여전히 남아 있습니다.

이 동작이 예상됩니다. --rm 플래그는 연결된 볼륨과 함께 컨테이너가 중지된 후 컨테이너를 삭제합니다. dbTemp 컨테이너를 중지했기 때문에 dbTmp 컨테이너의 볼륨이 사라졌습니다. db2 컨테이너를 생성할 때 --rm 플래그를 지정하지 않았기 때문에 db2 컨테이너와 관련 볼륨은 컨테이너를 중지하더라도 호스트에 남아 있습니다. 이 예에서 알 수 있는 점은 --rm 플래그에 주의해야 한다는 것입니다. 연결된 볼륨이 있는 컨테이너를 중지하면 해당 볼륨이 삭제됩니다.

도커 볼륨 생성

Docker 볼륨은 docker volume create 명령을 사용하여 생성하는 명명된 스토리지 컨테이너입니다. 그런 다음 볼륨을 사용하여 데이터를 저장하거나 컨테이너 간에 데이터를 공유합니다.

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

docker volume create website

2. 볼륨을 나열하면 방금 만든 새 볼륨을 볼 수 있습니다.

docker volume ls

3. 이 웹사이트 코드를 GitHub에서 현재 작업 디렉터리로 다운로드합니다.

4. 아래 명령을 실행하여 방금 다운로드한 웹사이트 코드를 웹사이트 볼륨에 복사합니다.

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/

5. 아래 명령을 실행하여 웹 사이트 볼륨의 파일을 나열합니다.

sudo ls -l /var/lib/docker/volumes/website/_data/ 

이제 웹사이트 코드가 웹사이트 볼륨에 저장되어 있는 것을 볼 수 있습니다.

6. 이제 새 컨테이너를 시작하고 여기에 웹 사이트 볼륨을 연결할 수 있습니다. -v(볼륨) 플래그를 사용하여 볼륨을 마운트합니다. -p(포트 매핑) 플래그를 사용하여 호스트의 포트를 컨테이너의 포트에 매핑합니다. 이 예에서는 호스트의 포트 80을 컨테이너의 포트 80에 매핑합니다. Web1은 컨테이너의 이름입니다.

docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4

7. 이제 web1 컨테이너에서 웹 사이트가 제공됩니다. docker ps 명령을 실행하여 web1 컨테이너의 상태를 확인합니다. 웹 사이트가 web1 컨테이너에서 제공되는 것을 볼 수 있습니다. 아래와 같이 웹사이트가 서비스되고 있는 포트(80)도 볼 수 있습니다.

8. 웹 브라우저에서 호스트 시스템의 IP 주소를 열어 방금 복사한 웹사이트를 볼 수 있습니다.

9. 이제 이번에는 --rm 플래그와 함께 webTmp라는 컨테이너를 하나 더 실행하여 webTmp 컨테이너를 중지할 때 웹 사이트 볼륨에 어떤 일이 발생하는지 확인합니다.

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4

10. docker ps 명령 show를 실행하여 webTmp 컨테이너가 실행 중인지 확인합니다.

docker ps 

11. 이제 webTmp 컨테이너를 중지하고 볼륨을 나열합니다.

docker stop webTmp

이 문서의 시작 부분에서 기억하듯이 컨테이너를 중지하면 연결된 볼륨도 삭제됩니다. 하지만 이번에는 아래와 같이 웹 사이트 볼륨이 여전히 존재하는 것을 볼 수 있습니다. 무슨 일이 있었나요?

이 예에서 중요한 점은 컨테이너를 중지할 때 해당 컨테이너와 연결된 볼륨의 데이터가 다른 컨테이너에서 사용되고 있는 한 삭제되지 않는다는 것입니다. 이 경우 web1 컨테이너에서 웹 사이트 볼륨을 계속 사용하고 있습니다. 이는 Docker 볼륨으로 작업할 때 기억해야 할 매우 중요한 사항입니다.

사용하지 않는 볼륨 제거하기

볼륨은 데이터를 저장하고 체계적으로 유지하는 좋은 방법이지만 사용하지 않을 경우 많은 디스크 공간을 차지할 수도 있습니다. 볼륨을 사용하지 않는 경우 시스템에서 볼륨을 제거하여 디스크 공간을 확보하는 것이 가장 좋습니다. 다행스럽게도 Docker는 시스템에서 사용하지 않는 볼륨을 제거하는 데 필요한 모든 도구를 제공합니다.

1. docker volume prune 명령을 실행하여 매달린 리소스(이미지, 네트워크, 볼륨 및 컨테이너)를 제거합니다. 매달린 리소스는 현재 컨테이너에 연결되지 않은 Docker 객체입니다. 그러나 볼륨을 제거하기 전에 해당 볼륨을 사용 중인 컨테이너가 없는지 확인하십시오. 예를 들어, 연관된 미사용 볼륨을 제거하려면 먼저 db2 컨테이너를 제거해야 합니다.

docker stop db2
docker rm db2
docker volume prune

2. 볼륨을 나열하면 이제 db2 볼륨이 사라진 것을 볼 수 있습니다.

docker volume ls

3. 백업할 수 있도록 아래를 실행하여 웹 사이트의 볼륨 데이터 위치를 찾습니다.

docker volume inspect website

웹 사이트의 마운트 지점이 표시됩니다. 탑재 지점은 도커 볼륨이 탑재된 호스트 운영 체제의 디렉터리입니다. 이 예에서 마운트 지점은 아래와 같이 /var/lib/docker/volumes/website/_data입니다.

4. tar 명령을 사용하여 웹사이트 볼륨의 콘텐츠를 백업할 수 있습니다. 오랫동안 사용되어 왔으며 대부분의 플랫폼에서 지원됩니다. tar 명령은 모든 하위 디렉토리와 파일을 포함하여 디렉토리를 백업하는 데 사용할 수 있습니다.

참고: 루트 사용자로 이 명령어를 실행해야 합니다. 그렇지 않으면 아래와 같이 마운트된 도커 볼륨에 쓸 수 있는 권한이 없습니다.

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .

5. 아래 명령을 실행하여 tar 백업 파일이 성공적으로 생성되었는지 확인합니다.

ls -l /tmp/website_*.tgz

6. 아래 명령을 실행하여 백업 파일에 올바른 데이터가 포함되어 있는지 확인합니다. YOUR_BACKUP_FILE_NAME을 백업 파일의 실제 이름으로 바꿉니다.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. 이제 웹 사이트 볼륨을 사용하여 컨테이너를 하나 더 실행해 보겠습니다. 이번에는 -it 플래그를 사용하여 백업을 테스트하기 위해 컨테이너와 상호 작용할 것입니다.

docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .

8. 볼륨 디렉터리로 이동하고 모든 웹 사이트 데이터를 제거합니다.

9. 디렉토리의 내용을 나열하여 웹사이트 데이터가 사라졌는지 확인합니다.

ls -l

10. 아래 명령을 실행하여 웹사이트 데이터를 복원합니다. 을 백업 파일의 실제 이름으로 바꿉니다.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. 디렉토리의 내용을 나열하여 웹 사이트 데이터가 복원되었는지 확인하십시오.

ls -l

결론

이 가이드에서는 도커 볼륨을 만들고 백업하고 데이터를 복원하는 방법을 배웠습니다. 또한 도커 볼륨의 마운트 지점을 찾을 수 있는 위치도 배웠습니다.

Docker는 애플리케이션을 쉽게 배포할 수 있기 때문에 최근 많은 인기를 얻고 있습니다. 그러나 큰 힘에는 큰 책임이 따른다. 재해 발생 시 데이터 손실을 방지하려면 도커 볼륨을 백업하는 것이 중요합니다.

Docker에 대해 배울 것이 많습니다. Docker에 대해 더 자세히 살펴보고 싶다면 Docker를 시작하고 실행하는 데 필요한 모든 정보를 찾을 수 있는 설명서를 확인하는 것이 좋습니다.