1465 文字
7 分

dockerでno space left on deviceが出た時の対処法

2017-03-14
2024-06-17

概要#

  • no space left on deviceは、日本語訳すると「空きディスク容量がありません」ということです。まずは、OS自体のディスク容量不足をまずはチェックします。
  • OSのディスク容量が空いているのに、no space left on deviceが表示された場合はDocker自体に割り当てられたディスク容量が枯渇したことが原因です。
  • 例えば、Docker for Macは20GB分しか確保しないです。
  • 普通にDockerを利用しているとゴミデータが溜まっていくので、不要なデータを消していきます。
  • 下に行けば下に行くほど、重要なデータを消していくことになりますのでご注意ください。

0. 割当領域の拡張#

macOSであれば以下のような設定画面から、割り当てているディスク容量の変更を行えます。設定を変更後はDockerの再起動が必要になります。

そもそも、自分が思っている以上にDockerがディスクを消費していると感じる場合は、以降にあるような手順でゴミファイルの削除を進めて行ってください。

現状の確認#

掃除を始める前に、docker system dfコマンドで現在のディスク使用量を確認しておきましょう。

Terminal window
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 95 53 55.52GB 36.55GB (65%)
Containers 571 0 6.355GB 6.355GB (100%)
Local Volumes 95 38 9.812GB 1.456GB (14%)
Build Cache 927 0 19.06GB 19.06GB

この例では約89GB使っています。Reclaimableの列が回収可能な容量なので、かなり削減できそうなことがわかります。

1. ゴミ掃除#

まずは、名前が割り振られていない仮想ディスクを削除します。

GUIから行う場合#

Docker Desktopから簡単に行なえます。

danglingなコンテナはほとんど再利用することはないので消してしまっても問題はほとんど起きないと思います。

CLIから行う場合#

dockerコマンドのdanglingフィルタはコンテナから参照されていない(dangling=宙ぶらりんな)ボリュームに一致します。

Terminal window
$ docker volume rm $(docker volume ls -qf dangling=true)

次に、1週間以上使っていないコンテナの削除をします。以下の例では1週間使っていないコンテナを削除します。

Terminal window
$ docker container prune --force --filter "until=168h"

次に、1週間以上前に停止したコンテナの削除です。

Terminal window
$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

全コンテナの削除をします。

Terminal window
$ docker rm $(docker ps -aq)

dangilingなimageを一括削除する。

Dangilingなimageとは、Dockerfileから作ってタグを打っていないimageです。

基本的に再利用することはないので消してOKです。普通の利用方法をしていればイメージはDockerfileから再生成できます。docker-composeから作ったり、tagが打ってあるイメージは消えません。

Terminal window
$ docker rmi $(docker images -f "dangling=true" -q)

ビルドキャッシュの削除#

docker buildで作成された中間イメージ(ビルドキャッシュ)も意外とディスクを食います。上のdocker system dfの例ではBuild Cacheだけで19GBも使っていました。以下のコマンドで削除できます。

Terminal window
$ docker builder prune

全イメージの削除#

次に、全イメージを削除します。imageが全部消えます。関連しているコンテナがまだ存在している場合はエラーが表示されて消えません。以下の2つのコマンドはほぼ同義です。

Terminal window
$ docker rmi $(docker images -q)
Terminal window
$ docker image prune

停止中の全コンテナを削除するコマンド

Terminal window
$ docker container prune

全ての停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドです。ほぼDockerのリセットと同義です。

Terminal window
$ docker system prune

掃除後の確認#

掃除が終わったら、再度docker system dfで効果を確認しましょう。

Terminal window
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 61 5 37.26GB 36.23GB (97%)
Containers 13 0 78.64MB 78.64MB (100%)
Local Volumes 38 6 8.356GB 4.673GB (55%)
Build Cache 405 0 0B 0B

半年ぐらい運用した環境では、89GBから35GBまで削減できました。最後の3つの破壊的なコマンド(全コンテナ削除、全イメージ削除、system prune)は実行せずにこの結果なので、安全な範囲のクリーンアップだけでもかなり効果があります。

定期実行用シェルスクリプト#

上記の安全なコマンド群をシェルスクリプトにまとめておくと、定期的にサクッと実行できて便利です。

#!/usr/bin/env bash
set -Eeuo pipefail
docker volume rm $(docker volume ls -qf dangling=true)
docker container prune --force --filter "until=168h"
docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
docker rmi $(docker images -f "dangling=true" -q)
docker builder prune -f

2. ディスクイメージの再構築#

Docker version 20.10.22では、Docker Desktopから行えます。

(これは、macosだけかも)

qemuをインストール。

Terminal window
$ brew install qemu
Terminal window
$ cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
$ mv Docker.qcow2 Docker.qcow2.original
$ du -hs Docker.qcow2.original
12G Docker.qcow2.original
$ qemu-img convert -O qcow2 Docker.qcow2.original Docker.qcow2
$ du -hs Docker.qcow2
772M Docker.qcow2
$ rm Docker.qcow2.original

source: https://github.com/docker/for-mac/issues/371#issuecomment-242047368

私の場合、これでは19GBから18GBに減っただけでした。

Terminal window
% ls -l Docker.qcow2*
-rw-r--r-- 1 yuki_matsukura staff 19443286016 Mar 14 10:31 Docker.qcow2
-rw-r--r-- 1 yuki_matsukura staff 20844183552 Mar 14 10:30 Docker.qcow2.original

3. ディスクイメージの拡張#

Docker version 20.10.22では、Docker Desktopから行えます。

そもそも20GBしか確保してくれないのは少ないので。

Terminal window
% qemu-img info Docker.qcow2
image: Docker.qcow2
file format: qcow2
virtual size: 64G (68719476736 bytes)
disk size: 18G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
Terminal window
% qemu-img resize Docker.qcow2 +10G
Image resized.
Terminal window
% qemu-img info Docker.qcow2
image: Docker.qcow2
file format: qcow2
virtual size: 74G (79456894976 bytes)
disk size: 18G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

4. 設定ファイル書き換え#

Docker version 20.10.22では、Docker Desktopから行えます。

(Docker 17で変わらなかった。)

~/.docker/machine/machines/default/config.jsonを開いて、DiskSizeを20000から大きい値に変更。

参考資料#

Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top ge...

🛒 Amazonで購入
dockerでno space left on deviceが出た時の対処法
https://blog.teraren.com/posts/docker-no-space-left-on-device/
作者
Yuki Matsukura
公開日
2017-03-14
ライセンス
CC BY-NC-SA 4.0
この記事が役に立ったら
GitHub Sponsorsで応援できます

コメント