Search
Duplicate
📒

[Docker Container] 07. Docker Volume

상태
미진행
수업
Docker Container
주제
Docker
연관 노트
3 more properties
참고

Docker Volume

NOTE
볼륨은 도커 컨테이너에서 생산되고 사용되는 데이터를 영구적으로 저장하기 위한 방법이다!
볼륨이 생기는 위치
크게 bind mount와 volume 방식으로 나뉜다.
Storage Driver와 Volume Driver Plugin
컨테이너가 삭제되어도 volume은 남아있는다.
볼륨은 Docker HostOS와 컨테이너에서 직접 접근이 가능하다.
볼륨의 2가지 종류
bind mound ⇒ 사용자 파일 시스템에서 관리한다.
volume val/lib/docker에서 관리한다
write가 가능한 컨테이너 레이어를 만들고, 이미지 레이어로부터 파일을 복사하는 등, 스토리지와 관련한 일련의과정을 수행하는 주체를 Storage라 한다.
AUFS, ZFS, BTRFS, Overlay등이 있다
OS에 따라서 어떤 storage driver를 사용할지 결정된다.
우분투의 경우 기본으로 AUFS사용

Bind mount

NOTE
바인드 마운트를 사용하면 호스트 파일 시스템의 특정 경로를 컨테이너로 바로 마운트 할 수 있다!
폴더뿐 아니라, 파일도 가능하다.
사전에 연결할 파일 또는 디렉토리를 사용자가 생성하면 해당 호스트 파일시스템의 소유자 권한으로 연결이되고, 존재하지 않은 경우 자동 생성되지만 root 권한으로 됨
사전 정의 없이 컨테이너 실행시 자동 생성, 컨테이너 제거해도 데이터 남음
docker run -it --name=bind-mount \ -v ${PWD}/bind01:/bind01 \ -v ${PWD}/bind02:/bind02 \ ubuntu:14.04 bash
Bash
복사
호스트 파일 절대경로:컨테이너 경로
docker run -it --name=bind-mount \ -v ${PWD}/bind01:/bind01:ro \ -v ${PWD}/bind02:/bind02:rw \ ubuntu:14.04 bash
Bash
복사
권한 설정도 가능

Docker volume

NOTE
바인드 마운트가 호스트 머신의 디렉토리 구조나 OS에 의존적인 반면, 볼륨도커에의해 완전히 관리된다.
데이터는 /var/lib/docker/volumes 내부에 저장된다.
만약 볼륨의 이름을 지정하지 않으면 익명 볼륨이 만들어지며, 컨테이너가 멈추면 사라진다. (컨테이너쪽에서 관리하기 때문)
볼륨에 이름을 지정한다면 컨테이너가 멈춰도 데이터가 남아있다.
docker volume create mydb-data docker volume ls docker volume inspect mydb-data
Bash
복사
볼륨 관련 명령어
/var/lib/docker 경로에 volume이 생성된걸 볼 수 있다.
docker run -d --name mydb \ -e MYSQL_ROOT_PASSWORD=password1 \ -e MYSQL_DATABASE=fastcampus \ -v mydb-data:/var/lib/mysql \ mysql:5.7-debian
Bash
복사
-v에 이름없이 진행하면 임의의 이름이 등록 (권장하지 않음)
mysql의 데이터들이 들어가 있다.

tmps mount

NOTE
앞의 2방식과 다르게 Docker hostOS의 메모리에서만 지속되고, 끝나면 데이터도 사라짐
임시로 사용하고, 기록되지 않아야하는 파일을 사용할 떄 쓴다.

Docker 볼륨 공유

NOTE
여러 컨테이너에 데이터를 공유하고자 할때도 volume 활용 가능
# 컨테이너(share-container)에 폴더로 볼륨생성 docker create -v /share-data \ --name=share-container \ ubuntu:14.04 # 다른 컨테이너(data-1)에 이전 컨테이너(share-container)볼륨을 공유한다. docker run -it \ --volumes-from share-container \ --name=data-1 ubuntu:14.04 bash \ # 공유 볼륨에 파일을 생성하고 나온다. df -a echo 'testing data container' > /share-data/data-1.txt cat /share-data/data-1.txt exit # 새로운 컨테이너 생성하고, 볼륨을 똑같이 공유한다. docker run -it --volumes-from share-container --name=data-2 ubuntu:14.04 bash # 이전에 생성한 파일을 확인할 수 있다. df -a cat /share-data/data-1.txt
Bash
복사
--volumes-from [공유 컨테이너명] 옵션을 사용하면 된다.
share-data가 폴더로 들어간다.

Docker volume 사용량 제한

NOTE
컨테이너 영역의 filesystem의 용량은 /var/lib/docker 영역의 전체공간이다.

rootfs(/) 영역 제한

Docker는 컨테이너의 rootfs(/) 영역의 개별적인 공간 할당 제한을 위해 --storage-opt 옵션을 제공한다.
이 옵션을 사용하려면 disk partition이 xfs로 지정되어야하고, 추가 기능으로 pquota(project quota)가 설정되어 있어야 한다.
mount | grep xfs # 에러 발생, xfs와 pquota가 설정되어야함. docker run -it \ -v /home/kevin/myvolume:/webapp \ --name=mycontainer --storage-opt size=1G \ ubuntu:14.04 bash sudo vi /etc/default/grub # 10 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=uquota,pquota" sudo vi /etc/fstab # UUID=b2f0ef34-291f-411d-aa75-9a46d72c7401 /var/lib/docker xfs defaults,pquota sudo reboot # 이후 컨테이너 재생성하고 접속 docker run -it -v /home/kevin/myvolume:/webapp \ --name=mycontainer \ --storage-opt size=1G \ ubuntu:14.04 bash df -h
Bash
복사
overlay 1gb가 설정되었다!
# 아래의 코드 추가 sudo vi /etc/docker/daemon.json sudo systemctl restart docker.service sudo systemctl status docker.service docker run -it -v /home/kevin/myvolume:/webapp --name=mycontainer ubuntu:14.04 bash df -h
Bash
복사
모든 컨테이너의 rootfs 용량제한하는 방식
{ "insecure-registries": ["192.168.56.101:5000"], "log-driver": "json-file", "log-opts": { "max-size": "30m", "max-file": "10" }, "storage-opts": ["overlay2.size=500m"] }
Bash
복사
500m으로 제한