Detaillierte Erläuterung verschiedener Speichermethoden von Docker-Containern

Detaillierte Erläuterung verschiedener Speichermethoden von Docker-Containern

Vorne geschrieben

Im vorherigen Artikel haben wir etwas über Containernetzwerke gelernt und eine relativ detaillierte Einführung in das Funktionsprinzip der Container Network Driver Bridge gegeben. Heute werfen wir einen Blick auf einen weiteren Schlüsselbereich im Container – den Speicher.

Containerlagerung kann in zwei Kategorien unterteilt werden:

Eines davon bezieht sich auf das Image, nämlich die Copy-On-Write-Funktion auf Containerebene, die im Artikel „Grundlagen der Docker-Container-Technologie: Union File System OverlayFS“ erwähnt wird. Standardmäßig werden alle in einem Container erstellten Dateien auf einer beschreibbaren Containerebene gespeichert. Diese Methode, Dateien direkt auf der Containerebene zu speichern, erschwert das Speichern und Teilen von Daten. Aufgrund der Abhängigkeit von Speichertreibern verringert diese zusätzliche Abstraktion die Leistung im Vergleich zur Verwendung von Datenvolumes, die direkt in das Hostdateisystem schreiben.

Der andere ist der Host-Speicher, der dazu dient, das Host-Verzeichnis zur Verwendung an den Container zu binden oder bereitzustellen, sodass die Daten auch nach dem Stoppen des Containers bestehen bleiben. In diesem kurzen Aufsatz geht es hauptsächlich um Letzteres.

Mehrere Speichermontagemethoden

Hier zeichnen wir das folgende Diagramm basierend auf den verschiedenen Speicherorten der Daten auf dem Docker-Host:

1.Bind-Halterungen

Bind-Mounts haben im Vergleich zu Volumes eine eingeschränkte Funktionalität. Bei Verwendung eines Bind-Mounts wird eine Datei oder ein Verzeichnis auf dem Host in den Container gemountet. Auf eine Datei oder ein Verzeichnis wird über den vollständigen Pfad auf dem Hostcomputer verwiesen. Das Verzeichnis muss nicht bereits auf dem Docker-Host vorhanden sein. Wenn es nicht existiert, erstellt Docker es für uns. Bitte beachten Sie, dass nur Verzeichnisse automatisch erstellt werden können.

Lassen Sie uns mit der Option -v ein Verzeichnis /nginx/html an den Container anbinden.

docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx

Zeigen Sie das Container-Mounts-Feld über Docker Inspect Nginx an.

"Reittiere": [
    {
        "Typ": "binden",
        "Quelle": "/nginx/html",
        "Ziel": "/usr/share/nginx/html",
        "Modus": "",
        "RW": wahr,
        "Ausbreitung": "rprivate"
    }
],

Als nächstes erstellen wir eine index.html auf dem Docker-Host und schreiben „Hallo nginx“. Dann greifen wir auf die Container-IP zu. Offensichtlich ist unsere Einbindung wirksam geworden.

[root@localhost ~]# echo "hallo nginx" > /nginx/html/index.html
[root@localhost ~]# curl 172.17.0.4
hallo nginx

Hier gibt es ein Problem. Wir können Dateien über den Docker-Host ändern, damit die Dateien im Container wirksam werden. Umgekehrt kann der Container den Inhalt im Host-Dateisystem ändern, erstellen und löschen. Um dieses Problem zu lösen, können wir beim Erstellen des Containers die Berechtigungen des Mount-Verzeichnisses konfigurieren, beispielsweise die folgenden schreibgeschützten Berechtigungen:

docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx

Wenn Sie also Bind Mount verwenden und das Host-Dateisystem bedienen, müssen Sie Folgendes beachten:

  • Was enthält das von Ihnen gemountete Verzeichnis, um eine Beeinträchtigung anderer Anwendungen zu vermeiden?
  • Sollte Ihr Container über Berechtigungen zum Arbeiten mit diesen Verzeichnissen verfügen?

2. Bände

Volume-Speichervolumes werden von Docker erstellt und verwaltet. Wir können Volumes explizit mit dem Befehl „Docker Volume Create“ erstellen oder Volumes erstellen, wenn der Container erstellt wird.

[root@localhost ~]# Docker-Volume erstellen nginx_volume
nginx_volume
[root@localhost-Volumes]# docker inspect nginx_volume
[
    {
        "Erstellt am": "2021-08-12T01:58:04-04:00",
        "Treiber": "lokal",
        "Beschriftungen": {},
        "Einhängepunkt": "/var/lib/docker/volumes/nginx_volume/_data",
        "Name": "nginx_volume",
        "Optionen": {},
        "Geltungsbereich": "lokal"
    }
]

Sie können sehen, dass sich der Einhängepunkt im Stammverzeichnis von Docker /var/lib/docker/volumes befindet.

Löschen Sie einzelne oder alle ungenutzten Volumes mit Docker Volume RM/Prune. Die Möglichkeit, Volumes mit Docker-Befehlen zu verwalten, ist gegenüber Bind Mounts ein Vorteil.

[root@localhost ~]# Docker-Volume ls
TREIBERVOLUMENNAME
lokale owncloud-docker-server_files
lokaler owncloud-docker-server_mysql
lokaler owncloud-docker-server_redis
[root@localhost ~]# Docker-Volume bereinigen
WARNUNG! Dadurch werden alle lokalen Volumes entfernt, die nicht von mindestens einem Container verwendet werden.
Möchten Sie wirklich fortfahren? [j/N] j
Gelöschte Bände:
owncloud-docker-server_files
owncloud-docker-server_mysql
owncloud-docker-server_redis
​
Insgesamt zurückgewonnener Speicherplatz: 199,4 MB

Wenn beim Erstellen eines Containers die Quelle der Container-Einbindung nicht angegeben wird, erstellt Docker automatisch ein anonymes Volume für uns, das sich ebenfalls im Docker-Stammverzeichnis befindet.

[root@localhost-Volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx
d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6
[root@localhost-Volumes]# Docker-Volume ls 
TREIBERVOLUMENNAME
lokal d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980
lokales nginx_volume
[root@localhost-Volumes]# ls /var/lib/docker/volumes/
backingFsBlockDev d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 metadata.db nginx_volume

Wenn wir ein gemountetes Volume erstellen, ist der Speicher mit Bind-Mounts konsistent. Wenn der Docker-Host jedoch eine bestimmte Verzeichnis- oder Dateistruktur nicht garantieren kann, kann uns das Volume dabei helfen, die Konfiguration des Docker-Hosts von der Container-Laufzeit zu trennen. Wenn wir Daten von einem Docker-Host auf einen anderen sichern, wiederherstellen oder migrieren müssen, sind Volumes daher sehr praktisch und können von den Einschränkungen des Hostpfads befreit werden.

Bei der Verwendung von Bind-Mounts und -Volumes müssen wir die folgenden Propagation-Overlay-Prinzipien beachten:

Beim Mounten eines leeren Datenträgers: Der Inhalt des Verzeichnisses im Container wird auf den Datenträger übertragen (kopiert).

Beim Bind-Mounting oder bei nicht leeren Volumes: Der Inhalt des Verzeichnisses innerhalb des Containers wird durch das Volume oder das gebundene Host-Verzeichnis überschrieben.

3.tmpfs-Mount

tmpfs-Mounts sind nur auf Linux-Hosts verfügbar. Wenn wir einen Container mit einem tmpfs-Mount erstellen, kann der Container Dateien außerhalb der beschreibbaren Ebene des Containers erstellen. Behalten Sie die Daten im Speicher. Wenn der Container stoppt, werden auch die geschriebenen Daten entfernt. Wird hauptsächlich für die temporäre Speicherung vertraulicher Dateien verwendet, die nicht auf der beschreibbaren Ebene des Hosts oder Containers verbleiben sollen.

Mounten Sie einen Speicherblock mit der Option --tmpfs.

docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox

Verwenden Sie die Methode --mount, um Parameter einzufügen und die Größe des temporären Speichers anzugeben.

docker run -dt --name busybox_tmpfs2 --mount Typ=tmpfs,tmpfs-size=2048,Ziel=/etc/running busybox

Speicherdatenfreigabe

Es gibt zwei Hauptmethoden, um Daten zwischen Containern zu teilen. Die erste ist relativ einfach und erfordert lediglich das Einbinden eines Verzeichnisses oder Volumes in mehrere Container. Ich werde hier nicht ins Detail gehen. Schauen wir uns an, wie die Freigabe über einen Zwischencontainer erreicht wird.

Wir erstellen einen Zwischencontainer, der das Bind-Mount-Verzeichnis und ein Volume enthält.

docker erstellen -v /share:/volume1 -v /volume2 --name volume_share busybox

In dem Container, den wir freigeben müssen, können wir die Option --volumes-from verwenden, um ihn abzurufen.

docker run -d -t --volumes-from volume_share --name container1 busybox

Sehen wir uns das Feld „Mounts“ an. Container1 wurde nun in ein Bind-Verzeichnis und ein Volume eingebunden.

"Reittiere": [
    {
        "Typ": "binden",
        "Quelle": "/teilen",
        "Ziel": "/volume1",
        "Modus": "",
        "RW": wahr,
        "Ausbreitung": "rprivate"
    },
    {
        "Typ": "Volumen",
        "Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e",
        "Quelle": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data",
        "Ziel": "/volume2",
        "Treiber": "lokal",
        "Modus": "",
        "RW": wahr,
        "Ausbreitung": ""
    }
],

Das ist alles, was wir über die Docker-Containerspeicherung gelernt haben. Ich hoffe, dieser kurze Artikel wird Ihnen bei Bedarf nützlich sein.

Damit ist dieser Artikel über verschiedene Speichermethoden für Docker-Container abgeschlossen. Weitere Informationen zur Speicherung von Docker-Containern finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Schritte für den Exit-Fehlercode des Docker-Containers
  • Probleme mit dem benannten Mount und dem anonymen Mount des Docker-Container-Datenvolumens
  • Eine kurze Analyse von Patroni in Docker-Containern

<<:  Die Webseite kann nicht geöffnet werden, da dem Div-Element ein schließender Tag fehlt

>>:  CSS, um den kleinen scharfen Eckeneffekt von Blasen zu erzielen

Artikel empfehlen

Aufbauprinzip des Nexus-Privatservers und Tutorial-Analyse

eins. Warum einen privaten Nexus-Server erstellen...

Vue-Anfängerhandbuch: Umgebungserstellung und Erste Schritte

Inhaltsverzeichnis Erster Blick Erstellen einer V...

Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

MySQL-Dirty-Pages Aufgrund des WAL-Mechanismus er...

Detaillierte Schritte zur Installation und Verwendung von VMware ESXi 6.5

Inhaltsverzeichnis Einführung Architektur Vorteil...

MySQL 5.6.24 (binär) automatisches Installationsskript unter Linux

In diesem Artikel wird der Skriptcode für die aut...

Auszeichnungssprache - Bildersetzung

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

Ich habe ein paar coole Designseiten zusammengestellt, die ich gut finde.

Sie müssen Inspiration haben, um eine Website zu g...

Ein kurzer Vortrag über Responsive Design

1. Was ist Responsive Design? Responsive Design b...

So fragen Sie schnell 10 Millionen Datensätze in MySQL ab

Inhaltsverzeichnis Normale Paging-Abfrage So opti...

Lassen Sie IE6, IE7, IE8 CSS3-abgerundete Ecken und Schattenstile unterstützen

Ich möchte eine Seite mit CSS3-abgerundeten Ecken...

Netzwerkmanagement und Netzwerkisolationsimplementierung von Docker-Containern

1. Docker-Netzwerkverwaltung 1. Docker-Container-...

So greifen Sie über die IP-Adresse auf MySql zu

1. Melden Sie sich bei MySQL an: mysql -u root -h...

So konfigurieren Sie den Runner-Container in Docker

1. Erstellen Sie einen Runner-Container mk@mk-pc:...