Warum verbraucht das Docker-Image meinen Speicherplatz, der nicht vom Docker verwendet wird?

80

Ich habe Docker eingerichtet und ein völlig anderes Blockgerät zum Speichern der Systemdaten von Docker verwendet:

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

Beachten Sie, dass /disk/1eine völlig andere Festplatte verwendet wird/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

Das Problem ist, dass, wenn ich weiterhin Docker-Images herunterlade und Docker-Container ausführe, anscheinend auch die andere Festplatte belegt /dev/xvda1ist.

Ich kann dieses Problem überprüfen, indem ich einige Docker-Images entferne. Nachdem ich einige Docker-Bilder entfernt habe, /dev/xvda1ist jetzt etwas mehr Platz vorhanden.

Vermisse ich etwas

Meine Docker-Version:

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09
ming.kernel
quelle
können Sie einfdisk -l
user2915097

Antworten:

63

Es handelt sich um ein Kernelproblem mit Devicemapper, das die RedHat-Betriebssystemfamilie (RedHat, Fedora, CentOS und Amazon Linux) betrifft. Gelöschte Container geben keinen zugeordneten Speicherplatz frei. Dies bedeutet, dass auf den betroffenen Betriebssystemen beim Starten und Neustarten von Containern langsam der Speicherplatz ausgeht.

Das Docker-Projekt ist sich dessen bewusst, und der Kernel soll im Upstream repariert sein ( https://github.com/docker/docker/issues/3182 ).

Eine Art Umgehung besteht darin, Docker ein eigenes Volume zum Schreiben zu geben ( "Wenn Docker Speicherplatz verbraucht" ). Dies hindert es nicht daran, Platz zu essen, sondern daran, andere Teile Ihres Systems herunterzufahren, nachdem dies geschehen ist.

Meine Lösung bestand darin, Docker zu deinstallieren, dann alle seine Dateien zu löschen und dann neu zu installieren:

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

Dies hat meinen Platz zurückbekommen, aber es ist nicht viel anders als nur eine Ersatzinstanz zu starten. Ich habe keine schönere Lösung gefunden.

Nathaniel Waisbrot
quelle
19
Ich habe gerade das Gleiche durchgemacht und Sie müssen Docker nicht deinstallieren. Alles, was ich tun musste, war Docker zu stoppen, das Verzeichnis zu löschen und dann Docker zu starten.
Blockchiffre
2
Welches Verzeichnis? / var / lib / docker? Wenn ich das mache, verliere ich mein Image. Wenn ich versuche, das Bild zuerst in einer .tar-Datei zu speichern, schlägt dies ebenfalls fehl: Fehler beim Mounten '/ dev / mapper / docker-202: ... Eingabe- / Ausgabefehler
Toby
5
@Toby ja /var/lib/docker, wodurch alle Ihre Bilder und Container gelöscht werden. Sie setzen Docker hart zurück, erwarten Sie also nicht, dass Sie alle Ihre Daten speichern können.
Nathaniel Waisbrot
57

Das Löschen meines gesamten / var / lib / docker ist für mich nicht in Ordnung. Dies sind sicherere Wege:

Lösung 1:

Die folgenden Befehle aus dem Problem machen den Speicherplatz für mich frei und es ist viel sicherer als das Löschen von / var / lib / docker oder für Windows, um den Speicherort Ihres Disk-Images hier zu überprüfen .

Vor:

docker info

Beispielausgabe:

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

Befehl in neueren Versionen von Docker, zB 17.x +

docker system prune -a

Es wird eine Warnung angezeigt, dass alle gestoppten Container, Netzwerke, Images und Build-Caches entfernt werden. Im Allgemeinen ist es sicher, dies zu entfernen. (Wenn Sie das nächste Mal einen Container ausführen, wird dieser möglicherweise aus der Docker-Registrierung abgerufen.)

Beispielausgabe:

Total reclaimed space: 1.243GB

Sie können dann die Docker-Informationen erneut ausführen, um zu sehen, was bereinigt wurde

docker info

Lösung 2:

Stellen Sie außerdem sicher, dass Ihre Programme im Docker-Container nicht viele / große Dateien in das Dateisystem schreiben.

Überprüfen Sie die Speicherplatznutzungsgröße Ihres laufenden Docker-Prozesses

docker ps -s #may take minutes to return

oder für alle Container, auch verlassen

docker ps -as #may take minutes to return

Sie können dann die fehlerhaften Container löschen

docker rm <CONTAINER ID>

Finden Sie den möglichen Schuldigen, der möglicherweise Gigs of Space verwendet

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

In meinem Fall schrieb das Programm Auftritte von temporären Dateien.

( Nathaniel Waisbrot hat in der akzeptierten Antwort auf dieses Problem erwähnt und ich habe einige Informationen aus dem Problem erhalten.)


ODER

Befehle in älteren Versionen von Docker, z. B. 1.13.x (als root und nicht als sudo ausgeführt):

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

Nach :

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB
rjdkolb
quelle
2
docker system prune --forceist definitiv die sicherste Option, die ich von den Antworten gesehen habe. Ich hatte keinen Platz mehr auf meiner Maschine. Habe beschnitten und ich habe jetzt 50 GB frei ... wünschte, ich hätte das früher
gewusst
3
Die Up-Votes zu dieser Antwort zeigen, dass die Leute sie nützlich finden. Um ganz klar zu sein, beantwortet dies die etwas andere Frage: "Wie kann ich den von Docker verwendeten Speicherplatz zurückgewinnen?" Während die Frage lautete, dass pruneDocker
Speicherplatz verbraucht,
6

Verschieben Sie das /var/lib/dockerVerzeichnis.

Angenommen, das /dataVerzeichnis hat genügend Speicherplatz. Wenn nicht, ersetzen Sie eines, das dies tut.

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

Auf diese Weise müssen Sie Docker nicht neu konfigurieren.

Ajay Sharma
quelle
5

Ich hatte ein ähnliches Problem und ich denke, dies passiert, wenn Sie nicht genügend Speicherplatz auf der Festplatte für alle Ihre Docker-Images haben. Ich hatte 6 GB für Docker-Bilder reserviert, was sich in meinem Fall als nicht ausreichend herausstellte. Wie auch immer, ich hatte jedes Bild und jeden Container entfernt und die Festplatte sah immer noch voll aus. Der größte Teil des Speicherplatzes wurde von / var / lib / docker / devicemapper und / var / lib / docker / tmp verwendet.

Dieser Befehl hat bei mir nicht funktioniert:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

Zuerst habe ich den Docker-Dienst gestoppt:

sudo service docker stop

Dann habe ich / var / lib / docker gelöscht:

Dann habe ich getan, was jemand hier in https://github.com/docker/docker/issues/18867#issuecomment-232301073 vorgeschlagen hat

  • Entfernen Sie die vorhandene Instanz der Docker-Metadaten rm -rf / var / lib / docker

    sudo rm -rf / var / lib / docker

  • Übergeben Sie die folgenden Optionen an den Docker-Daemon: -s Devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = verwerfen

  • Starten Sie den Docker-Daemon.

Für die letzten beiden Schritte laufe ich:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
Rodolk
quelle
5

Hatte das gleiche Problem. In meinem Szenario ging meiner vbox der Speicherplatz aus. Nach einer Untersuchung stellte sich heraus, dass meine lokalen Docker-Volumes 30 GB aufzehrten. Ubuntu 16.04 Host.

Um deine herauszufinden.

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

Dadurch wird Speicherplatz für nicht verwendete lokale Volumes freigegeben. In meinem Szenario wurden 20 GB Speicherplatz freigegeben. Stellen Sie sicher, dass die Container, die Sie behalten möchten, ausgeführt werden , bevor Sie dies tun, wenn Sie sie behalten möchten, da dadurch alle gestoppten Container entfernt werden.

BearOakheart
quelle
Dies beantwortet nicht direkt die ursprüngliche Frage, ist jedoch in einem ähnlichen Szenario nützlich.
BearOakheart
4

Docker Prune entfernt standardmäßig keine Volumes.

Sie können so etwas versuchen

docker volume prune -f
Nirbhay Shah
quelle
Docker System Prune - Volumes funktioniert einwandfrei. Früher war es - Volumen, jetzt ist es - Volumen.
Zeb Davis
5
docker system prune --all --volumes
David Portabella
3

Wie in Ausgabe # 18867 erwähnt - Daten in einem Container löschen Devicemapper kann nicht genutzten Speicherplatz freigeben von Github.com freigeben

Versuchen Sie, den folgenden Befehl auszuführen:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

Es verwendet das fstrimTool, um die dünn bereitgestellte Devicemapper-Festplatte zu trimmen.

Jiang Jun
quelle
Das hat bei mir funktioniert. Wahrscheinlich, weil Devicemapper im Loop-Modus verwendet wird.
Zeroimpl
0

Vielleicht können Sie versuchen docker system prune, alle Bilder zu entfernen, die nicht wichtig sind

Max
quelle
-1

Ja, Docker verwendet den Ordner / var / lib / docker, um die Ebenen zu speichern. Es gibt Möglichkeiten, den Speicherplatz zurückzugewinnen und den Speicher in ein anderes Verzeichnis zu verschieben.

Sie können einen größeren Speicherplatz bereitstellen und den Inhalt von / var / lib / docker an den neuen Speicherort verschieben und einen Sym-Link erstellen.

Es gibt detaillierte Erklärungen zur obigen Aufgabe.

http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

Sie können auch die Zwischenschichten entfernen.

https://github.com/vishalvsh1/docker-image-cleanup

Vishal Sahasrabuddhe
quelle