본문으로 건너뛰기

볼륨

볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 지속적으로 보존하는 선호되는 메커니즘입니다. 바인드 마운트는 호스트 기계의 디렉토리 구조와 OS에 의존하는 반면, 볼륨은 Docker에 의해 완전히 관리됩니다. 볼륨은 바인드 마운트보다 여러 가지 이점이 있습니다:

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

또한, 볼륨은 컨테이너의 쓰기 가능한 레이어에 데이터를 지속하는 것보다 종종 더 나은 선택입니다. 볼륨은 그것을 사용하는 컨테이너의 크기를 증가시키지 않으며, 볼륨의 내용은 주어진 컨테이너의 라이프사이클 밖에 존재하기 때문입니다.

참고: 데이터 볼륨의 사용은 Linux에서 디렉토리나 파일을 마운트하는 것과 유사합니다. 이미지에서 마운트 포인트로 지정된 디렉토리의 파일들은 데이터 볼륨으로 복사됩니다(데이터 볼륨이 비어 있을 경우에만).

데이터 볼륨 생성

$ docker volume create my-vol

모든 데이터 볼륨 보기

$ docker volume ls

DRIVER VOLUME NAME
local my-vol

호스트에서 다음 명령을 사용하여 특정 데이터 볼륨에 대한 정보를 조회

$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]

마운트된 데이터 볼륨을 가진 컨테이너 시작

docker run 명령을 사용할 때, --mount 플래그를 사용하여 데이터 볼륨을 컨테이너에 마운트합니다. 단일 docker run에서 여러 데이터 볼륨을 마운트할 수 있습니다.

/usr/share/nginx/html 디렉토리에 데이터 볼륨을 로드하는 web 이라는 이름의 컨테이너를 생성합니다.

$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine

볼륨에 대한 구체적인 정보 조회

호스트에서 다음 명령을 사용하여 web 컨테이너에 대한 정보를 조회

$ docker inspect web

데이터 볼륨 정보는 "Mounts" 키 아래에 있습니다

"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

볼륨 제거

$ docker volume rm my-vol

볼륨은 컨테이너의 라이프사이클과 독립적으로 데이터를 지속하기 위해 설계되었습니다. Docker는 컨테이너를 제거할 때 자동으로 데이터 볼륨을 제거하지 않으며, 더 이상 어떤 컨테이너에도 참조되지 않는 데이터 볼륨에 대한 가비지 컬렉션 메커니즘을 가지고 있지 않습니다. 컨테이너와 함께 볼륨을 제거하고 싶다면, 컨테이너를 제거할 때 docker rm -v 명령을 사용합니다.

사용되지 않는 모든 볼륨을 제거하고 공간을 확보하려면:

$ docker volume prune

볼륨에 좋은 사용 사례

볼륨은 Docker 컨테이너 및 서비스에서 데이터를 지속하는 선호되는 방법입니다. 볼륨에 대한 몇 가지 사용 사례는 다음과 같습니다:

  • 여러 실행 중인 컨테이너 간에 데이터를 공유합니다. 명시적으로 생성하지 않는 경우, 볼륨은 처음으로 컨테이너에 마운트될 때 생성됩니다. 해당 컨테이너가 정지되거나 제거될 때, 볼륨은 여전히 존재합니다. 여러 컨테이너가 동시에 같은 볼륨을 마운트할 수 있습니다. 읽기-쓰기 가능하거나 읽기 전용일 수 있습니다. 볼륨은 명시적으로 제거할 때만 제거됩니다.

  • Docker 호스트가 주어진 디렉토리 또는 파일 구조를 가지고 있을 것이 보장되지 않을 때. 볼륨은 Docker 호스트의 구성을 컨테이너 런타임에서 분리하는 데 도움이 됩니다.

  • 로컬이 아닌 원격 호스트나 클라우드 제공업체에 컨테이너의 데이터를 저장하고 싶을 때.

  • 한 Docker 호스트에서 다른 Docker 호스트로 데이터를 백업, 복원 또는 마이그레이션할 필요가 있을 때, 볼륨이 더 나은 선택입니다. 볼륨을 사용하는 컨테이너를 정지한 다음, 볼륨의 디렉토리를 백업할 수 있습니다 (예: /var/lib/docker/volumes/<volume-name>).

  • Docker Desktop에서 애플리케이션이 고성능 I/O를 필요로 할 때. 볼륨은 호스트가 아닌 Linux VM에 저장되므로, 읽기 및 쓰기 작업의 지연 시간이 크게 줄어들고 처리량이 높아집니다.

  • 애플리케이션이 Docker Desktop에서 완전히 네이티브 파일 시스템 동작을 필요로 할 때. 예를 들어, 데이터베이스 엔진은 트랜잭션 내구성을 보장하기 위해 디스크 플러싱을 정밀하게 제어할 필요가 있습니다. 볼륨은 Linux VM에 저장되어 이러한 보장을 할 수 있지만, 바인드 마운트는 macOS 또는 Windows로 리모트되며, 파일 시스템이 약간 다르게 동작합니다.

참조

볼륨에 좋은 사용 사례