Czy powinienem obawiać się nadmiarowych, niedziałających kontenerów platformy Docker?

142

Każde docker runpolecenie lub każde RUNpolecenie w pliku Dockerfile tworzy kontener. Jeśli kontener nie jest już uruchomiony, nadal można go zobaczyć za pomocą docker ps -a.

Czy powinienem się martwić posiadaniem ogromnej listy niedziałających kontenerów? Czy powinienem wydawać docker rmna niedziałających kontenerach?

Nie mam pewności, jakie kary za wydajność lub pamięć / pamięć masową ponoszą te niedziałające kontenery.

velo9
źródło
1
docker execKomendy został dodany jakiś czas temu, patrz docs.docker.com/reference/commandline/cli/#exec - będzie wykonać polecenie od uruchomionego kontenera.
schmunk
Do Twojej wiadomości, jeśli chcesz zobaczyć, jak usunąć stare pojemniki, zobacz to pytanie: stackoverflow.com/questions/17236796/…
Ryan Walls
1
@schmunk Link został przeniesiony. docs.docker.com/engine/reference/commandline/exec
akauppi,

Odpowiedzi:

72

Kontenery, które nie są uruchomione, nie zajmują żadnych zasobów systemowych poza miejscem na dysku.

Zwykle dobrze jest posprzątać po sobie, ale jeśli siedzi się ich dużo, nie powinno to wcale spowalniać wydajności.

Jeśli zauważysz spowolnienie podczas uruchamiania poleceń dockera z wieloma zatrzymanymi kontenerami, może to oznaczać błąd w dockerze i powinieneś zgłosić błąd.

Ken Cochrane
źródło
1
Dokumentacja RUNpolecenia została teraz przeniesiona do: docs.docker.io/en/latest/reference/builder/#run
aculich
63

docker runDokumentacja opisuje, jak automatycznie oczyścić zbiornik i usunąć z systemu plików Po wyjściu kontenerów:

  --rm=false: Automatically remove the container when it exits (incompatible with -d)

Z powyższego wynika, że ​​domyślnie kontenery nie są usuwane, ale dodanie --rm=truelub tylko krótka ręka --rmbędzie działać tak:

sudo docker run -i -t --rm ubuntu /bin/bash

Po wyjściu z kontenera zostanie on automatycznie usunięty.

Możesz to sprawdzić, wyświetlając kontenery Dockera w jednym oknie terminala:

watch -n1 'sudo ls -c /var/lib/docker/containers'

Następnie w innym oknie uruchom to polecenie, aby uruchomić wiele kontenerów docker, które zostaną automatycznie zamknięte po uśpieniu przez maksymalnie 10 sekund.

for i in {1..10}; do sudo docker run --rm ubuntu /bin/sleep $i & done
aculich
źródło
4
Nie jest to bezpośrednia odpowiedź na pytanie , ale interesująca odpowiedź, która da użytkownikom pewien wgląd w mechanizmy stojące za dockerem. Dzięki!
thaJeztah
3
-rmjest przestarzały i zostanie kiedyś usunięty, użyj --rmzamiast niego.
bain
5

Jeśli uruchamiasz kontener z woluminem i nie używasz docker rm -v do jego usunięcia, to wolumin nie jest usuwany po usunięciu kontenera. Występuje również problem ze sterownikiem pamięci masowej vfs. Jeśli zapomnisz wyczyścić, woluminy zajmą miejsce na dysku.

zergood
źródło
2

Nie mam pewności, jakie kary za wydajność lub pamięć / pamięć masową ponoszą te niedziałające kontenery.

Aby ocenić, ile magazynu używają niedziałające kontenery platformy Docker, możesz uruchomić:

docker ps --size --filter "status=exited"

Równoważnie możesz uruchomić:docker container ls --filter "status=exited"

Możesz także użyć polecenia docker system df(wprowadzonego w Docker 1.13.0, styczeń 2017), aby zobaczyć użycie dysku dockera, np .:

username@server:~$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              44                  28                  114.7GB             84.84GB (73%)
Containers          86                  7                   62.43GB             41.67GB (66%)
Local Volumes       2                   1                   0B                  0B
Build Cache                                                 0B                  0B
Franck Dernoncourt
źródło