[docker] docker 볼륨 - 도커 볼륨 (1)

업데이트:     Updated:

카테고리:

태그:

🎯Docker에서 데이터 관리

Docker에서는 컨테이너가 호스트의 파일 시스템에 파일을 저장하는 두 가지 마운트 유형과 호스트의 메모리에 파일을 저장하는 한 가지 마운트 유형을 제공합니다.

  • 도커 볼륨 (볼륨) - >Dokcer에서 관리하는 호스트 파일 시스템의 일부에 데이터 저장 (Linux의 경우 /var/lib/docker/volumes/)
  • 호스트 볼륨 (바인드 마운트) - 호스트 시스템의 아무 곳에나 저장
  • tmpfs - 호스트 시스템의 메모리에만 저장, 호스트 시스템의 파일 시스템에는 저장하지 않음

1. 볼륨

볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 유지하기 위해 선호되는 매커니즘입니다. 볼륨은 바인드 마운트에 비해 몇 가지 장점을 가지고 있습니다.

  • 볼륨은 바인드 마운트보다 백업 또는 마이그레이션이 더 쉽습니다.
  • Docker CLI 명령 또는 Docker API를 사용하여 볼륨을 관리할 수 있습니다.
  • 볼륨은 Linux 및 Windows 컨테이너 모두에서 작동합니다.
  • 여러 컨테이너 간에 볼륨을 보다 안전하게 공유할 수 있습니다.
  • 볼륨 드라이버를 사용하면 원격 호스트 또는 클라우드 제공자에 볼륨을 저장하거나 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있습니다.
  • 새 볼륨은 컨테이너에 의해 미리 채워진 콘텐츠를 가질 수 있습니다.

1.1 생성


볼륨은 컨테이너와 함께 생성하는 두 가지 방법을 제공합니다. -v 또는 --mount 플래그를 선택합니다.

  • -v 또는 --volume : 콜론(:) 문자로 구분된 세 개의 필드로 구성됩니다. 필드는 올바른 순서로 나열 되어 있어야 합니다.
    • 첫 번째 필드 : 볼륨의 이름이며 호스트 시스템에서 고유해야 합니다. (익명 볼륨의 경우 생략할 수 있습니다.)
    • 두 번째 필드 : 볼륨이 마운트될 컨테이너의 경로를 의미합니다.
    • 세 번째 필드 : 쉼표로 구분된 마운트 옵션 목록입니다. (optional)
  • --mount = : 쉼표로 구분된 여러 키-값 쌍으로 구성합니다. 키 순서는 중요하지 않습니다.
    • type : 마운트의 유형을 설명합니다. bind, volume, tmpfs 유형에서 선택가능하며, 볼륨의 경우 volume값을 가져야합니다.
    • source or src : 볼륨의 이름을 의미합니다 (익명 볼륨의 경우 생략할 수 있습니다.)
    • destination or dst or target : 볼륨이 마운트될 컨테이너의 경로를 의미합니다.
    • volume-opt : 옵션 이름과 해당 값으로 구성된 키-값 쌍을 사용합니다.
# --mount
docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

# -v
docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

1.2 컨테이너와 함께 볼륨 생성


아직 존재하지 않는 볼륨으로 컨테이너를 시작하면 Docker가 자동으로 볼륨을 생성합니다. 위 예제에서는 -v--mount 플래그를 사용하여 볼륨 myvol2을 /app/ 컨테이너에 마운트하는 동일한 결과를 얻을 수 있습니다.

1.3 검사


docker inspect devtext 명령은 볼륨이 올바르게 생성되고 탑재되었는지 확인하는 데 사용합니다. Mounts 섹션을 찾아보면 마운트 유형은 volume 이고 올바른 소스와 대상이 표시되며 마운트가 읽기-쓰기 가능함을 알 수있습니다.

"Mounts": [
    {
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

1.4 제거


컨테이너를 중지하고 볼륨을 제거합니다. 볼륨 제거는 별도의 단계입니다.

docker container stop devtest
docker container rm devtest
docker volume rm myvol2

1.5 볼륨 단독으로 관리


바인드 마운트와 달리 볼륨은 컨테이너와 함께 생성하지 않고 컨테이너와는 독자적으로 볼륨을 생성하고 관리할 수 있습니다.

# 볼륨 만들기:
docker volume create my-vol

# 볼륨 리스팅:
docker volume ls

# 볼륨 검사:
docker volume inspect my-vol

# 볼륨 제거:
docker volume rm my-vol

1.6 컨테이너 데이터를 볼륨에 복제


컨테이너를 볼륨과 함께 생성할 때 마운트하려는 컨테이너의 파일시스템에 파일이나 디렉터리가 이미 존재하는 경우 해당 파일과 디렉터리는 볼륨에 복사됩니다.

# --mount
docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest

# -v
docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

위 명령의 결과 새롭게 생성된 nginx-vol 볼륨에는 nginx 컨테이너의 /usr/share/nginx/html 디렉터리 내 파일 및 디렉터리가 복사됩니다.

1.7 읽기 전용 볼륨


컨테이너에서 데이터에 대한 읽기 액세스만 필요한 경우 마운트 옵션에 ro 목록을 추가하여 디렉토리를 읽기 전용 볼륨으로 마운트할 수 있습니다.

# --mount
docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

# -v
docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

1.8 볼륨 백업, 복원, 마이그레이션


볼륨은 백업, 복원 및 마이그레이션에 유용합니다. --volumes-from 플래그를 사용하여 해당 볼륨을 탑재하는 새 컨테이너를 만듭니다.

1.8.1 백업

  1. 다음과 같은 새 컨테이너를 만듭니다.
      docker run -v /dbdata --name dbstore ubuntu /bin/bash
    
  2. dbstore 컨테이너의 /dbdata 디렉터리를 마운트하는 새 컨테이너를 생성합니다. 이때 새 컨테이너는 호스트의 현재 디렉터리를 /backup 디렉터리에 마운트하고 /dbstore 컨테이너를 통해 마운트한 /dbdata 디렉터리의 내용을 /backup/backup.tar 파일로 묶는 명령이 포함됩니다.
      docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
    
  3. 명령이 완료되고 컨테이너가 중지되면 dbdata 볼륨의 백업이 생성됩니다.

1.8.2 복원

방금 생성한 백업을 동일한 컨테이너 또는 다른 곳에서 생성한 다른 컨테이너에 복원할 수 있습니다.

  1. 이름이 dbstore2인 새 컨테이너를 만듭니다.
      docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
    
  2. 새 컨테이너의 데이터 볼륨에서 백업 파일의 압축을 풉니다.
      docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
    

1.9 볼륨 제거


Docker 데이터 볼륨은 컨테이너를 삭제한 후에도 유지됩니다. 고려해야 할 두 가지 유형의 볼륨이 있습니다.

  • 익명 볼륨
  • 이름이 있는 볼륨

1.9.1 익명 볼륨 자동 제거

익명 볼륨을 자동으로 제거하려면 --rm 옵션을 사용합니다. 예를 들어 아래의 명령은 익명 /foo 볼륨을 생성합니다. 컨테이너를 제거하면 Docker 엔진이 /foo 볼륨을 제거하지만 awesome 볼륨은 제거하지 않습니다.

docker run --rm -v /foo -v awesome:/bar busybox top

1.9.2 모든 볼륨 제거

사용하지 않는 모든 볼륨을 제거하고 공간을 확보하려면 다음의 명령을 사용합니다.

docker volume prune

📌출처

Docker Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

docker 카테고리 내 다른 글 보러가기

댓글남기기