Docker

[Docker] 6-3. 볼륨 마운트

patrick-star 2023. 5. 28. 13:53
728x90

이번에는 마운트에 대해 정리한다. 볼륨(volume)마운트(mount)하면 컨테이너의 일부를 호스트 컴퓨터의 일부와 같이 다룰 수 있어서 편리하다. 차근차근 알아보자.

볼륨과 마운트

  • 볼륨 : 스토리지의 한 영역을 분할한 것. 간단히 말하면 하드디스크나 SSD를 분할한 하나의 영역.
  • 마운트 : 연결하다라는 의미로 대상을 연결해서 OS 또는 SW 관리하에 두는 일을 의미. USB를 컴퓨터에 꽂는 걸 생각하면 된다.

컨테이너를 사용하려면 스토리지 영역마운트해야 한다. 왜냐하면 필요한 데이터가 해당 스토리지에 있기 때문이다.

컨테이너는 사용되고 나서 삭제되는 일이 많기 때문에 컨테이너 안에 데이터가 있다면 컨테이너가 삭제되면서 데이터도 함께 사라진다. 그래서 컨테이너의 외부에데이터를 저장해놔야 한다.

다만, 매번 데이터를 옮기는 대신에 초기에 있었던 위치를 유지한 채 컨테이너 외부의 데이터에 접근해서 사용하는 것이 일반적이다.
이를 데이터 퍼시스턴시(Data persistency)라고 하며 데이터를 저장한 장소가 마운트된 스토리지 영역이다.

관례적으로는 볼륨 마운트라는 용어를 사용한다. 마운트 대상은 스토리지 뿐만 아니라 디렉토리, 파일, 메모리가 될 수도 있다.

스토리지 마운트의 종류

볼륨 마운트

볼륨 마운트도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 디스크 형태로 마운트한다.

이름만을 가지고 관리할 수 있어서 다루기 쉽다
하지만, 볼륨에 비해 직접 조작하기 어려워서 임시로 쓰거나 자주 쓰지는 않지만 지우면 안 되는 파일을 저장할 때 많이 사용된다

바인드 마운트

바인트 마운트도커 엔진이 관리하지 않는 영역(ex. 호스트 컴퓨터의 한 폴더)을 컨테이너와 마운트 하는 방식
(디렉토리가 아닌 파일 단위로도 마운트할 수 있다)

폴더 속에 파일을 직접 저장하고 열어볼 수 있어서 자주 사용하는 파일을 두는데 사용된다.

두 방식의 차이점

차이점을 포인트로 요약하면 3가지가 있다.

  • 간단한지 복잡한지
  • 호스트 컴퓨터에서 파일을 다뤄야 하는지
  • 환경의 의존성을 배제해야 하는지

볼륨 마운트는...

볼륨도커 엔진이 관리하는 영역 안에 존재하기 때문에 사용자가 로컬 PC에서 파일의 위치를 신경쓰지 않아도 된다.

OS에 따라 명령어가 달라지는 것과 같은 의존성 문제도 발생하지 않는다.
ex) 각 OS에 따라 경로를 기재하는 방식이 다르다. ⇒ 볼륨 마운트를 사용하면 이에 대한 작업이 필요 없다.

⇒ 그래서, 볼륨 마운트는 익숙해지면 손쉽게 사용할 수 있고 Docker에서도 볼륨 마운트를 사용하는 걸 권장하고 있따.

하지만, 도커 컨테이너를 경유하지 않으면 볼륨에 접근할 수 없고
볼륨을 수정할 때 볼륨 자체가 깨질 수도 있고 백업할 때도 복잡한 절차가 필요하다.

바인드 마운트는...

도커가 관리하지 않는 영역 어디라도 파일을 둘 수 있고
기존과 동일한 방식으로 파일을 사용할 수 있어서 다른 SW를 사용해서 쉽게 편집할 수 있다. 그리고 도커 엔진과 무관하게 파일을 다룰 수 있다.

때문에, 파일을 직접 편집해야 할 일이 많다면 바인드 마운트를 사용하는 것이 더 좋다.
그렇지 않다면, 볼륨 마운트를 사용하는 것이 더 좋다.

항목 볼륨 마운트 바인드 마운트
스토리지 영역 볼륨 디렉토리 또는 파일
물리적 위치 도커 엔진의 관리 영역 어디든지 가능
마운트 절차 볼륨 생성 후 마운트 기존 파일 또는 폴더를 마운트
내용 편집 도커 컨테이너를 통해서 일반적인 파일과 같이
백업 복잡한 절차 일반적인 파일과 같이

스토리지 영역을 마운트하는 커맨드 ⇒ run 커맨드

run 커맨드의 옵션을 통해서 스토리지 마운트를 지정한다.
마운트하려는 스토리지의 경로컨테이너 속 특정 경로가 연결되도록 설정한다. 곧바로 예시와 함께 살펴보자.

스토리지를 마운트하는 절차

1) 마운트 될 스토리지 생성
2) 컨테이너 생성 & 마운트

1) 스토리지 생성

  • 볼륨 마운트 ⇒ 볼륨 생성하면 됨(docker volume create ~~ 을 통해서)
  • 바인트 마운트 ⇒ 각 OS에서 하던 대로 새 폴더 또는 파일을 만들면 됨

2) 컨테이너 생성 & 마운트

run 커맨드의 -v 옵션을 통해 마운트 한다. 방법은 아래와 같다.

# 볼륨 마운트 커맨드 예시 
docker run ~~ -v 볼륨이름:컨테이너마운트경로 

# 바인트 마운트 커맨드 예시 
docker run ~~ -v 스토리지실제경로:컨테이너마운트경로 

ex) docker run mysql -v 스토리지실제경로:/var/lib/mysql 
(/var/lib/mysql 경로가 mysql 컨테이너에서 데이터를 저장하는 위치)

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

docker volume inspect 또는 docker container inspect를 통해 간접적으로 확인할 수 있다.
하지만, 파일을 읽고 쓰는지 직접 확인하려면 다음과 같은 방법이 있다.

운영환경에서 확인하는 방법 : 별도의 컨테이너해당 볼륨을 마운트하고 나서 그 컨테이너에서 볼륨의 내용을 보는 방법

ex) 워드 프레스 컨테이너가 있다.

워드프레스 컨테이너에서 데이터를 수정했다면 볼륨에 새로운 파일이 저장되었을 것이다.

이때, Linux 운영체제 컨테이너같은 볼륨을 마운트한 다음에 볼륨의 내용에서 파일 목록을 확인하면
볼륨에 읽기와 쓰기가 제대로 수행되었는지 확인할 수 있다.

볼륨 백업

  • 바인트 마운트 ⇒ 파일 또는 폴더를 복사해서 원하는 곳에 저장하면 된다.
  • 볼륨 마운트

볼륨 자체를 복사할 수 없어서 볼륨을 확인할 때 처럼 별도의 컨테이너를 연결해서 볼륨의 내용을 압축해 저장한다.
(이때, run과 함께 tar 커맨드를 가지고 백업을 수행한다)

그렇게 압축한 파일을 컨테이너 밖에 저장해야 한다. 백업 과정을 간단하게 정리하면 다음과 같다.

1) 원래 볼륨과 연결되어 있던 주 컨테이너의 종료를 확인
2) linux 운영체제 컨테이너를 만들어서 tar 명령어를 수행해 백업을 진행

볼륨 백업 커맨드의 예시

# 큰 구조
docker run (옵션) busybox (인자)

docker run --rm -v 볼륨이름:/moto 
                -v 백업저장폴더이름:/target 
           busybox tar cvzf /sake/백업파일이름.tar.gz -C /source . 
커맨드 설명
--rm 생성할 컨테이너를 실행 후 바로 삭제하는 옵션
-v 볼륨이름:/moto 볼륨busybox 컨테이너(/moto)에 마운트 - 이전과 같은 볼륨 마운트
-v 백업저장폴더이름:/target 백업된 데이터를 저장할 호스트의 폴더busybox 컨테이너(/target)에 마운트 - 바인드 마운트
tar cvzf /sake/백업파일이름.tar.gz -C /source . 자세한 설명은 아래에서

tar cvzf /target/백업파일이름.tar.gz -C /source .

tar : tar 압축을 사용하는 명령어 / czvf와 -C : 압축 옵션 / 백업파일이름.tar.gz : 파일 이름

즉, /source의 내용을 /target 안의 백업파일이름.tar.gz로 압축해서 저장하라는 의미를 갖고 있다.

볼륨을 압축해서 백업할 때 볼륨을 사용하는 주 컨테이너정지 또는 삭제되었는지 먼저 확인해야 한다.

백업의 복원에 대한 내용도 추후에 정리할 것

출처 : 그림과 실습으로 배우는 도커 & 쿠버네티스