/etc/fstab 이나 lsblk -f 에서 서로 다른 두 마운트 지점이 같은 UUID 를 가리키는 것을 보게 된다.
UUID=3f1c... / xfs defaults 0 0
UUID=3f1c... /var/lib/docker xfs defaults 0 0
UUID 는 파일 시스템에 붙는 식별자다. 같은 UUID 가 두 줄에 있다는 것은 같은 파일 시스템을 두 곳에 마운트했다는 뜻이다. 디스크를 따로 붙인 것이 아니라 하나의 파일 시스템을 두 경로에서 보고 있을 뿐이다.
위 예에서 /var/lib/docker 는 별도 디스크가 아니라 사실상 루트 파일 시스템의 한 디렉터리와 다름없다. 분리한 줄 알고 운영하다가 이미지와 컨테이너 레이어가 늘어나면 루트가 함께 찬다.
즉시 데이터가 깨지는 상황은 아니지만 의도한 구성이 아니므로 바로잡아야 한다. 용량 격리, inode 격리, I/O 분리, 별도 백업 같은 분리의 목적이 하나도 달성되지 않는다.
lsblk -f
findmnt --verify
findmnt /var/lib/docker
blkid
df -h / /var/lib/docker
df 에서 두 경로의 Size · Used · Avail 이 똑같이 나오면 같은 파일 시스템이 맞다.
의도가 "Docker 데이터를 별도 디스크에 둔다"였다면 디스크를 하나 더 붙여 제대로 나눈다.
mkfs.xfs /dev/sdb1
systemctl stop docker
mkdir -p /mnt/new-docker && mount /dev/sdb1 /mnt/new-docker
rsync -aAXH --numeric-ids /var/lib/docker/ /mnt/new-docker/
umount /mnt/new-docker
fstab 의 중복 줄을 지우고 새 UUID 로 바꾼 뒤 마운트한다.
blkid /dev/sdb1
# UUID=<새 UUID> /var/lib/docker xfs defaults 0 0
mount -a
findmnt /var/lib/docker
systemctl start docker
docker info | grep -i "docker root dir"
원본 데이터는 정상 동작을 확인한 뒤에 지운다.
반대로 굳이 나눌 필요가 없다면 fstab 의 중복 줄을 지우는 것만으로 끝난다. 디렉터리는 그대로 남는다.
정상적인 방법은 바인드 마운트다. UUID 를 두 번 적는 것이 아니라 경로를 지정한다.
/data/docker /var/lib/docker none bind 0 0