상세 컨텐츠

본문 제목

[Docker] 데이터 저장 및 관리 방법 / bind or volume 마운트

Devops 도전기/Docker

by 끝까지해봐야지 2024. 5. 24. 11:17

본문

Docker는 애플리케이션의 배포와 관리를 간소화하기 위해 컨테이너화된 환경을 제공합니다. 컨테이너는 파일 시스템 레이어로 구성되며, 읽기 전용 이미지 레이어와 쓰기 가능한 컨테이너 레이어로 나뉩니다. 아래의 그림은 Docker의 레이어 구조를 시각적으로 나타냅니다.

컨테이너 레이어는 컨테이너가 실행 중일 때만 존재하며, 컨테이너가 종료되면 삭제됩니다. 따라서 컨테이너의 수명과 상관없이 데이터를 저장하려면 Docker Volume을 사용해야 합니다. 이 글에서는 Docker에서 데이터를 저장하고 관리하는 방법에 대해 설명합니다.

Volume

볼륨(volume)은 Docker가 직접 관리하는 컨테이너의 디렉터리입니다. 볼륨은 데이터를 저장하는 데 사용되며, 컨테이너가 삭제되어도 볼륨에 저장된 데이터는 유지됩니다. 볼륨은 호스트 파일 시스템과 독립적으로 존재하므로, 여러 컨테이너 간에 데이터를 공유하거나 데이터를 영구적으로 저장하는 데 이상적입니다.

볼륨을 생성하고 확인하는 명령어는 다음과 같습니다:

$ docker volume create my-volume
my-volume
$ docker volume list
DRIVER    VOLUME NAME
local     2b3abf504803ecce7b89619f1107766441a819059cb22f09376191988ed99dbd
local     my-volume

Driver

Docker 스토리지 드라이버는 컨테이너의 데이터를 관리하는 방법을 결정합니다. 각 스토리지 드라이버는 이미지 레이어를 구현하고, 컨테이너의 실행 중인 상태를 관리하며, 데이터를 저장하고, 네트워크와 상호 작용하는 방법을 제어합니다. 사용 중인 스토리지 드라이버를 확인하는 명령어는 다음과 같습니다:

$ docker info | grep Storage
Storage Driver: overlay2

Mount

마운트(mount)는 호스트 시스템의 특정 디렉터리를 컨테이너의 디렉터리에 연결하는 방법입니다. 이를 통해 컨테이너가 호스트 시스템의 파일이나 디렉터리에 액세스하거나 수정할 수 있습니다. 마운트는 크게 두 가지 유형으로 나뉩니다: **바인드 마운트(bind mount)**와 **볼륨(volume)**입니다.

바인드 마운트 (Bind Mount)

바인드 마운트는 호스트 파일 시스템의 특정 경로를 컨테이너 내부의 경로에 연결하는 방식입니다. 바인드 마운트를 사용하면 호스트와 컨테이너 간의 파일이 실시간으로 동기화됩니다. 이는 개발 환경에서 소스 코드나 설정 파일을 공유하는 데 유용합니다.

장점

  • 직접 접근: 호스트 시스템의 디렉토리를 직접 참조하기 때문에 설정이 간단하고 빠릅니다.
  • 유연성: 호스트의 어떤 디렉토리든지 컨테이너에 마운트할 수 있습니다.

단점

  • 안전성: 컨테이너가 호스트 파일 시스템의 특정 디렉토리에 직접 접근하기 때문에 호스트의 파일이 손상될 위험이 있습니다.
  • 호환성 문제: 호스트 환경에 종속적이므로, 다른 호스트에서 동일한 설정을 보장하기 어렵습니다.

 

실습: 바인드 마운트

  1. 현재 디렉터리에서 target 폴더를 생성합니다.
    $ mkdir target

  2. 아래 명령어를 실행하여 컨테이너에 바인드 마운트를 설정합니다:
    $ docker run -d -it --name Demo --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest


  3. 컨테이너 내부에 접속하여 /app 디렉터리를 확인합니다:
    $ docker exec -it Demo /bin/bash -c "ls /app"
    * target 디렉토리에 아무것도 없어서 조회가 안되는 상태입니다


  4. /app 디렉터리에 파일을 생성하고 확인합니다:
    $ docker exec -it Demo /bin/bash -c "touch /app/TEST"
    $ ls target/
    TEST

 

볼륨 마운트 ( Volume Mount )

볼륨 마운트는 Docker가 관리하는 스토리지 위치를 사용하여 컨테이너 간에 데이터를 공유하거나 보존하는 방식입니다. Docker Volume은 Docker가 자체적으로 관리하는 독립된 스토리지로, 호스트 파일 시스템과는 별도로 작동합니다.

장점

  • 안전성: 호스트 파일 시스템과 독립적으로 작동하므로, 컨테이너에 의해 호스트 파일 시스템이 손상될 위험이 적습니다.
  • 백업 및 복원 용이성: Docker Volume은 쉽게 백업하고 복원할 수 있습니다.
  • 데이터 공유: 여러 컨테이너 간에 데이터를 쉽게 공유할 수 있습니다.

단점

  • 추가 관리 필요: Docker 명령을 통해 볼륨을 생성하고 관리해야 하므로, 설정이 약간 더 복잡할 수 있습니다.

실습: 볼륨 마운트

  1. 볼륨을 생성합니다:
    $ docker volume create my-volume
    *위에서 생성한 볼륨을 확인할수 있습니다


  2. 아래 명령어를 실행하여 컨테이너에 볼륨을 마운트합니다:
    $ docker run -d -it --name Demo1 --mount type=volume,source=my-volume,target=/app nginx:latest


  3. 컨테이너 내부에 접속하여 /app 디렉터리를 확인합니다:
    $ docker exec -it Demo1 /bin/bash -c "ls /app"
    *역시나 my-volume에 생성한 파일이 없어 조회가 안됩니다.


  4. /app 디렉터리에 파일을 생성하고 확인합니다:
    $ docker exec -it Demo /bin/bash -c "touch /app/TEST"
    $ docker run -itd --name Demo2 --mount type=volume,source=my-volume,target=/app busybox 
    $ docker exec -it Demo2 sh -c "ls /app/TEST"
    *새롭게 생성한 컨테이너에서도 사용가능한걸 볼수있습니다.

 

 

비교 요약

                                      
특성 Bind Mount Volume Mount
정의 호스트 디렉토리를 마운트 Docker가 관리하는 스토리지
설정 편의성 간단 약간 복잡
안전성 낮음 높음
호환성 낮음 높음
데이터 공유 어려움 쉬움
백업/복원 어려움 쉬움

관련글 더보기