참고
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으로 제한