마운트란 ‘연결하다’라는 의미 그대로 대상을 연결해 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다.

컨테이너는 그 특성상 폐기가 빈번하고(컨테이너의 생애 주기 참고), 폐기 시 내부 데이터도 함께 소멸하기 때문에 보존되어야 하는 데이터를 외부로 대피시켜야 한다는 번거로움이 있다.

이러한 문제를 해결하기 위해 도커는 컨테이너와 호스트의 스토리지에 마운트하는 기능을 제공한다.

보통 운영체제나 스택 같이 주기적으로 업데이트되는 부분은 컨테이너 형태로 만들어 변경 사항이 있을 때마다 최신 컨테이너로 갈아끼우고(컨테이너의 생애 주기 참고) 사용자 정보 같은 보존되어야 하는 데이터는 마운트된 공간에 보존한다.

이를 데이터 퍼시스턴시 data persistency라고 한다.

도커의 마운트는 볼륨 마운트바인드 마운트로 나뉜다.


볼륨 마운트

볼륨이란 스토리지의 한 영역을 분할한 것을 말한다.

도커에서는 docker volume 명령어로 볼륨을 만들 수 있으며, 이렇게 만들어진 볼륨은 도커 엔진이 관리하는 영역 내에 만들어지게 된다. 볼륨 마운트란 도커가 관리하는 볼륨에 마운트하는 방식이다.

이름만으로 관리가 가능하므로 다루기 쉽지만 볼륨에 비해 직접 조작하기 어려우므로 ‘임시 목적의 사용’이나 ‘자주 쓰지는 않지만 지우면 안되는 파일’을 두는 목적으로 많이 사용한다.

  • 장점

    1. 도커 엔지의 관리 하에 있으므로 사용자가 파일 위치를 신경 쓸 필요가 없다.
    2. 운영체제에 따른 의존성 문제가 일어나지 않는다.
  • 단점

    1. 도커 컨테이너를 경유하지 않고 직접 볼륨에 접근할 방법이 없다.
    2. 백업을 하기 위해 복잡한 절차가 필요하다.

사용법

어느 마운트 방식을 사용하든 스토리지 마운트는 run 커맨드의 옵션 형태로 지정한다. 마운트하려는 스토리지의 경로가 컨테이너 속 특정 경로와 연결되도록 설정하는 형태이다.

볼륨 마운트의 경우 마운트와 동시에 볼륨을 만들 수도 있지만 이 방법은 권장하지 않는다. 마운트 전에 별도로 볼륨을 먼저 생성하는 것이 좋다.

구체적인 커맨드는 아래와 같다.

docker run (생략) -v <볼륨 이름:컨테이너_마운트_경로> (생략)

만약 -v 옵션을 입력할 때 -v /root와 같이 볼륨의 이름을 기입하지 않으면 컨테이너가 자동으로 생성한다.

볼륨 마운트를 확인하는 방법

상술했듯이 컨테이너를 거치지 않으면 볼륨을 확인할 수 있는 방법이 없다.

따라서 docker volume inspectdocker container inspect 같이 간접적으로 확인하는 방법이 아닌, 직접적으로 볼륨 내부를 확인하고 싶다면 아래와 같은 절차를 거쳐야 한다.

  • 해당 볼륨에 마운트된 컨테이너가 -it 옵션으로 실행되어 docker exec -it <container_name> /bin/bash로 외부에서 조작이 가능한 경우, 그 컨테이너를 통해 볼륨을 확인한다.
  • 그렇지 않다면, -it 옵션, linux 운영체제 이미지를 사용하여, 관찰하고자 하는 볼륨에 마운트하여 컨테이너를 새로 만든다. 그리고 해당 컨테이너에 docker exec -it <container_name> /bin/bash를 사용하여 볼륨을 확인할 수 있다.

볼륨 백업

볼륨 자체를 복사하는 것은 불가능하다.

따라서 볼륨을 확인할 때처럼 별도의 리눅스 컨테이너를 연결하여 볼륨의 내용을 압축해 저장하여야 한다.

아래는 볼륨 백업 커맨드의 예시이다.

docker run --rm -v <백업할 볼륨명:/source> -v <백업_저장_폴더명:/target> busybox tar cvzf /target/ 백업파일이름.tar.gz -C /source

  • run 커맨드로 리눅스 운영체제(busybox) 컨테이너를 실행한다.
  • --rm : 이 컨테이너는 실행 후 바로 삭제할 예정이므로 옵션에 --rm을 추가했다.
  • -v <백업할 볼륨명:/source> : 백업할 볼륨을 컨테이너의 /source에 마운트한다.
  • -v <백업_저장_폴더명:/target> : 압축된 백업 파일을 저장할 호스트의 디렉토리를 마운트한다.
  • tar cvzf /target/백업파일이름.tar.gz -C /source
    • tar은 tar 압축을 사용하는 명령어이다.
    • czvf : 압축 옵션
    • -C /source : 압축 대상을 /source로 지정
    • /target/백업파일이름.tar.gz : 압축 결과물을 /target/백업파일이름.tar.gz 파일로 저장

바인드 마운트

바인드 마운트는 도커가 설치된 컴퓨터의 문서 폴더 또는 바탕화면 폴더 등 도커에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다. 디렉터리가 아닌 파일 단위로도 마운트가 가능하다.

폴더(디렉토리) 속에 파일을 직접 두거나 열어볼 수 있기 떄문에 자주 사용하는 파일을 두는 데 사용한다.

  • 장점
    1. 도커가 관리하지 않는 어디라도 파일을 둘 수 있다.
    2. 기존과 동일한 방식으로 파일을 사용할 수 있으므로 다른 소프트웨어를 사용해 쉽게 편집할 수 있다.

사용법

아래와 같은 커맨드로 사용한다.

docker run (생략) -v <호스트의 마운트하고자하는 디렉토리 경로:컨테이너 마운트 경로> (생략)

—volumes_from

컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v 또는 —volume 옵션을 적용한 컨테이너의 볼륨 디렉토리를 공유할 수 있다. 이는 직접 볼륨을 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너를 통해 공유하는 것이다.

docker run -it --name <볼륨을 공유받을 컨테이너의 이름> --volumes-from <볼륨을 공유해 줄 컨테이너의 이름> <image name>

추가 팁

컨테이너 안의 파일이 마운트된 디렉토리로 복사되는 것이 아닌, 아예 같은 디렉토리로 처리된다는 점에 유의해야 한다.

-v 옵션에 존재하지 않는 호스트의 디렉토리를 전달하면 해당 디렉토리가 생성되며 컨테이너 상의 파일이 옮겨온다.

만약 호스트와 컨테이너 모두에 디렉토리가 존재하고 해당 컨테이너 안에 파일이 있다면 컨테이너의 디렉토리가 호스트의 디렉토리로 덮어씌워진다(즉, 호스트의 경로가 우선권을 가진다).

임시 메모리(tmpfs) 마운트

디스크가 아닌 주 메모리 영역을 마운트한다. 디스크보다 훨씬 빠른 속도로 읽고 쓰기가 가능하기 때문에 접근 속도를 높일 목적으로 사용하지만 도커 엔진이 정지되거나 호스트가 재부팅하면 소멸한다.

볼륨 마운트와 마인드 마운트 중 무엇을 사용해야 하는가?

두 가지 마운트 방식의 차이점은

  1. 간단한지 복잡한지
  2. 호스트 컴퓨터에서 파일을 다룰 필요가 있는지
  3. 환경의 의존성을 배제해야 하는지

이다.

보통 파일을 직접 편집해야 할 일이 많다면 바인드 마운트, 그렇지 않다면 볼륨 마운트를 사용한다.

스테이트리스와 스테이트풀

스테이트리스 stateless : 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계하는 것. 다르게 말하자면, 컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받는다.

스테이트 풀 stateful : 컨테이너 자체가 데이터를 포함하고 있어 상태가 존재하는 경우

—mount

--mount 옵션은 -v 옵션을 대체하여 사용할 수 있는 옵션이다.

  1. 볼륨 마운트의 경우
    docker run -it --name <컨테이너의 이름> --mount type=volume,source=<볼륨의 이름>,target=<마운트할 컨테이너의 경로> <이미지 이름>

  2. 바인드 마운트의 경우
    docker run -it --name <컨테이너의 이름> --mount type=bind,source=<호스트의 디렉토리>,target=<마운트할 컨테이너의 경로> <이미지 이름>


참고자료

그림과_실습으로_배우는_도커_쿠버네티스
#참고도서/시작하세요_도커_쿠버네티스