Dockerを使う上で知っていると捗るコマンドやテクニック – ストレージ圧迫対処編

Docker

Dockerを使っていると、「これどうやるんだろう?」と思ったり、調べても情報がなかなかまとまっていなかったりすることがあります。そこで、自分用のメモ書きとして、Dockerのよく使うコマンドや、困ったときの対処法、事前に設定しておくべきポイントなどをまとめてみました。この記事が、皆さんの Dockerライフ を少しでも便利にするお役に立てれば幸いです。

この記事では、Dockerを使っていると良く遭遇するストレージ圧迫問題の対処方法をご紹介します。


使用していない Docker オブジェクトの削除

Dockerを使用していると、イメージやビルドキャッシュなどがどんどん蓄積され、ストレージを圧迫してしまいます。コンテナをビルドしようとしたときに「No space left」といったエラーが出て困った経験をお持ちの方も多いのではないでしょうか。

Dockerには不要なデータをまとめてクリーンアップするための便利なコマンドが用意されています。以下にその方法を紹介します。

使っていないイメージを削除

このコマンドを実行すると、現在使用していないイメージをすべて削除できます。

docker image prune -a

停止状態のコンテナを削除

停止したコンテナは、--rm オプションを付けて起動しない限り、自動では削除されません。そのため、停止後に削除しないまま放置してしまうことがよくあります。以下のコマンドを使えば、停止状態のコンテナをまとめて削除できます。

docker container prune -a

ボリュームの削除

不要になったボリュームを削除する場合は、このコマンドを使用します。

:::message alert
ボリュームにデータベースのデータなど重要な情報を保存している場合は注意してください。このコマンドでそれらのデータも削除されてしまいます。
:::

docker volume prune

ビルドキャッシュの削除

Dockerイメージを頻繁にビルドする開発者の場合、ビルドキャッシュが大量にたまっていることがあります。ビルドキャッシュがあると再ビルド時に効率化されますが、しばらくビルドしていないコンテナのキャッシュは削除することでストレージを大幅に節約できます。

docker builder prune -a

さらに、最近のキャッシュを残しておきたい場合には、フィルタを設定することも可能です。以下のコマンドでは、168時間(7日)以上前のキャッシュを削除します。

docker builder prune --filter "until=168h" -a

ネットワークの削除

ネットワークはストレージを直接圧迫することはありませんが、不要なネットワークが散らかっている場合には以下のコマンドで一括削除できます。

docker network prune

すべてを削除

もう細かいことを気にせず、すべてをきれいさっぱり削除したいときはこのコマンドを使います。ただし、このコマンドではボリュームは削除されないため、ボリュームのデータはそのまま残ります。

docker system prune

ボリュームも含めてすべて削除したい場合は、--volume フラグを追加します。このコマンドを実行すると、まっさらな状態になります。

docker system prune --volume

Dockerのデータでrootパーティションが圧迫される問題の対処

通常、Linuxをセットアップする際、標準的なパーティション設定では / パーティションの容量が少なく設定され、代わりに /home パーティションに多くの容量が割り当てられることがあります。
しかし、Dockerは /var/lib/docker ディレクトリに大量のデータを保存するため、rootパーティションがすぐに圧迫され、「No space left」といったエラーが発生することがあります。

そこで、Dockerのデータ保存場所を /home 配下に移動させることで、ストレージを効率的に活用する方法を紹介します。

設定手順

  1. Dockerのデータを保存するディレクトリを /home/docker-data に作成します。
   sudo mkdir /home/docker-data
  1. Dockerを停止します。
   sudo systemctl stop docker
  1. Dockerのデータディレクトリを /home/docker-data に移動します。
   sudo rsync -aqxP /var/lib/docker/ /home/docker-data
   sudo mv /var/lib/docker /var/lib/docker.bak
  1. /home/docker-data/var/lib/docker にシンボリックリンクとして設定します。
   sudo ln -s /home/docker-data /var/lib/docker
  1. Dockerを再起動します。
   sudo systemctl start docker
  1. 動作を確認し、問題がなければバックアップとして残していた元のディレクトリを削除します。
   sudo rm -rf /var/lib/docker.bak

以上の手順で、Dockerのデータ保存場所を移動し、rootパーティションの圧迫を回避することができます。

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