web-dev-qa-db-ja.com

ドッカーホストマシンをクリーンアップする方法

Docker image/container dockerを作成/デバッグすると、システムにあらゆる種類のアーティファクトが残るようです。 (ある時点で48画像の制限がありました)しかし、最後に見たときは20〜25画像でした。 docker images

したがって、包括的な質問は次のとおりです。

  • どのようにして適切にクリーンアップしますか?
  • 手動で画像を削除していたため、さらに到着し始めました。え?
  • どのくらいのディスク容量をホストに実際に割り当てる必要がありますか?
  • 実行中のデーモンは、次の再起動後に本当に再起動しますか?

とメタ質問...私が求めていない質問は何ですか?

25
Richard

「ぶら下がっている」画像を削除することも役立ちます

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

23
user2363318

Docker Hostを定期的に削除する方法は次のとおりです。

実行中のコンテナーを強制終了します。

docker kill $(docker ps -qa)

すべてのコンテナ(および関連するボリューム)を削除します。

docker rm -v $(docker ps -qa)

すべての画像を削除:

docker rmi $(docker images -q)

更新

実行されていないコンテナのみを削除します。 「ps」出力を解析して、「Exited」文字列を探します。

docker ps -a | awk '/Exited/ {print $1}' | xargs docker rm -v

完璧ではありません...コンテナに「Exited」という名前を付けないでください:-)

更新

Docker 1.9には、古いボリュームをパージするために使用できる新しいボリュームコマンドがあります

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

更新

Dockerの最新のコミュニティエディションに新しい「システムプルーン」コマンドが追加されました

docker system Prune --volumes

これにより、未使用のネットワークが削除され、停止したコンテナ、ダングリングイメージ、未使用のボリュームが削除されました。

35
Mark O'Connor

私はまた、バージョン1.13.0に追加されたいくつかのコマンドでこれに貢献したいと思います。

$ docker system Prune
$ docker container Prune
$ docker image Prune
$ docker volume Prune
$ docker network Prune

変更ログを参照: 1.13.0(2017-01-18)

新しく追加する docker systemコマンドとシステムリソース管理用のdfおよびPruneサブコマンド、およびdocker {container,image,volume,network} Pruneサブコマンド#26108#27525 /#27525

15
tgogos

私はVirtualBoxでdocker-machineを使用していますが、すべてのコンテナーとすべてのイメージを削除した後も、Docker VirtualBoxイメージは依然として何ギガバイトものディスク領域を消費しています。

また、ディスク領域をクリーンアップするには、Dockerマシンを削除して再作成すると役立ちます。例えば。:

docker-machine rm default
docker-machine create --driver virtualbox default
6
jox

更新:docker cliには組み込みフィルターがあり、特定の条件を満たすコンテナーを適切に表示できます。これらのbash関数は、コアメンテナの dotfiles から取得されます:

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}
del_stopped(){
    local name=$1
    local state=$(docker inspect --format "{{.State.Running}}" $name 2>/dev/null)

    if [[ "$state" == "false" ]]; then
        docker rm $name
    fi
}

元の回答

自分用に作成したヘルパースクリプト:

#!/bin/bash

# options:
# remove stopped containers and untagged images
#     $ dkcleanup
# remove all stopped|running containers and untagged images
#     $ dkcleanup --reset
# remove containers|images|tags matching {repository|image|repository\image|tag|image:tag}
# pattern and untagged images
#     $ dkcleanup --purge {image}
# everything
#     $ dkcleanup --nuclear

if [ "$1" == "--reset" ]; then
    # Remove all containers regardless of state
    docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
Elif [ "$1" == "--purge" ]; then
    # Attempt to remove running containers that are using the images we're trying to purge first.
    (docker rm -f $(docker ps -a | grep "$2/\|/$2 \| $2 \|:$2\|$2-\|$2:\|$2_" | awk '{print $1}') 2>/dev/null || echo "No containers using the \"$2\" image, continuing purge.") &&\
    # Remove all images matching arg given after "--purge"
    docker rmi $(docker images | grep "$2/\|/$2 \| $2 \|$2 \|$2-\|$2_" | awk '{print $3}') 2>/dev/null || echo "No images matching \"$2\" to purge."
else
    # This alternate only removes "stopped" containers
    docker rm -f $(docker ps -a | grep "Exited" | awk '{print $1}') 2>/dev/null || echo "No stopped containers to remove."
fi

if [ "$1" == "--nuclear" ]; then
    docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
    docker rmi $(docker images -q) 2>/dev/null || echo "No more images to remove."
else
    # Always remove untagged images
    docker rmi $(docker images | grep "<none>" | awk '{print $3}') 2>/dev/null || echo "No untagged images to delete."
fi

exit 0

ソース

あなたの質問に:

どのようにして適切にクリーンアップしますか?

まだ公式な方法はありませんが、上記のようなヘルパースクリプトと関数のみです。

私が手動で画像を削除していたので、さらに到着し始めました。え?

他の画像の上に構築された画像を削除しようとしたときに、「タグ付けされていない」画像が削除された可能性があります。

どのくらいのディスク容量をホストに実際に割り当てる必要がありますか?

使用する予定の画像の種類によって異なります。 500 mbのイメージを複数回実行しても、(500 mb Xコンテナーの数)スペースは使用されないことに注意してください。コンテナーは同じイメージを再利用し、上で実行するときに変更したものを追加します。したがって、ストレージに関するコンテナーランタイムの観点ではなく、イメージの保存の観点から考えてください。

次の再起動後、実行中のデーモンは本当に再起動しますか?

デフォルトでは、ホストが再起動すると停止します。ホストの再起動時に自動的に再起動するには、docker run --restart=Trueで実行する必要があります。

4
brianclements

ステータスが表示されないこともありますが、空白になります。

これが私のバージョンです:

docker rm -f $(docker ps -a | env -i grep -v Up | tail -n+2 | cut -d ' ' -f 1)
1
metakungfu