Dockerビルドを繰り返すとイメージがどんどん増えていきます。名無しのボリュームもどんどんと増えいつの間にかDockerのメモリや容量を圧迫している、、なんてことがあります。
これを簡単に解消する方法として、不要なデータをまとめて削除する方法とDockerの設定を変更してメモリやCPUの能力を増やす方法についてまとめています。
高速化のための便利コマンド一覧
Dockerはビルドしたりコンテナを起動するたびにデータが増えたりメモリを使用してどんどんと圧迫されていきます。
高速化のためにやるべきは不要なデータを削除することが先決です。
高速化でよく使う3つのコマンド
コマンド | 内容 |
---|---|
docker stop $(docker ps -q) | 起動中のコンテナを停止する |
docker container prune | コンテナを全て削除する |
docker image prune | イメージを全て削除する |
Dockerをクリーンにする時に使うコマンド
コマンド | 内容 |
---|---|
docker system prune –volumes -f | コンテナ、イメージ、ネットワーク、キャッシュ、ボリュームを全て削除する |
docker volume prune | ボリュームを全て削除する |
docker network prune | ネットワークを全て削除する |
それぞれのコマンドの詳細は以下で解説しています。
起動中のコンテナを停止する
起動中のコンテナがある場合、そのコンテナや関連するイメージやボリュームなどは消去できません。このため、まずはコンテナを全て停止します。
docker stop $(docker ps -q)
なお、-qオプションは–quietの省略形です。情報の全てではなく、コンテナIDのみを表示する時に使います。
$()とは?
$()
はシェルの機能の一つです。カッコの中のコマンドの実行結果を取得することができます。
バッククオート` `
で囲むのと同じです。($()
の方がやや高機能)
コンテナを全て削除する
コンテナを全て停止できたらコンテナを全て削除します。(dockerやdocker-composeファイルがあればコンテナは復活できます)
docker container prune
このコマンド1発で全ての停止中のコンテナを削除できる便利なコマンドです。
補足
全てのコンテナを削除するコマンドで次のような見かけるかもしれません。これらはdocker container prune
がなかった時に使われていたコマンドです。(今も使えますがやや冗長です)
docker rm $(docker ps -a -q)
コンテナを削除するdocker rm
コマンドの引数に全てのコンテナのID名を渡しています。
イメージを全て削除する
イメージを全て削除します。
docker image prune
このコマンド1発で全てのイメージを削除できる便利なコマンドです。
補足
全てのイメージを削除するコマンドで次のような見かけるかもしれません。これらはdocker image prune
がなかった時に使われていたコマンドです。(今も使えますが冗長です)
#例1
docker images --filter "dangling=true" -q | xargs docker rmi
#例2
docker rmi `docker images --fileter "dangling=true" -q`
#例3
docker rmi $(docker images --fileter "dangling=true" -q)
ボリュームを全て削除する
ボリュームを全て削除します。
docker volume prune
ネットワークを全て削除する
ネットワークを全て削除します。
ネットワークの削除コマンドもありますが、データ容量としてはほぼ何もない状態です。ネットワークをキレイにする時に使うぐらいです。
docker network prune
コンテナ、イメージ、ネットワーク、キャッシュ、ボリュームを全て削除する
停止中のコンテナ、イメージ、ネットワーク、キャッシュを全て削除する超便利コマンドがあります。
docker system prune --volumes -f
volumesオプションの必要性
Dockerの17.06.0以前はvolumesオプションなしでボリュームも削除されましたが、17.06.1以降はボリュームもセットで削除したい場合は–volumesオプションをつける必要があります。
fオプションの必要性
fオプションは--force
の省略形です。デフォルトでは実行前に本当に削除していいかの確認を聞かれます。これをいちいち表示させたくない場合に使います。
実例
$ docker system prune --volumes -f
(省略)
rrcm495z77gc8hpdhauksl61t
Total reclaimed space: 5.228GB
(参考)Docker Docs|使用していない Docker オブジェクトの削除(prune)
コマンドのショートカットを登録する(エイリアス)
起動中のコンテナを停止してから、データを一括削除するコマンドを入力するのは手間なので、エイリアスを設定しておくと便利です。
ここでは、2つの処理をエイリアスとして登録します。
- docker-stop :起動中のコンテナを全て停止する。
- docker-clean :起動中のコンテナを全て停止し、コンテナ、イメージ、ネットワーク、キャッシュ、ボリュームを全て削除する。
.bash_profileを開く
vimエディタを使って .bash_profile
を開きます。
$ vim ~/.bash_profile
エイリアスを追記する
以下の2行を追記します。
alias docker-stop='docker stop $(docker ps -q)'
alias docker-clean='docker stop $(docker ps -q) && docker system prune --volumes -f'
vimで記述するには i
をクリックすればインサートモードになります。
追記が完了したら escを押してインサートモードを抜けてから、:wq
を入力しenterをクリックします。
.bash_profileを読み込む
.bash_profileはbashを起動した時に自動ロードされますが、編集直後は変更を反映するために読み込む必要があります。
source ~/.bash_profile
正しく読み込まれたか確認します。
$ alias | grep docker-
alias docker-clean='docker stop $(docker ps -q) && docker system prune --volumes -f'
alias docker-stop='docker stop $(docker ps -q)'
コマンドの実行
コマンドを実行してみます。
$ docker-stop
8fa8c9522e27
89c71a3361f4
dc7b62295e33
0768763ddf1a
0570143aef24
819538f21ff2
4ec31794a884
e7a91cfed0d4
#起動中のコンテナを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
起動中のコンテナを全て停止することができました。
Dockerの設定を見直す
Dockerをクリーンにする以外に、Dockerに割り当てるリソースを増やすことで速度が改善することもあります。
Docker Desktopは自分で割り当てるメモリやハードの容量を指定することができます。
Docker Desktopのメニューの中に「Preferences」があります。これをクリックします。
その中にResourcesという項目があります。
一例として、以下のように割り当てておけば大抵のプロジェクトでは十分でしょう。