「Docker: no space left on device」エラーの解決方法

はじめに

Dockerを使用していると、いつかは必ず遭遇する可能性が高いエラーの一つが「no space left on device」というメッセージです。このエラーは、Dockerを使用しているマシンのディスク容量が不足していることを示しています。突然ビルドやコンテナの起動ができなくなり、開発作業が中断されてしまうこともあるでしょう。

本記事では、この厄介なエラーが発生する原因と、それを解決するための効果的な方法を詳しく解説します。また、このエラーを未然に防ぐための対策についても紹介します。

エラーが発生する状況

「Docker: no space left on device」エラーは主に以下のような状況で発生します:

  • Dockerイメージをビルドしようとした時
  • コンテナを起動しようとした時
  • ボリュームにデータを書き込もうとした時
  • Dockerコマンドを実行しようとした時

エラーメッセージの例:

failed to register layer: Error processing tar file(exit status 1): write /var/lib/docker/...: no space left on device

または:

ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref ...: write /var/lib/docker/...: no space left on device

原因の特定

このエラーには複数の原因が考えられます。問題を効率的に解決するためには、まず原因を特定することが重要です。

1. ディスク使用状況の確認

まずは、ホストマシンの全体的なディスク使用状況を確認しましょう:

df -h

出力例:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       100G   95G   5G   95% /

「Use%」が90%以上の場合、ディスク容量が危険なレベルまで使用されています。

2. Dockerが使用しているディスク容量の確認

Dockerがどれだけのディスク容量を使用しているかを確認します:

docker system df

出力例:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          25        10        15.6GB    9.8GB (62%)
Containers      10        5         256MB     125MB (48%)
Local Volumes   15        5         10.2GB    5.5GB (53%)
Build Cache     0         0         0B        0B

この情報から、Dockerのイメージ、コンテナ、ボリュームがどれだけのディスク容量を使用しているかがわかります。

3. 詳細な情報の取得

より詳細な情報が必要な場合は、以下のコマンドを使用します:

# 詳細なディスク使用状況(イメージの一覧とサイズ)
docker system df -v

# Dockerのデータディレクトリのサイズ
du -sh /var/lib/docker/

解決方法

原因が特定できたら、以下の方法で問題を解決していきましょう。

1. 未使用のDockerリソースの削除

停止しているコンテナの削除

# 停止しているコンテナをすべて削除
docker container prune

# または、すべての停止コンテナを確認して削除
docker ps -a
docker rm [container_id]

未使用のイメージの削除

# タグ付けされていないイメージ(<none>と表示されるもの)を削除
docker image prune

# すべての未使用イメージを削除
docker image prune -a

# 特定のイメージを削除
docker rmi [image_id]

未使用のボリュームの削除

# 未使用のボリュームをすべて削除
docker volume prune

ビルドキャッシュのクリア

# ビルドキャッシュを削除
docker builder prune

2. 一括クリーンアップ

上記のすべてのリソースを一度にクリーンアップするには、以下のコマンドを使用します:

# 未使用のリソースをすべて削除
docker system prune

# ボリュームを含むすべての未使用リソースを削除(注意: データが失われます)
docker system prune -a --volumes

実行例:

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all build cache

Are you sure you want to continue? [y/N] y

Deleted Containers:
...
Deleted Networks:
...
Deleted Images:
...
Total reclaimed space: 15.6GB

3. 特定のコンテナ内でのディスク不足を解決

コンテナ内部でディスク容量が不足している場合:

  1. コンテナ内の不要なファイルを削除
  2. コンテナのボリューム設定を見直し
  3. より大きなボリュームを割り当て

コンテナ内でのクリーンアップの例:

# コンテナ内でのクリーンアップ(Linuxの場合)
docker exec [container_id] rm -rf /tmp/*

# または、コンテナに入ってクリーンアップ
docker exec -it [container_id] bash
$ find /path/to/directory -type f -name "*.log" -delete

4. Dockerの設定変更によるディスク容量の管理

データディレクトリの移動

/var/lib/docker の場所を容量の大きい別のドライブに変更することができます:

  1. Dockerデーモンを停止
sudo systemctl stop docker
  1. 既存のデータを新しい場所にコピー
sudo rsync -aP /var/lib/docker/ /new/path/docker/
  1. Dockerの設定ファイルを編集
sudo nano /etc/docker/daemon.json
  1. 以下の内容を追加・編集
{
  "data-root": "/new/path/docker"
}
  1. Dockerデーモンを再起動
sudo systemctl start docker

ディスククォータの設定

Dockerのディスク使用量に制限を設けることができます:

sudo nano /etc/docker/daemon.json
{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=20G"
  ]
}

※注意:この設定はoverlay2ストレージドライバを使用している場合にのみ有効です。

Dockerイメージのビルド時に不要なファイルを除外

.dockerignore ファイルを使用して、不要なファイルをビルドコンテキストから除外できます:

node_modules
*.log
.git
.env

予防策:定期的なメンテナンス

「no space left on device」エラーを未然に防ぐためには、以下のような定期的なメンテナンスが有効です:

1. クリーンアップのスケジュール設定

cronを使用して定期的なクリーンアップをスケジュールすることができます:

# /etc/cron.daily/docker-cleanup として保存
#!/bin/bash
docker system prune -f

権限を設定:

sudo chmod +x /etc/cron.daily/docker-cleanup

2. ディスク使用量の監視

システムのディスク使用量を監視し、しきい値を超えた場合に警告を受け取るようにします:

# ディスク使用率が90%を超えた場合に警告を送信するスクリプト例
#!/bin/bash
USAGE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
if [ $USAGE -gt 90 ]; then
    echo "警告: ディスク使用率が90%を超えています: $USAGE%" | mail -s "ディスク容量警告" your-email@example.com
fi

3. Dockerのベストプラクティスの適用

  • マルチステージビルドを使用してイメージサイズを小さくする
  • 軽量なベースイメージ(Alpine Linuxなど)を使用する
  • レイヤー数を最小限に抑える
  • 不要なパッケージやファイルをインストール/コピーしない

トラブルシューティングの応用例

ケース1: ビルド時のディスク不足

問題:

ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref ...: write /var/lib/docker/...: no space left on device

解決策:

# ビルドキャッシュをクリア
docker builder prune -f

# 不要なイメージを削除
docker image prune -a -f

ケース2: コンテナログによるディスク容量の圧迫

問題: 大量のログファイルがディスク容量を圧迫している

解決策:

# ログサイズを制限するようにDockerを設定
sudo nano /etc/docker/daemon.json

# 以下の内容を追加
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# Dockerを再起動
sudo systemctl restart docker

ケース3: Dockerボリュームによるディスク容量の圧迫

問題: 使用されていない多数のボリュームがディスク容量を圧迫している

解決策:

# 未使用のボリュームをリストアップ
docker volume ls -f dangling=true

# 未使用のボリュームを削除
docker volume prune -f

まとめ

「Docker: no space left on device」エラーは、多くのDocker利用者が遭遇する一般的な問題です。本記事で紹介した方法を実践することで、このエラーを効果的に解決し、また未然に防ぐことができるでしょう。

特に重要なポイントを再度まとめると:

  1. 原因を特定する: df -hdocker system df でディスク使用状況を確認
  2. 未使用リソースを削除する: docker system prune などのコマンドを活用
  3. 定期的なメンテナンスを行う: クリーンアップをスケジュールに組み込む
  4. 予防策を実施する: ディスク使用量の監視や、Dockerのベストプラクティスを適用

これらの対策を講じることで、Docker環境をより効率的に、そして問題なく運用することができるようになります。

参考リソース

コメント

タイトルとURLをコピーしました