컨테이너는 stateless하게 관리되어야 한다.
언제든 버리고 새로운 컨테이너를 띄울 수 있어야 하기 때문이다!
따라서 컨테이너는 이미지로 빌드된 상태만을 유지하며 어떤 정보도 컨테이너 내부에서 관리해선 안되고, 저장소를 호스트에 마운트시켜서 관리하거나, RDS를 이용해야한다.
Host Directory 와 Container 볼륨을 마운트 시켜야한다.
-v <컨테이너 마운트 경로>
-v <호스트 경로>:<컨테이너 마운트 경로>
-v <호스트 경로>:<컨테이너 마운트 경로>:<읽기 쓰기 모드>
docker run -v /tmp/vol:/data -it fedora:latest bash
[root@ID /]# touch /data/myfile
[root@ID /]# exit
ls /tmp/vol
# myfile
---
docker run -v /tmp/vol:/data:ro -it fedora:latest bash
[root@ID /]# touch /data/myfile
# touch: cannot touch '/data/myfile': Read-only file system
볼륨은 기본적으로 /var/lib/docker/volumes
에 위치한다.
기본적으로 볼륨은 호스트 파일시스템에 디렉터리나 파일로 존재하고, 컨테이너에서 마운트한 폴더에서의 작업은 커밋 없이 호스트 볼륨에 적용된다.
Host Directory 볼륨에 맵핑
데이터 전용 컨테이너 설정
볼륨 생성으로 명시적 볼륨 선언
docker run -it -v /testDir/:/data ubuntu
docker volume ls # docker volume list up
docker volume ls -f dangling=true # unused volume list up
docker volume ls -f driver=local # specific volume drivier list up
docker volume ls -f name=web # volume list up with specific volume name
docker volume inspect # volume info
컨테이너 중 하나에 이미 볼륨이 마운트 돼있는 경우 다른 컨테이너를 해당 컨테이너와 같은 볼륨을 바라보게 지시
docker run -it --name myUbuntu -v /data ubuntu
docker run -it --name myBusybox --volumes-from myUbuntu busybox
myUbuntu Container inspect
"Mounts": [
{
"Type": "volume",
"Name": "8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec",
"Source": "/var/lib/docker/volumes/8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
myBusyBox Container inspect
"Mounts": [
{
"Type": "volume",
"Name": "8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec",
"Source": "/var/lib/docker/volumes/8d9e9f356152798416c99ebd8edf2ceb6fe6f716ce3dbcdf3d426b0e650963ec/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
동일한 볼륨을 바라보는 것을 확인할 수 있다.
docker volume create
docker volume ls
docker volume rm
docker volume prune
docker volume inspect
docker volume create --name data
docker volume ls
docker volume inspect data
docker run -it -v data:/data ubuntu
root@43jid:/# cd /data
root@43jid:/data# touch file1
root@43jid:/data# exit
ls /var/lib/docker/volumes/data/_data
docker container rm -v <containerName> # remove container with its volume
docker volume rm <volumeName> # remove volume with specific name
docker volume rm $(docker volume ls -qf dangling=true) # remove unused volume
docker volume prune # remove all volume
호스트의 /var/lib/docker
에서 모든 이미지와 컨테이너를 저장하는데, 많은 이미지가 추가될수록 이 볼륨 크기는 빠르게 증가한다.
스토리지가 부족해지고 이때 외부 볼륨을 /var/lib/docker
에 마운트해서 사용하자!
LVM을 사용해서 EC2서버에 Docker 스토리지를 확장해보자.
sudo yum install lvm2
스토리지는 LVM으로 관리하기 이전에 물리적, 가상화 기반의 디스크를 추가해주고, 운영체제 레벨의 파티셔닝을 한 뒤에 LVM으로 구성된다.
lsblk
# lsblk result
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.4M 1 loop /snap/amazon-ssm-agent/****
loop1 7:1 0 55.6M 1 loop /snap/core18/****
loop2 7:2 0 63.3M 1 loop /snap/core20/****
loop3 7:3 0 111.9M 1 loop /snap/lxd/*****
loop4 7:4 0 53.2M 1 loop /snap/snapd/*****
xvda 202:0 0 30G 0 disk
├─xvda1 202:1 0 29.9G 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
vgcreate docker_vg /dev/sdf
vgdisplay # check result
lvcreate -n docker -l 100%FREE docker_vg
lvdisplay # Path에는 LV가 만들어진 경로가 표시
lsblk # 블럭디바이스 확인
# 디바이스 맵핑정보 확인
ls /dev/mapper
ls /dev/docker_vg
# 파일 시스템 생성
mkfs.xfs /dev/docker_vg/docker
mkfs -t xfs /dev/docker_vg/docker
mount /dev/docker_vg/docker /var/lib/docker
# LV의 UUID 확인
blkid /dev/docker_vg/docker
# /dev/docker_vg/docker : UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs"
# fstab 등록
vim /etc/fstab
#...
#/dev/docker_vg/docker /var/lib/docker xfs defaults 0 0
mount -a