Ich habe einige Docker-Container unter AWS EC2 ausgeführt. Der Ordner / var / lib / docker / overlay2 wächst sehr schnell.
Ich frage mich, ob es sicher ist, seinen Inhalt zu löschen? oder wenn Docker einen Befehl hat, um die Festplattennutzung freizugeben.
AKTUALISIEREN:
Ich habe es tatsächlich docker system prune -a
schon versucht , was 0 KB zurückforderte.
Auch meine / docker / overlay2-Festplattengröße ist viel größer als die Ausgabe von docker system df
Nachdem ich die Docker-Dokumentation und die Antwort von BMitch gelesen habe, halte ich es für eine dumme Idee, diesen Ordner zu berühren, und ich werde andere Möglichkeiten ausprobieren, um meinen Speicherplatz zurückzugewinnen.
docker
docker-compose
docker-machine
qichao_he
quelle
quelle
docker image prune --all
und danndocker system prune -a
. Es hat meinen Speicherplatz um ca. 50 GB zurückgewonnen, der von Dateien unter / var / lib / docker / overlay2 belegt wurde. Aberdocker system prune -a
wäre genug gewesen. Auch meine Konfiguration Besonderheiten sind:OS: Ubuntu 20
,Docker : 19.03.12
Antworten:
Docker verwendet / var / lib / docker, um Ihre Bilder, Container und lokal benannten Volumes zu speichern. Das Löschen kann zu Datenverlust führen und möglicherweise den Motor am Laufen halten. Das Unterverzeichnis overlay2 enthält speziell die verschiedenen Dateisystemebenen für Bilder und Container.
Informationen zum Bereinigen nicht verwendeter Container und Bilder finden Sie unter
docker system prune
. Es gibt auch Optionen zum Entfernen von Volumes und sogar mit Tags versehenen Bildern, die jedoch aufgrund der Möglichkeit eines Datenverlusts nicht standardmäßig aktiviert sind.quelle
docker system prune -a
, wodurch 0 KB Speicherplatz wiederhergestellt wurden. Im Moment ist der Fall für mich, dass / docker / overlay2 viel größer ist als die Ausgabe vondocker system df
. Das ist der Grund, warum ich dieses Problem immer wieder ausgrabe. Nochmals vielen Dank für Ihre Antwort, Sir. Ich denke, ich muss mehr über die Docker-Dokumentation lesen oder den Docker wahrscheinlich vollständig löschen und neu starten. Ich habe nur eine Postgres-Datenbank, die ich behalten muss, und ich habe sie gemountet/var/lib/docker
anstatt ein einzelnes Unterverzeichnis, das es in einem inkonsistenten Zustand belassen würde .Ich fand, dass dies für mich am besten funktionierte:
Standardmäßig entfernt Docker benannte Bilder nicht, auch wenn sie nicht verwendet werden. Dieser Befehl entfernt nicht verwendete Bilder.
Beachten Sie, dass jede Ebene in einem Bild ein Ordner innerhalb des
/usr/lib/docker/overlay2/
Ordners ist.quelle
docker system df
gezeigt wird (Sie haben möglicherweise immer noch keinen Platz mehr und diese böseoverlay2
Müllkippe muss manuell zerstört werden.Ich hatte dieses Problem ... Es war das Protokoll, das riesig war. Protokolle sind hier:
Sie können dies in der Befehlszeile run oder in der Erstellungsdatei verwalten. Siehe dort: Konfigurieren Sie die Protokollierungstreiber
Ich persönlich habe diese 3 Zeilen zu meiner Datei docker-compose.yml hinzugefügt:
quelle
overlay2
. In meinem Fall betrug die Gesamtkapazität für/var/lib/docker
50 GB und 36 GB davon wurden von einer Datei verbraucht :/var/lib/docker/overlay2/<container id>/diff/var/log/faillog
. Unter der Annahme, dass diese Datei nicht von zentraler Bedeutung ist, um alles am Laufen zu halten, besteht mein kurzfristiger Hack darin, sie einfach zu entfernen (und vielleicht werde ich auch meine anpassendocker-compose
).hatte auch Probleme mit schnell wachsenden
overlay2
/var/lib/docker/overlay2
- ist ein Ordner, in dem Docker beschreibbare Ebenen für Ihren Container speichert.docker system prune -a
- funktioniert möglicherweise nur, wenn der Behälter angehalten und entfernt wird.In meinem konnte ich herausfinden, was Platz verbraucht, indem ich
overlay2
nachforschte.Dieser Ordner enthält andere Ordner mit Hash-Namen. Jeder von diesen hat mehrere Ordner einschließlich
diff
Ordner.diff
Ordner - enthält den tatsächlichen Unterschied, der von einem Container mit der genauen Ordnerstruktur als Container geschrieben wurde (zumindest in meinem Fall - Ubuntu 18 ...)Also habe ich immer
du -hsc /var/lib/docker/overlay2/LONGHASHHHHHHH/diff/tmp
herausgefunden, dass sich/tmp
in meinem Container der Ordner befindet, der verschmutzt wird .Als Problemumgehung habe ich
-v /tmp/container-data/tmp:/tmp
Parameter für dendocker run
Befehl verwendet, um den inneren/tmp
Ordner dem Host zuzuordnen und einen Cron auf dem Host einzurichten, um diesen Ordner zu bereinigen.Die Cron-Aufgabe war einfach:
sudo nano /etc/crontab
*/30 * * * * root rm -rf /tmp/container-data/tmp/*
save and exit
HINWEIS:
overlay2
ist ein System-Docker-Ordner und kann jederzeit geändert werden. Alles oben basiert auf dem, was ich dort gesehen habe. Musste nur in die Docker-Ordnerstruktur gehen, weil das System keinen Platz mehr hatte und ich nicht einmal in den Docker-Container ssh konnte.quelle
/var/log/apache2/error.log
. Ich setze error.log und access.log zurück und füge ein neues Volume hinzu, um die einfachste Verwaltung zu ermöglichenHintergrund
Die Schuld für das Problem kann zwischen unserer Fehlkonfiguration von Containervolumes und einem Problem mit Docker-Lecks (die nicht freigegeben werden) temporärer Daten, die auf diese Volumes geschrieben wurden, aufgeteilt werden. Wir sollten alle temporären / logs / Scratch-Ordner unseres Containers (entweder Host-Ordnern oder anderen dauerhaften Speicheransprüchen) zuordnen, in denen unsere Apps häufig und / oder stark schreiben. Docker übernimmt keine Verantwortung für die Bereinigung aller automatisch erstellten sogenannten EmptyDirs, die sich standardmäßig in befinden
/var/lib/docker/overlay2/*/diff/*
. Der Inhalt dieser "nicht persistenten" Ordner sollte nach dem Stoppen des Containers automatisch vom Docker gelöscht werden, ist dies aber anscheinend nicht (es kann sogar unmöglich sein, ihn von der Hostseite zu löschen, wenn der Container noch ausgeführt wird - und er kann monatelang ausgeführt werden zu einem Zeitpunkt).Problemumgehung
Eine Problemumgehung erfordert eine sorgfältige manuelle Bereinigung, und obwohl sie bereits an anderer Stelle beschrieben wurde, finden Sie möglicherweise noch einige Hinweise aus meiner Fallstudie, die ich so lehrreich und verallgemeinerbar wie möglich zu gestalten versuchte.
Was also passiert ist, ist, dass die Täter-App (in meinem Fall
clair-scanner
) es geschafft hat, über einige Monate Hunderte von Datenmengen in den/diff/tmp
Unterordner von Docker zu schreibenoverlay2
Da alle diese Unterordner
/diff/tmp
ziemlich selbsterklärend waren (alle hatten die Formclair-scanner-*
und veraltete Erstellungsdaten), stoppte ich den zugehörigen Container (docker stop clair
) und entfernte diese veralteten Unterordnerdiff/tmp
vorsichtig aus , wobei ich vorsichtig mit einem einzigen (ältesten) begann, und Testen der Auswirkungen auf die Docker-Engine (für die ein Neustart [systemctl restart docker
] erforderlich war , um Speicherplatz zurückzugewinnen):Ich habe Hunderte von GB Speicherplatz zurückgefordert, ohne Docker neu installieren oder die gesamten Ordner löschen zu müssen. Alle ausgeführten Container mussten an einem Punkt gestoppt werden, da ein Neustart des Docker-Daemons erforderlich war, um Speicherplatz zurückzugewinnen. Stellen Sie daher zunächst sicher, dass Ihre Failover-Container auf einem / anderen Knoten ordnungsgemäß ausgeführt werden. Ich wünschte jedoch, dass der
docker prune
Befehl auch die veralteten/diff/tmp
(oder sogar/diff/*
) Daten abdecken könnte (über einen weiteren Schalter).Es ist jetzt eine 3 Jahre alte Ausgabe. Sie können die reichhaltige und farbenfrohe Geschichte in Docker-Foren lesen, in denen 2019 eine Variante vorgeschlagen wurde, die auf Anwendungsprotokolle der oben genannten Lösung abzielt und anscheinend in mehreren Setups funktioniert hat: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604
quelle
WARNUNG: NICHT IN EINEM PRODUKTIONSSYSTEM VERWENDEN
Ok, versuchen wir zuerst, das System zu beschneiden
Nicht so toll, scheint ein paar Megabyte aufgeräumt zu haben. Lass uns jetzt verrückt werden:
Nett! Denken Sie daran, dass dies nur auf einem Wegwerfserver empfohlen wird. Zu diesem Zeitpunkt kann die interne Datenbank von Docker keine dieser Überlagerungen finden, was zu unbeabsichtigten Konsequenzen führen kann.
quelle
/var/lib/docker
Verzeichnisses (während der Dämon gestoppt ist und angenommen wird, dass das Verzeichnis keine speziellen Dateisystem-Mounts oder ähnliches enthält) ist in der Tat eine gültige schnelle und schmutzige Methode, um zum ersten Punkt zurückzukehren. Ich bin mir nicht sicher, warum du all die Downvotes bekommst. Docker versucht, sich selbst zu heilen, und erkennt, wenn alle Hoffnung verloren ist, und initialisiert das/var/lib/docker
Verzeichnis nach Bedarf neu.TUN SIE DAS NICHT IN DER PRODUKTION
Die Antwort von @ ravi-luthra funktioniert technisch, hat aber einige Probleme!
In meinem Fall habe ich nur versucht, Speicherplatz wiederherzustellen. Der
lib/docker/overlay
Ordner benötigte 30 GB Speicherplatz und ich führe nur wenige Container regelmäßig aus. Anscheinend hat Docker ein Problem mit Datenlecks und einige der temporären Daten werden nicht gelöscht, wenn der Container stoppt.Also habe ich den gesamten Inhalt des
lib/docker/overlay
Ordners gelöscht . Danach wurde meine Docker-Instanz nicht mehr verwendbar. Als ich versuchte, einen Container auszuführen oder zu erstellen, gab es diesen Fehler:Dann habe ich dieses Problem mit einigem Ausprobieren durch Ausführen gelöst
(WARNUNG: Dadurch werden alle Ihre Daten in Docker-Volumes gelöscht.)
Es wird daher nicht empfohlen, solche schmutzigen Aufräumarbeiten durchzuführen, es sei denn, Sie verstehen vollständig, wie das System funktioniert.
quelle
Alles in / var / lib / docker sind Dateisysteme von Containern. Wenn Sie alle Ihre Container anhalten und sie beschneiden, sollte der Ordner leer sein. Sie wollen das wahrscheinlich nicht wirklich, also löschen Sie die Inhalte dort nicht zufällig. Löschen Sie keine Dinge in / var / lib / docker direkt. Sie können manchmal damit durchkommen, aber es ist aus so vielen Gründen nicht ratsam.
Tun Sie dies stattdessen:
Was Sie sehen werden, sind die größten Dateien, die unten angezeigt werden. Wenn Sie möchten, finden Sie heraus, in welchen Containern sich diese Dateien befinden, geben Sie diese Container ein
docker exec -ti containername -- /bin/sh
und löschen Sie einige Dateien.Sie können auch
docker system prune -a -f
einen täglichen / wöchentlichen Cron-Job ausführen, solange Sie keine gestoppten Container und Volumina in der Nähe lassen, die Ihnen wichtig sind. Es ist besser, die Gründe für das Wachstum herauszufinden und sie auf Containerebene zu korrigieren.quelle
Ich hatte kürzlich ein ähnliches Problem, Overlay2 wurde immer größer, aber ich konnte nicht herausfinden, was den größten Teil des Speicherplatzes beanspruchte.
df
zeigte mir, dass Overlay2 etwa 24 GB groß war.Mit
du
versuchte ich herauszufinden, was den Raum einnahm ... und scheiterte.Der Unterschied ergab sich aus der Tatsache, dass gelöschte Dateien (in meinem Fall meistens Protokolldateien) noch von einem Prozess (Docker) verwendet wurden. Daher wird die Datei nicht mit angezeigt,
du
sondern der Speicherplatz , mit dem sie belegt istdf
.Ein Neustart des Host-Computers hat geholfen. Ein Neustart des Docker-Containers hätte wahrscheinlich schon geholfen ... Dieser Artikel auf linuxquestions.org hat mir geholfen, das herauszufinden.
quelle
Hinzufügen zu dem obigen Kommentar, in dem Leute vorschlagen, das System wie klar baumelnde Volumes, Bilder, Exit-Container usw. zu beschneiden. Manchmal wurde Ihre App zum Schuldigen, sie erzeugte in kurzer Zeit zu viele Protokolle und wenn Sie ein leeres Directy-Volume (lokale Volumes) verwenden ) dies füllt die / var Partitionen. In diesem Fall fand ich den folgenden Befehl sehr interessant, um herauszufinden, was Speicherplatz auf meiner / var-Partitionsfestplatte verbraucht.
du -ahx / var / lib | sort -rh | Kopf -n 30
Dieser Befehl listet die Top 30 auf, die den meisten Speicherplatz auf einer einzelnen Festplatte beanspruchen. Wenn Sie mit Ihren Containern externen Speicher verwenden, nimmt die Ausführung des Befehls viel Zeit in Anspruch. Dieser Befehl zählt keine Mount-Volumes. Und ist viel schneller. Sie erhalten die genauen Verzeichnisse / Dateien, die Speicherplatz beanspruchen. Dann können Sie in diese Verzeichnisse gehen und prüfen, welche Dateien nützlich sind oder nicht. Wenn diese Dateien erforderlich sind, können Sie sie in einen dauerhaften Speicher verschieben, indem Sie in der App Änderungen vornehmen, um den dauerhaften Speicher für diesen Speicherort zu verwenden, oder den Speicherort dieser Dateien ändern. Und zur Ruhe können Sie sie löschen.
quelle
Ich habe "Docker System Prune -a" verwendet, um alle Dateien unter Volumes und Overlay2 zu bereinigen
quelle