Docker - volume, mount

문한성·2023년 4월 12일
0

공부

목록 보기
23/28
post-thumbnail

도커 컨테이너는 컨테이너마다 기본적으로 독립적인 저장소를 가지고 있다. 하나의 이미지로 여러 컨테이너를 만든다면 해당 컨테이너마다 독립적인 볼륨(하나의 파일 시스템을 갖춘 접근 가능한 저장 공간)이 할당되고, 컨테이너가 삭제되면 해당 볼륨 또한 삭제된다. 문제는 컨테이너 내부에 저장된 데이터는 컨테이너가 삭제되었을 경우 같이 삭제된다.

그래서 도커에서는 데이터의 영속성을 보장하기 위하여 볼륨과 바인드 마운트를 이용한다. 볼륨과 바인드 마운트는 영속성을 보장하며 파일 시스템과 컨테이너를 분리하여 관리한다. 즉 컨테이너를 지웠다가 다시 실행해도 도커 볼륨과 연결한다면 데이터는 그대로 유지된다.

마운트(Mount)

물리적인 장치를 특정한 디렉토리 위치에 연결시켜 주는 과정

리눅스에서는 하드디스크의 파티션, CD/DVD, USB메모리 등을 사용하려면 특정한 위치에 연결을 해 줘야 한다.

  • 기차는 서울역에서 정차한다. -> 디스크를 디렉토리에 마운팅한다.

  • 홍길동은 서울역에서 기차를 탄다. -> 데이터를 마운트 디렉토리에 저장한다.

  • 기차는 홍길동을 태우고 목적지까지 간다. -> 실제 물리적으로 디스크에 저장된다.

여기에서 기차는 리눅스 상에 있는 물리적 장치이고, 서울역은 마운트된 디렉토리, 홍길동은 저장될 데이터다.
test.txt라는 데이터를 /data 아래에 저장하면 실제로 해당 데이터는 /dev/sda1 디스크에 저장이 된다.

이제 도커의 볼륨과 마운트에 대해 다시 알아보자.

볼륨(Volume)

도커 공식 문서에서 권장하는 방식으로 도커 엔진이 관리하는 도커 스토리지 디렉토리에 새 디렉토리를 생성하여 컨테이너 내부의 볼륨 데이터를 저장하는 방식이다.

생성된 볼륨은 자동으로 호스트의 도커 스토리지 디렉토리인 /var/lib/docker/volumes/~ 에 저장된다. 볼륨을 컨테이너에 탑재하면 이 디렉터리가 컨테이너에 탑재되며, 도커에 의해 관리되고 호스트 시스템의 핵심 기능과 분리된다. 바인드 마운트가 호스트 머신의 디렉토리 구조나 OS에 의존적인 반면, 볼륨은 도커에 의해 완전히 관리된다.

  • Docker API를 사용하여 볼륨을 관리
  • Linux 및 Windows 컨테이너 모두에서 작동
  • 여러 컨테이너 간에 볼륨을 안전하게 공유 가능

Volume 사용방법

Volume 생성

$ docker volume create 볼륨명

docker volume create my_volume

Volume 목록

$ docker volume ls

Volume 검사

$ docker volume inspect 볼륨명

Volume 제거

$ docker volume rm 볼륨명

사용하지 않는 Volume 삭제

$ docker volume prune

이미지 실행하여 생성된 컨테이너에 볼륨 연결

nginx 웹서버는 기본적으로 /user/share/nginx/html에서 html 파일을 읽어들이기 때문에, 볼륨을 생성하여 html 파일을 저장하고, nginx 컨테이너의 해당 경로에 볼륨을 마운트해 사용하면 된다.

docker run –v <볼륨명>:<컨테이너  경로> <이미지>
docker run –d –p 9999:80 –v my_volume:/user/share/nginx/html nginx

바인드 마운트(Bind mount)

바인드 마운트는 도커가 관리하는 디렉토리가 아닌, 호스트 시스템의 파일이나 디렉터리가 컨테이너에 마운트되며 호스트 시스템의 절대 경로가 참조되는 방식이다. 이 방식의 단점은 도커의 관리없이 호스트 디렉터리와 마운트를 하다 보니 컨테이너에서 호스트의 파일 시스템에 접근하여 컨테이너에 지정된 파일이 아닌 다른 파일을 삭체하거나 수정할 수 있게 된다. 그래서 호스트 시스템의 비 Docker 프로세스에 영향을 줄 수 있고 보안에도 영향을 미칠 수 있다. 따라서 도커 Volume을 사용하는 것을 권장한다.

  • 파일 또는 디렉터리가 Docker 호스트에 존재하지 않는 경우 요청 시 생성된다.
  • 성능이 뛰어나지만 특정 디렉터리 구조를 사용하는 호스트의 파일 시스템에 의존적이다.
  • Docker CLI 명령을 사용하여 바인드 마운트를 직접 관리할 수 없다.

Bind mount 사용방법

일반적인 경우 컨테이너가 바인드 마운트에 기록해야 하므로 변경사항이 Docker 호스트로 다시 전파된다. 하지만, 읽기 권한만 필요한 경우 ro를 이용하여 읽기 전용 바인드 마운트로 마운트 할 수 있다.

권한 종류 (ro: 읽기 전용, rw: 읽기 및 쓰기)
경로에 다른 특수 문자가 있을경우 ""로 경로를 감쌀 수 있다.

docker run –v <호스트 경로>:<컨테이너  경로>:<권한> <이미지>
docker run –d –p 9999:80 –v /var/www:/user/share/nginx/html:ro nginx

${pwd}는 이 명령을 실행하는 현재 디렉터리의 절대 경로
docker run -d –p 9999:80 –v ${pwd}:/user/share/nginx/html nginx

바인드 마운트는 로컬에서 개발할 때, 일반적으로 현재 작업 디렉터리에 프로젝트 저장소를 받아놓고(git clone) 코드를 변경하므로, 바인드 마운트를 이용해서 해당 디렉터리를 컨테이너의 특정 경로에 마운트해주면 코드를 변경할 때마다 변경 사항을 실시간으로 컨테이너를 통해 확인할 수 있다. 컨테이너를 통해 변경된 부분도 현재 작업 디렉터리에도 반영이 되기 때문에 편리하다는 장점이 있다.

tmpfs mount

컨테이너 내부에 저장된 볼륨을 호스트의 파일 시스템이 아닌, 메모리에 저장하는 방식으로 리눅스에서 도커를 실행하는 경우에만 사용할 수 있는 기능이다. 호스트 및 컨테이너 어느 파일 시스템에도 저장되지 않고 오직 컨테이너가 살아있는 동안 메모리에 저장되어 있다. tmpfs 마운트는 호스트 시스템이나 컨테이너 내에서 데이터를 유지하지 않으려는 경우에 가장 적합하다. 이는 보안상의 이유이거나 애플리케이션이 많은 양의 비 영구 상태 데이터를 작성해야 할 때 컨테이너의 성능을 보호하기 위한 것일 수 있다.

  • 리눅스의 tmpfs를 이용한 마운팅 방법
  • 리눅스에서 Docker를 실행한 환경에서만 사용가능
  • 호스트 메모리에서만 지속된다.
  • 볼륨 및 바인드 마운트 달리 컨테이너 간에 마운트를 공유 불가능

tmpfs mount 사용방법

docker run -tmpfs <컨테이너  경로> <이미지>
docker run –d –p 9999:80 -tmpfs /user/share/nginx/html nginx
profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글