Docker Overlay 상태 확인
Docker 컨테이너 내부에서 다음 명령어를 통해 overlay 점유를 볼 수 있습니다.
df -h
Shell
복사
Filesystem Size Used Avail Use% Mounted on
overlay 1.8T 1.7T 100G 95% /
tmpfs 64M 0 64M 0% /dev
shm 256G 0 256G 0% /dev/shm
/dev/nvme0n1 14T 12T 1.6T 89% /media/ssd1
/dev/nvme1n1p2 1.8T 1.7T 100G 95% /media/ssd2
tmpfs 252G 12K 252G 1% /proc/driver/nvidia
tmpfs 51G 66M 51G 1% /run/nvidia-persistenced/socket
udev 252G 0 252G 0% /dev/nvidia2
tmpfs 252G 0 252G 0% /proc/asound
tmpfs 252G 0 252G 0% /proc/acpi
tmpfs 252G 0 252G 0% /proc/scsi
tmpfs 252G 0 252G 0% /sys/firmware
tmpfs 252G 0 252G 0% /sys/devices/virtual/powercap
Shell
복사
docker 의 각 항목 (이미지, 컨테이너, 볼륨, 캐시) 등의 점유를 세부적으로 알아보기 위해 다음과 같은 명령어를 사용해볼 수 있습니다.
docker system df
Shell
복사
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 3 1.38TB 1.32TB (95%)
Containers 6 3 121.6GB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 15 0 3.373kB 3.373kB
Shell
복사
위의 결과처럼 RECLAIMABLE 이 굉장히 높게 잡힌 경우, 확보 가능한 이미지 내 불필요한 layer 가 굉장히 많다고 볼 수 있습니다.
Docker Image 확인
docker images -a
Shell
복사
REPOSITORY TAG IMAGE ID CREATED SIZE
dyna latest 1b4050e20bc5 2 hours ago 355GB
<none> <none> 7b02452e997f 2 weeks ago 355GB
<none> <none> 80b1409d0993 3 weeks ago 355GB
<none> <none> da46b6d2ff3c 4 weeks ago 336GB
<none> <none> 641e5bdc0318 4 weeks ago 396GB
<none> <none> 16cced225188 6 weeks ago 336GB
<none> <none> 88f540d6033a 7 weeks ago 286GB
<none> <none> f9d37d22c87c 8 weeks ago 248GB
<none> <none> 7f58da34cf91 2 months ago 207GB
<none> <none> c64572ef8db3 2 months ago 272GB
<none> <none> c3b6b47caef7 3 months ago 198GB
<none> <none> 9fea06a90b03 3 months ago 164GB
<none> <none> 25d7a6500dda 4 months ago 164GB
<none> <none> 99355aa4c8c7 4 months ago 154GB
<none> <none> be71d8f91328 4 months ago 96.9GB
<none> <none> ca3d7c994fc3 4 months ago 95GB
<none> <none> 63617fee9c25 5 months ago 86GB
<none> <none> 3e3b03f41ef0 5 months ago 32.1GB
hyeonwoo_general latest 7dcf68414a3a 5 months ago 50.8GB
nvidia/cuda 11.8.0-cudnn8-devel-ubuntu20.04 99385beffe2a 5 months ago 9.75GB
<none> <none> 6818dc9ecfab 5 months ago 38GB
<none> <none> d0f3ab9c4a37 5 months ago 440GB
<none> <none> 8426c5657bef 2 years ago 17.5GB
Shell
복사
실제로 모든 이미지를 출력해보면, 안쓰는 이미지들이 굉장히 많은 것을 볼 수 있습니다. 이는 docker commit 을 통해서 지속적으로 생겨난 부모-자식 관계의 이미지들입니다. 부모-자식 관계의 이미지는 layer 를 공유하기 때문에 현재 본인이 가장 마지막 자식 이미지만 사용하고 있더라도, overlay 를 점유하고 있는 부모 이미지를 삭제할 수 없습니다.
docker rmi 3e3b03f41ef0
Shell
복사
Error response from daemon: conflict: unable to delete 3e3b03f41ef0 (cannot be forced) - image has dependent child images
Shell
복사
이러한 부모-자식 관계는 다음 명령어를 통해 확인 가능합니다. 해당 명령어는 특정 이미지의 id 를 입력하면 해당 이미지의 부모 이미지들의 id 를 출력해줍니다.
docker inspect --format '{{.Parent}}' 1b4050e20bc5
Shell
복사
sha256:7b02452e997f1b7833849a66295742a604ae2cf074a7f69fbfc6b4a921e18dbf
Shell
복사
Docker Image Layer 확인하기
먼저, 제가 가진 가장 마지막 자식 이미지가 포함한 레이어들을 다음과 같이 확인할 수 있습니다.
docker inspect 1b4050e20bc5
Shell
복사
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2efe99748983f61218ebf4051e2e66c4af0dbe52606d5ed2f586052e19366de7",
"sha256:a7c908d1faf5a8df8c174363e6deac6ae70732cf0c143ad24d5dcf5667368fc8",
"sha256:d3a7bd6896067aae46940f8dee2d7580cf4f1057f55712c4617ca5fac45c10af",
"sha256:67b3ea49859b524c696906e3eaedbda1f15bc8d0a7f0ac12f8ceb3a076251437",
"sha256:9ed5f38fadb6bbecc9ac535b8552819602bb36e62f9282fd35bdcb72e0245034",
"sha256:75e3537c592aa825f993a680bf833245b191e51de29ccfe7bf3f40b3312b6455",
"sha256:09c1f63c6efeb3da1b64aaf3ff7ca9385be691ed4bface58eaaf08d5eb8ae1a1",
"sha256:73cc4f12094749dbb9d56dc60995ac643bfb8e0963fe632f87f21b41f88c5861",
"sha256:3e9322eb8b881d99962dc70d807b6b14946d55660535d7a1f37cbd3d30ee430f",
"sha256:13609e3c378607ff3d33ca31db8d7c07cc04bbccc6f446341f83c4ed97fe9e42",
"sha256:0a0c7c2abacea8a9be26b17a8e5c3e9b35d4f61daf6ebc48aad68c6b0928ffe0",
"sha256:17ef36c995bf62b5e932abdfe03fb9532a6aaa87e7e97aa5ab8a512f03950149",
"sha256:ee644d32ae2289f394a56cf6d41cf724656ac1ac71b236282ce969b3aa8e1918",
"sha256:66bfc89840a32783952b0df26f89224a616e86b32e428ccb2599224c342b68c6",
"sha256:cd2c7fbd4b72b27377a35d37ae21cfe31a36aae88ddbe906e74af78ec42839b0",
"sha256:88f0bf5600340bae9ab873d90a18c1839602ea0d7cff1357657231a3bf131673"
]
},
...
Shell
복사
마찬가지로, 이 이미지의 가장 조상인 부모 이미지의 레이어들을 다음과 같이 확인할 수 있습니다.
docker inspect 3e3b03f41ef0
Shell
복사
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2efe99748983f61218ebf4051e2e66c4af0dbe52606d5ed2f586052e19366de7"
]
},
...
Shell
복사
이처럼 겹치는 레이어가 존재하기 때문에 부모 이미지를 강제로 삭제하면 자식이미지도 망가지게 되며 사용할 수 없게 됩니다.
Ovelay 용량 확보
Overlay 용량을 확보하기 위해서는 불필요한 이미지, 그리고 그 속의 불필요한 레이어를 삭제할 필요가 있습니다. 하지만, 안타깝게도 이를 자동으로 구별해주어 삭제하는 기능은 제가 아는 한 docker 에서 지원하지 않습니다. 따라서 가장 명확한 방법은, 현재 container 를 새로운 .tar 파일로 만들어 새롭게 이미지를 만드는 것입니다. 이 과정에서 히스토리, 메타데이터와 같은 정보를 포함하지 않기 때문에 의존적이지 않고 완전히 새로운 컨테이너를 저장할 수 있게 됩니다. 그리고 이 컨테이너를 이미지로 commit 하면 됩니다.
docker export 557aaf2475a3 -o david.tar
docker import david.tar david:latest
docker run -dit david:latest /bin/bash
docker commit [] david:latest
Shell
복사
이 이후에, 기존 이미지들을 삭제해준뒤 prune 명령어를 실행하고, reboot 해주면 됩니다.
docker image prune -a
docker volume prune
docker network prune
Shell
복사