볼륨과 바인드 마운트의 차이

정민교·2024년 5월 11일
0

Docker

목록 보기
10/10
post-thumbnail

📒목표

볼륨과 바인드 마운트의 차이와 사용법에 대해 알아보자

📒볼륨(Volumes)과 바인드 마운트(Bind Mounts)의 차이

✔️볼륨 마운트(Volumes)

Docker에 의해 관리되는 데이터 저장소입니다. 데이터의 영속성과 보안이 중요한 경우에 주로 사용됩니다.

바인드 마운트가 호스트 기계의 디렉토리 구조와 운영 체제에 의존하는 반면, 볼륨은 Docker에 의해 완전히 관리됩니다.(호스트 파일 시스템의 특정 부분을 참조하지 않고 독립적으로 존재합니다.)

Docker가 볼륨의 위치를 관리하며, 볼륨은 Docker CLI나 Docker API를 통해 쉽게 생성, 관리, 삭제할 수 있습니다.

볼륨은 컨테이너를 파괴하고 재생성해도 데이터가 유지되며, 여러 컨테이너 사이에서 더 안전하게 공유될 수 있습니다.

예시

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

컨테이너를 시작할 때 새 볼륨을 생성하고 해당 컨테이너가 마운트될 디렉터리(예: /app/)에 파일이나 디렉터리가 있으면 Docker는 그 디렉터리의 내용을 볼륨으로 복사합니다. 이후 컨테이너는 이 볼륨을 마운트하여 사용하며, 이 볼륨을 사용하는 다른 컨테이너도 사전에 채워진 내용에 접근할 수 있습니다.

예제에서는 Nginx 컨테이너를 시작하고, 컨테이너의 /usr/share/nginx/html 디렉터리의 내용을 새 볼륨 nginx-vol에 채워 넣습니다. 이 디렉터리는 Nginx가 기본 HTML 내용을 저장하는 위치입니다.

-v 플래그는 간단하고 짧은 명령어로, 널리 사용됩니다., --mount 플래그가 더 세밀한 설정을 가능하게 합니다.

📌Docker 볼륨 생성 및 사용

docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
  
#or

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

컨테이너를 볼륨과 함께 실행할 때, 볼륨이 존재하지 않으면 Docker가 자동으로 볼륨을 생성합니다.

예제는 볼륨 myvol2를 컨테이너의 /app/에 마운트합니다.

볼륨 확인

docker inspect <container-name>

볼륨 제거

컨테이너를 중지하고 삭제하는 것과, 볼륨의 제거는 별도로 수행해야 합니다. 볼륨을 컨테이너 삭제와 같이 수행하기 위해서 --volume 플래그를 사용합니다.

마운트 소스

명명된 볼륨의 경우, 이는 볼륨의 이름입니다.

익명 볼륨의 경우, 이 필드는 생략됩니다. source 또는 src로 지정할 수 있습니다

마운트 destination

destination은 컨테이너 내에서 파일 또는 디렉토리가 마운트되는 경로의 값을 취합니다. destination, dst, 또는 target으로 지정할 수 있습니다.

readonly

readonly 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. readonly 또는 ro로 지정할 수 있습니다.

volume-opt

volume-opt 옵션은 한 번 이상 지정할 수 있으며 옵션 이름과 그 값으로 구성된 키-값 쌍을 취합니다.

📌Docker Compose와 볼륨 사용

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:

이렇게 compose 파일을 작성하고 docker compose up을 처음 실행하면 볼륨이 생성됩니다. 이후에 명령어를 실행할 때 Docker는 동일한 볼륨을 재사용합니다.

Compose 외부에서 docker volume create를 사용하여 직접 볼륨을 생성한 후, compose.yaml 내에서 다음과 같이 참조할 수 있습니다

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true

external 키워드는 Docker Compose가 볼륨을 자체적으로 생성하지 않고, 대신 이미 존재하는 볼륨을 사용하도록 설정하는 데 사용됩니다.

✔️바인드 마운트(Bind Mounts)

호스트 시스템의 특정 파일 또는 디렉토리를 컨테이너에 직접 마운트하는 방식입니다. 호스트 시스템의 파일 시스템 경로를 명시적으로 참조합니다. 이때 호스트 머신에서의 파일이나 디렉터리는 절대 경로로 참조됩니다.

반면, 볼륨을 사용할 때는 호스트 머신의 Docker 저장 디렉터리 내에 새 디렉터리가 생성되고 Docker가 그 내용을 관리합니다.

개발 환경에서 소스 코드 같은 파일을 컨테이너에 실시간으로 연동하여 테스트할 때 사용하기 좋습니다.

호스트 시스템의 구체적인 위치에 접근해야 할 때 주로 사용됩니다.

📌바인드 마운트 플래그

-v 플래그는 모든 옵션을 하나의 필드에 결합하고, --mount 플래그는 옵션들을 분리하여 작성합니다.

--mount를 사용하면 모든 옵션을 명시적으로 파악하기 쉽기 때문에 --mount 사용을 권장합니다.

-v

-v 또는 --volume: 콜론(:)으로 구분된 세 개의 필드로 구성됩니다. 필드는 올바른 순서로 배치되어야 하며, 각 필드의 의미는 즉시 명확하지 않습니다.

type=mount

  • 첫 번째 필드는 호스트 머신의 파일 또는 디렉터리 경로입니다.

  • 두 번째 필드는 컨테이너 내에서 파일이나 디렉터리가 마운트되는 경로입니다.

  • 세 번째 필드는 선택 사항이며, ro, z, Z와 같은 옵션의 쉼표로 구분된 목록입니다. 이러한 옵션은 아래에서 논의됩니다.

--mount: 쉼표로 구분된 여러 키-값 쌍으로 구성되며, 각 쌍은 <키>=<값> 튜플로 구성됩니다. --mount 문법은 -v나 --volume보다 더 자세하지만, 키의 순서는 중요하지 않으며 플래그의 값이 이해하기 쉽습니다.

마운트 소스

바인드 마운트의 경우 이는 Docker 데몬 호스트의 파일 또는 디렉터리 경로입니다. source 또는 src로 지정할 수 있습니다.

마운트 destination

목적지는 컨테이너 내에서 파일이나 디렉터리가 마운트되는 경로의 값을 취합니다. destination, dst, 또는 target으로 지정될 수 있습니다.

readonly

readonly 옵션이 있으면 바인드 마운트를 컨테이너에 읽기 전용으로 마운트하게 합니다.

bind-propagation

bind-propagation 옵션이 있으면 바인드 전파를 변경합니다. rprivate, private, rshared, shared, rslave, slave 중 하나일 수 있습니다.

📌-v, --mount의 차이점

Docker 호스트에 아직 존재하지 않는 파일이나 디렉터리를 바인드 마운트하는 경우, -v를 사용하면 -v가 해당 끝점을 디렉터리로 자동 생성해줍니다.

반면, --mount를 사용하여 존재하지 않는 파일이나 디렉터리를 바인드 마운트하려고 하면 Docker는 자동으로 생성하지 않고 오류를 발생시킵니다.

📌바인드 마운트 생성 및 사용

docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

$(pwd) 서브 커맨드는 Linux나 macOS 호스트에서 현재 작업 디렉터리를 반환합니다. Windows에서는 경로 변환을 확인하세요.

📌 바인드 마운트 확인

docker inspect devtest

📒정리 및 참조

볼륨 마운트는 도커에 의해 관리되는 공간이며 여러 컨테이너가 볼륨 공간을 공유할 수 있습니다.

반면, 바인드 마운트는 호스트 시스템의 파일 혹은 디렉토리를 컨테이너에 직접 마운트하는 방식입니다.

둘 다 -v, --mount 플래그로 생성할 수 있지만 두 플래그의 문법이 다릅니다.

https://docs.docker.com/storage/volumes/
https://docs.docker.com/storage/bind-mounts/

profile
백엔드 개발자

0개의 댓글