Docker verwendet zwei Arten von Formaten, um laufende Prozesse darzustellen – Bilder und Container, und beide speichern Daten auf dem Laufwerk Ihres Computers. Wir werden über die Befehle sprechen, die Docker für den Umgang mit Daten bereitstellt, und wie Sie sie verwenden können, um auf Image- und Containerdateien zuzugreifen.
Der Unterschied zwischen Bildern und Containern
Images sind das, was Sie erstellen, wenn Sie docker build
ausführen; Sie werden in einer Containerregistrierung wie dem Docker Hub gespeichert und enthalten alle Dateien und den Code zum Ausführen einer App. Sie können sie sich wie ISO-Dateien für das Betriebssystem einer virtuellen Maschine vorstellen.
Container werden aus Images erstellt und sind wie die eigentliche virtuelle Maschine, auf der die Anwendung ausgeführt wird. Möglicherweise haben Sie mehrere Container, die parallel von demselben Image ausgeführt werden. Jeder Container hat sein eigenes Dateisystem, das optional mit „Volume Mounts“ erstellt wird, die Daten vom Host an den Container binden.
Arbeiten mit Docker-Image-Speicher
Bilder speichern den gesamten Inhalt des Bildes auf Ihrem Laufwerk. Jedes Mal, wenn Sie ein Bild aus dem Internet ziehen, wird es heruntergeladen und gespeichert, normalerweise für immer. Bilder können sehr groß sein, sodass sich dies im Laufe der Zeit summieren kann, insbesondere bei Laptops mit begrenztem Speicherplatz.
Wenn Sie direkt auf die Bilddaten zugreifen möchten, werden diese normalerweise an folgenden Orten gespeichert:
- Linux:
/var/lib/docker/
- Windows:
C:ProgramDataDockerDesktop
- macOS:
~/Library/Containers/com.docker.docker/Data/vms/0/
Das Anfassen dieser Daten ist jedoch wahrscheinlich eine schlechte Idee . Der Speicher von Docker ist kompliziert und variiert tatsächlich stark, je nachdem, welcher Speichertreiber verwendet wird. Linux verwendet jetzt standardmäßig overlay2
auf den meisten Distributionen, die für die meisten Endbenutzer nicht einmal zugänglich ist. Hiermit herumzuspielen kann zu Datenverlust führen.
Stattdessen stellt Docker verwaltete Befehle zum Umgang mit Images bereit. Sie können alle Versionen heruntergeladener Bilder mit einem einfachen Befehl anzeigen:
docker image ls
Glücklicherweise ist es nicht so schlimm, wie es aussieht, da Docker-Images Versionen inkrementell speichern. Das bedeutet, dass beim Herunterladen einer neuen Version nur die geänderten Teile ersetzt werden. Wenn Sie häufig dasselbe Bild immer und immer wieder verwenden, werden Sie wahrscheinlich nicht zu viele Speicherkosten verursachen.
Wenn Sie jedoch viele verschiedene Bilder verwenden, haben Sie möglicherweise viele Bilder gespeichert, die nicht einmal mehr verwendet werden. Um diese zu bereinigen, bietet Docker einen integrierten Befehl zum Ausführen der Garbage Collection. Dadurch werden alle Bilder gelöscht, die keine Referenzen haben, d. h. nicht getaggt sind oder von keinem Container referenziert werden.
docker image prune
Um alle alten Images zu löschen, die nicht von vorhandenen Containern verwendet werden, führen Sie es mit -a
aus Flagge:
docker image prune -a
Das deckt den Hauptanwendungsfall ab, aber es gibt noch ein paar nützlichere Befehle:
inspect
:zeigt Informationen über eine Containerversion an.save & load
:speichert und lädt Bilder in eintar
archivieren.rm
:entfernt ein Bild direkt.pull/push
:Aktualisierungen von einer Remote-Registrierung.history
:stellt ein Änderungsprotokoll bereit.
Arbeiten mit Docker-Containerspeicher
Sie können alle Informationen zu einem Container mit docker inspect
anzeigen , das die Dateisystemtreiber und -daten sowie alle vorhandenen Mounts und Volumes anzeigt.
docker inspect containerID
Container speichern Daten auf zwei Arten. Das erste ist das Basisdateisystem, das aus dem Image kopiert wird und für jeden Container eindeutig ist. Docker verwendet ein „unteres Verzeichnis“ und ein „oberes Verzeichnis“, bei denen es sich um separate Ebenen handelt, die zu einem hybriden Dateisystem zusammengeführt werden. Das untere Verzeichnis speichert die Basisbilddaten, und das obere Verzeichnis speichert alles, was zur Laufzeit geändert wurde, z. B. Protokolldateien. In beiden Fällen hängt deren Speicherung von dem Dateisystemtreiber ab, für dessen Verwendung Docker konfiguriert ist.
Dann gibt es Reittiere , die Verzeichnisse vom Host an den Container binden, normalerweise automatisch mit einer Docker-Funktion namens Volumes. verwaltet Diese werden normalerweise gespeichert und sind für Endbenutzer zugänglich. Wenn Sie Arbeiten ausführen, bei denen Sie Daten in laufenden Containern ändern müssen, sollten Sie wahrscheinlich ein Volume ändern oder eine Bindung einhängen.
Auf Datenträger zugreifen
Auf Bind-Mounts kann direkt zugegriffen werden, und sie sind eine gute Wahl, wenn Sie Konfigurationen speichern möchten, die für viele Container verwendet werden, oder zugängliche Daten speichern möchten, die über Container-Neustarts hinweg bestehen bleiben.
Wenn Sie in Volumes gespeicherte Daten ändern möchten, können Sie dies auch tun. Sie werden in einem Standardformat gespeichert, auf das von Linux aus zugegriffen werden kann:
/var/lib/docker/volumes/volumeID/_data
Sie können die Volume-ID und Informationen mit docker volume inspect
abrufen .
Ähnlich wie Bilder können auch Volumes veralten. Sie können sie leicht entfernen, aber das Sichern und Übertragen ist ein schwierigerer Prozess.
docker volume prune docker volume rm volumeID
Ändern des Dateisystems eines Docker-Containers
Wenn Sie das Dateisystem des Containers ändern möchten, ähnlich wie bei Bildern, ist dies eine schlechte Idee In den meisten Fällen sollten Sie eine neue Version des Containers mit den aktualisierten Änderungen erstellen und ein Update bereitstellen.
Wenn Sie jedoch einige schnelle Änderungen vornehmen möchten, ohne den Container anzuhalten, ist es am besten, einfach eine Bash-Shell im Container zu öffnen und sie über Docker zu ändern. Dies ist sehr einfach – führen Sie docker exec
aus auf dem Container und übergeben Sie „bash“ als Befehl:
docker exec -it container bash
Von hier aus können Sie normale Linux-Befehle verwenden. Wenn Sie dies aus der Ferne tun möchten, können Sie einen SSH-Server in Ihrem Container installieren und Port 22 an einen anderen Port auf dem Host binden.
VERBUNDEN: SSH in einen Docker-Container