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?
6 answers
Pomocne może być również usunięcie "zwisających" obrazów
docker rmi $(docker images -f "dangling=true" -q)
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.
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 podpowiedziamidf
iprune
do zarządzania zasobami systemu, a także podpowiedziamidocker {container,image,volume,network} prune
#26108 #27525 / #27525
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
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.
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
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)
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