jak wyczyścić maszynę hosta docker

Podczas tworzenia / debugowania Docker image / container docker wydaje się pozostawiać różnego rodzaju artefakty w moim systemie. (w pewnym momencie był limit 48 zdjęć), ale ostatnim razem patrzyłem tam było 20-25 zdjęć; docker images.

Więc nadrzędne pytania to:

    Jak prawidłowo sprzątać?
  • gdy ręcznie usuwałem obrazy, zaczęło przybywać więcej. co?
  • ile miejsca na dysku powinienem przeznaczyć na host?
  • czy uruchomione demony naprawdę się zrestartują po następnym restarcie?

I pytanie meta... jakich pytań nie zadałem?

Author: Richard, 2014-04-21

6 answers

Pomocne może być również usunięcie "zwisających" obrazów

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

 21
Author: user2363318,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 18:24:03

Oto jak okresowo oczyszczam mojego hosta Dockera:

Zabij uruchomione kontenery:

docker kill $(docker ps -qa)

Usuń wszystkie kontenery (i powiązane z nimi objętości):

docker rm -v $(docker ps -qa)

Usuń wszystkie obrazy:

docker rmi $(docker images -q)

Update

Usuń tylko kontenery, które nie są uruchomione. Analizuje wyjście "ps" dla łańcucha "Exited":

docker ps -a | awk '/Exited/ {print $1}' | xargs docker rm -v
Nie idealnie... Nie podawaj swojemu kontenerowi nazwy "Exited": -)

Update

Docker 1.9 ma nowe polecenie volume, które można wykorzystać aby oczyścić stare tomy

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

Update

Najnowsza wersja społeczności Dockera ma nowe polecenie "system prune"

docker system prune --volumes

To wyczyściło nieużywane sieci, zatrzymało kontenery, zwisające obrazy i wszelkie nieużywane woluminy.

 32
Author: Mark O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 16:00:31

Chciałbym również przyczynić się do tego kilkoma poleceniami, które zostały dodane do wersji 1.13.0:

$ docker system prune
$ docker container prune
$ docker image prune
$ docker volume prune
$ docker network prune

Zobacz changelog: 1.13.0 (2017-01-18)

Dodaj nowe polecenie docker system z podpowiedziami df i prune do zarządzania zasobami systemu, a także podpowiedziami docker {container,image,volume,network} prune#26108 #27525 / #27525

 14
Author: tgogos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-05 20:26:52

Aktualizacja: W docker cli są wbudowane filtry, które umożliwiają prawidłowe wyświetlanie kontenerów spełniających określone kryteria. Te funkcje bash są pobierane z jednego z głównych opiekunów 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
}

Oryginalna Odpowiedź

Skrypt pomocniczy, który stworzyłem na własny użytek:

#!/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

Źródło

Na twoje pytania:

Jak prawidłowo sprzątać?

No official way yet, just helper skrypty i funkcje jak wyżej.

Gdy ręcznie usuwałem obrazy, zaczęło przybywać więcej. co?

Możesz usuwać obrazy, które zostały zbudowane na innych, które stały się" untagged", gdy próbowałeś je usunąć.

Ile miejsca na dysku powinienem przeznaczyć na host?

Zależy od typów obrazów, które planujesz użyć. Wiedz, że wielokrotne uruchamianie obrazu 500 mb nie jest potrzebne (500 MB X liczba kontenerów) miejsce. Kontenery ponownie używają tego samego obrazu i po prostu dodają to, co zmieniają podczas pracy na górze. Pomyśl więc z perspektywy przechowywania obrazu, a nie środowiska wykonawczego kontenera w odniesieniu do pamięci masowej.

Czy uruchomione demony naprawdę uruchomią się ponownie po następnym restarcie?

Domyślnie są one zatrzymywane po ponownym uruchomieniu hosta. Musisz uruchomić z docker run --restart=True, aby automatycznie uruchomić ponownie po ponownym uruchomieniu hosta.

 4
Author: brianclements,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 22:58:15

Używam docker-machine z VirtualBox i po usunięciu wszystkich kontenerów i wszystkich obrazów, obraz Docker VirtualBox nadal pochłania wiele gigabajtów miejsca na dysku.

Aby wyczyścić miejsce na dysku, pomaga usunąć i ponownie utworzyć maszynę dokującą. Np.:

docker-machine rm default
docker-machine create --driver virtualbox default
 4
Author: jox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-21 21:53:22

Czasami nie będziesz miał statusu, to będzie po prostu puste.

Oto moja wersja:

docker rm -f $(docker ps -a | env -i grep -v Up | tail -n+2 | cut -d ' ' -f 1)
 1
Author: metakungfu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-21 20:45:56