Docker geht vom Verständnis der Praxis zu den zugrunde liegenden Prinzipien (7) | Docker-Speichervolumen

Fügen Sie hier eine Bildbeschreibung ein

Vorwort

Der Blogger hier hat also einige Kolumnen voller nützlicher Informationen!

Das erste ist eine Zusammenfassung der hochwertigen Blogs des Bloggers. Die Blogs in dieser Kolumne wurden alle vom Blogger mit größter Sorgfalt verfasst. Sie sind voller nützlicher Informationen. Ich hoffe, dass sie für alle hilfreich sind.

Dann ist da noch die Kolumne, mit der der Blogger in letzter Zeit die meiste Zeit verbracht hat: „Docker von der Realisierung über die Praxis bis hin zu den zugrunde liegenden Prinzipien“. Ich hoffe, dass alle ihr mehr Aufmerksamkeit schenken!


Kapitel 7 – Docker-Speichervolume

1. Einführung des Docker-Volumens

Referenz: Bit-Beschäftigungsklasse

1.1 Was ist ein Speichervolumen?

Ein Speichervolume dient dazu, direkt eine Bindungsbeziehung zwischen einem Verzeichnis im lokalen Dateisystem des Hosts und einem Verzeichnis im Dateisystem innerhalb des Containers herzustellen. Das heißt, wenn wir Daten in dieses Verzeichnis im Container schreiben, schreibt der Container seinen Inhalt direkt in das Verzeichnis auf dem Host, das an den Container gebunden ist. Das Verzeichnis auf dem Host, das an den Container gebunden ist, wird als Speichervolume bezeichnet. Das Wesentliche eines Volumes ist eine Datei oder ein Verzeichnis. Es kann das standardmäßige gemeinsame Dateisystem umgehen und direkt auf dem Host in Form einer Datei oder eines Verzeichnisses existieren.

Das Verzeichnis /data/web des Hosts ist an das Verzeichnis /container/data/web im Container gebunden. Wenn der Prozess im Container Daten in dieses Verzeichnis schreibt, werden diese unter Umgehung des Containers direkt in das Hostverzeichnis geschrieben Das Dateisystem stellt eine Verbindung zum Dateisystem des Hosts her, sodass der Datenbankinhalt zwischen dem Host und dem Container gemeinsam genutzt werden kann, sodass der Container direkt auf den Inhalt im Host zugreifen kann und der Host auch Inhalte in den Container schreiben kann Die Daten des Containers und des Hosts lesen und schreiben sind synchron.

1.2 Warum Speichervolumina benötigt werden

1.2.1 Datenverlustproblem

Generell lassen sich Container je nach Geschäftsart in zwei Kategorien einteilen:

  • Zustandslos (Daten müssen nicht gespeichert werden)

  • Zustandsbehaftet (Daten müssen beibehalten werden)

Offensichtlich eignen sich Container besser für zustandslose Anwendungen. Da der Lebenszyklus des Container-Stammverzeichnisses ohne persistente Daten mit dem Lebenszyklus des Containers identisch ist, besteht das Wesentliche des Container-Dateisystems aus einer Lese-/Schreibschicht, die über der Spiegelschicht erstellt wird. Änderungen an allen Dateien durch die Der laufende Container ist in dieser Lese-/Schreibebene vorhanden. Wenn der Container gelöscht wird, verschwindet auch die Lese-/Schreibebene im Container. Obwohl der Container hofft, dass alle Unternehmen so weit wie möglich zustandslos bleiben, damit der Container sofort verwendet und beliebig geplant werden kann, gibt es in tatsächlichen Unternehmen immer verschiedene Szenarien, die Datenpersistenz erfordern, z. B. zustandsbehaftete Unternehmen wie MySQL und Kafka. . Um die Anforderungen des Stateful Business zu erfüllen, schlug Docker daher das Konzept des Volumens vor.

1.2.2 Leistungsprobleme

UnionFS ist beim Ändern, Löschen usw. im Allgemeinen sehr ineffizient. Wenn es sich bei der Implementierung von persistentem Speicher um eine Anwendung mit relativ hohen E/A-Anforderungen wie Redis handelt, sind die Leistungsanforderungen für den zugrunde liegenden Speicher relativ hoch.

1.2.3 Der Zugriff zwischen Host und Container ist unpraktisch

Der Host greift auf den Container zu, oder der Zugriff auf den Container muss docker cpüber abgeschlossen werden

1.2.4 Container und Container-Sharing sind unbequem

2. Klassifizierung des Speichervolumens

Derzeit bietet Docker drei Möglichkeiten, Daten vom Host in den Container einzubinden.

  • /var/lib/docker/volumesVolume Docker verwaltet Volumes, die standardmäßig dem Verzeichnis des Hosts (wir haben es geändert) zugeordnet sind. Sie müssen nur den Mount-Punkt des Containers im Container angeben, und das Verzeichnis unter dem gebundenen Host wird vom Container-Engine-Daemon selbst bestimmt . Erstellen Sie ein leeres Verzeichnis oder verwenden Sie ein vorhandenes Verzeichnis, um eine Speicherbeziehung mit dem Speichervolume herzustellen. Diese Methode erleichtert die Kopplungsbeziehung des Benutzers bei der Verwendung des Volumes erheblich. Der Nachteil besteht darin, dass der Benutzer nicht angeben kann, welche Verzeichnisse verwendet werden sollen, sondern temporärer Speicher passender;

  • Bind Mount bindet das Datenvolumen und ordnet es dem angegebenen Pfad auf dem Host zu. Der Pfad auf dem Host muss manuell als spezifischer Pfad angegeben werden. Im Container muss außerdem ein bestimmter Pfad angegeben werden. Zwei bekannte Pfade werden zugeordnet.

  • Das temporäre tmpfs-Mount-Datenvolumen wird dem Hostspeicher zugeordnet . Sobald der Container nicht mehr ausgeführt wird, werden die tmpfs-Mounts entfernt und die Daten gehen verloren. Es wird für die temporäre Hochleistungsdatenspeicherung verwendet.

3. Lautstärke verwalten

3.1 Liste der Lautstärkebefehle

Befehl Funktion
docker volume create Speichervolumen erstellen
docker volume inspect Details zum Speichervolumen anzeigen
docker volume ls Speichervolumes auflisten
docker volume prune Bereinigen Sie alle nutzlosen Datenmengen
docker volume rm Gelöschte Volumes und verwendete Volumes können nicht gelöscht werden.

3.2 Docker-Volume erstellen

Schlüsselparameter

-d, --driver :指定驱动,默认是 local
--label :指定元数据

Fügen Sie hier eine Bildbeschreibung ein

Geben Sie einfach keine Parameter an, es ist nur ein zufälliger Name, der vom System vergeben wird.

Natürlich können wir auch überprüfen, in welches Verzeichnis es auf dem Host-Rechner gemountet ist.

[root@ALiCentos7:~]$ docker volume inspect fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
[
    {
    
    
        "CreatedAt": "2023-09-19T18:54:13+08:00",
        "Driver": "local",
        "Labels": {
    
    
            "com.docker.volume.anonymous": ""
        },
        "Mountpoint": "/data/var/lib/docker/volumes/fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306/_data",
        "Name": "fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306",
        "Options": null,
        "Scope": "local"
    }
]
[root@ALiCentos7:~]$

Erstellen Sie eines mit einem Namen.

[root@ALiCentos7:~]$ docker volume create myboltest1
myboltest1
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ 

3.3 Docker-Volumenprüfung

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

Parameter

-f:指定相应个格式, 如json

3.4 Docker-Volume ls

Parameter.

--format:指定相应个格式,如 json,table
--filter,-f: 过滤
-q: 仅显示名称

Fügen Sie hier eine Bildbeschreibung ein

3,5 Docker-Volumen rm

Parameter.

-f, --force : 强制删除

3.6 Docker-Volume bereinigen

Bereinigen Sie nicht verwendete lokale Volumes.

Parameter.

--filter : 过滤
-f, --force : 不提示是否删除
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ docker volume prune 
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306

Total reclaimed space: 0B
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     myboltest1
[root@ALiCentos7:~]$

-v3.7 Parameter und --mountParameter für die Verwaltungsdatenträgererstellungsmethode 2

Sowohl -v als auch -mount können die Erstellung von Verwaltungsvolumes abschließen

3.7.1 -vParameter

Funktion: Vollständige Verzeichniszuordnung

docker run -v name:directory[:options] ...

Parameter

第一个参数:卷名称
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

Üben.

docker run -d  --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.21.4

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Lassen Sie uns nun diesen Container betreten und versuchen, dieses Ding zu löschen, um zu sehen, wie das Phänomen aussieht.

Fügen Sie hier eine Bildbeschreibung ein

Was ist, wenn Sie -roOptionen mitbringen? (schreibgeschützt)

Fügen Sie hier eine Bildbeschreibung ein

[root@ALiCentos7:~]$ docker exec -it myvolnginx1 bash
root@838d01664db5:/# cd /usr/share/nginx/html/
root@838d01664db5:/usr/share/nginx/html# ls
50x.html
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# 
root@838d01664db5:/usr/share/nginx/html# 

Zu diesem Zeitpunkt kann es nicht mehr gelöscht werden.

3.7.2 --mountParameter

Vollständige Verzeichniszuordnung.

Parameter.

type : 类型表示 bind, volume, or tmpfs
source, src : 对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

Üben.

docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.21.4 
[root@ALiCentos7:~]$ docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.22.0 
2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004
[root@ALiCentos7:~]$ docker inspect my
mynginxvol4          mywebsite-yufc:v1.0  
[root@ALiCentos7:~]$ docker inspect mynginxvol4 
[
    {
    
    
        "Id": "2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004",
        "Created": "2023-09-19T12:05:44.437893015Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],

Fügen Sie hier eine Bildbeschreibung ein

3.8 Anonymes Dockerfile-Volume

Docker-Verwaltungsvolumes können über VOLUME of Dockerfile erstellt werden. Wir werden dies später im Dockerfile ausführlich erläutern. Wir können auch über die VOLUME-Anweisung der Docker-Datei ein Datenvolumen im Image erstellen, sodass jeder über das Image erstellte Container einen Einhängepunkt hat. Es ist jedoch zu beachten, dass der durch die VOLUME-Anweisung erstellte Einhängepunkt den nicht angeben kann entsprechendes Verzeichnis auf dem Host. , aber zufällig von Docker generiert.

3.9 Operationsfälle

3.9.1 Fall 1

Was passiert, wenn der Inhalt des Containers auf dem Host geändert wird? wird mit dem Container synchronisiert.

Bereiten Sie zunächst die Umgebung vor.

Fügen Sie hier eine Bildbeschreibung ein

Ändern Sie es.

Fügen Sie hier eine Bildbeschreibung ein

Es wurde festgestellt, dass gleichzeitig auch der Container verändert wurde.

3.9.2 Fall 2

Kann es trotzdem geändert werden, wenn es über ro gebunden ist? Kann der Host-Computer geändert werden? Kann es im Container geändert werden?

Führen Sie zuerst den Container aus

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Ich habe festgestellt, dass es auf dem Host-Computer geändert werden kann.

Fügen Sie hier eine Bildbeschreibung ein

Ich habe festgestellt, dass es im Container nicht geändert werden kann.

3.9.3 Fall 3

Wiederholen Sie mithilfe --mountdieser Methode die Vorgänge der beiden oben genannten Fälle, um festzustellen, ob der Container und der Host synchronisiert werden können.

Fügen Sie hier eine Bildbeschreibung ein

Wird zum Starten eines Containers verwendet--mount .

Nehmen Sie Änderungen an der Homepage vor.

Fügen Sie hier eine Bildbeschreibung ein

Kann geändert werden.

3.10 Lebenszyklus des Docker-Volumes

Fazit: Auch wenn der Container gelöscht wird, ist der Inhalt des Volumes immer noch vorhanden, schließlich dient dieses Volume ursprünglich dem Schutz von Daten.

Fügen Sie hier eine Bildbeschreibung ein

Aber wenn docker volume rm test3das Ding definitiv weg ist.

[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
total 8
-rw-r--r-- 1 root root 497 Nov  2  2021 50x.html
-rw-r--r-- 1 root root 630 Sep 19 21:09 index.html
[root@ALiCentos7:~]$ docker volume rm test3
test3
[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
ls: cannot access /data/var/lib/docker/volumes/test3/_data: No such file or directory
[root@ALiCentos7:~]$ 

3.11 Volume-Freigabe

Starten Sie drei Container und binden Sie sie an dasselbe Volume, um zu sehen, was nach der Änderung passiert.

Fazit: Drei Container werden gleichzeitig aktualisiert.

Ich werde hier keine Demonstration durchführen, da der Cloud-Server nicht so viele Ports öffnen möchte.

4. Bind-Volume-Bind-Mount

Sowohl -v als auch -mount können die Erstellung gebundener Volumes abschließen.

4.1 -vParameter zum Erstellen eines gebundenen Volumes

docker run -v name:directory[:options] ...

Parameter

第一个参数:宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

Wenn der erste Parameter das Verzeichnis des Hosts ist, handelt es sich um das gebundene Volume. Wenn nicht angegeben, handelt es sich um das anonyme Volume des Verwaltungsvolumes. Wenn es sich um einen Namen handelt, handelt es sich um das Verwaltungsvolume.

Praktische Bedienung

docker run -d --name mynginx -v /root/DockerSrc/Volume/:/usr/share/nginx/html f6987c8d6ed5

Fügen Sie hier eine Bildbeschreibung ein

Nehmen Sie eine Änderung am Host-Computer vor.

Ich habe festgestellt, dass da auch welche drin sein werden.

Fügen Sie hier eine Bildbeschreibung ein

4.2 --mountParameter zum Erstellen eines gebundenen Volumes

--mount '<key>=<value>,<key>=<value>'

Parameter.

type : 类型表示 bind, volume, or tmpfs
source, src : 宿主机目录,这个和管理卷是不一样的。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

Fügen Sie hier eine Bildbeschreibung ein

Schreiben Sie eine Datei in den Container und prüfen Sie, ob sie auf dem Host angezeigt wird.

Fügen Sie hier eine Bildbeschreibung ein

4.3 Bedienungsbeispiele zum Binden von Volumes

4.3.1 Fall 1

Verwendungsmethode --mountzum Erstellen eines Containers: Erstellen Sie einen Nginx-Container und mounten Sie das Hostverzeichnis /webapp1 im Containerverzeichnis . Beachten Sie, dass ein Fehler gemeldet wird, /usr/share/nginx/htmlwenn das Verzeichnis nicht vorhanden ist.webapp1

Fügen Sie hier eine Bildbeschreibung ein

Sollte das Host-Verzeichnis nicht vorhanden sein, wird direkt ein Fehler gemeldet!

Fügen Sie hier eine Bildbeschreibung ein

4.3.2 Fall 2: Gemeinsame Nutzung gebundener Volumes

Fazit: Es ist dasselbe wie die Verwaltung der Volume-Freigabe. Wenn der Host geändert wird, werden alle Container geändert.

5. Temporäres Volume tmpfs

Vergängliche Volumendaten befinden sich im Speicher, außerhalb des Containers und Hosts.

tmpfs-Einschränkungen

  • Im Gegensatz zu Volumes und Bind-Mounts können tmpfs-Mounts nicht von Containern gemeinsam genutzt werden.

  • Diese Funktion ist nur verfügbar, wenn Docker unter Linux ausgeführt wird

5.1 Volumes erstellen

Methode 1: --tmpfsErstellung angeben

Fügen Sie hier eine Bildbeschreibung ein

Das Experiment zu diesem Zeitpunkt ist das gleiche wie das vorherige, aber wenn der Container stoppt, sind die Dinge weg.

6. Umfassende Praxis – MySQL-Notfallwiederherstellung

Praktischer Vorschlag:

Beherrschen Sie die Verwendung bereitgestellter Volumes und speichern Sie MySQL-Geschäftsdaten extern

Praktische Schritte:

Erstellen Sie einen Container mit dem MySQL 5.7-Image und erstellen Sie ein gemeinsames Datenvolumen mysql-data, um die im Container generierten Daten zu speichern. Sie müssen eine Verbindung zum MySQL-Dienst im Container herstellen, einen Datenbanktest erstellen, eine einfache Tabelle in der Datenbank erstellen und einige Daten darin einfügen.

Suchen Sie zunächst einen mysqlPunktcontainer und führen Sie ihn aus.

Fügen Sie hier eine Bildbeschreibung ein

docker run --name mysql -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

Verbinden Sie dies mysql.

Fügen Sie hier eine Bildbeschreibung ein

Erstellen Sie eine Datenbank.

Fügen Sie hier eine Bildbeschreibung ein
Tabelle erstellen.

Fügen Sie hier eine Bildbeschreibung ein

Löschen Sie diesen laufenden Container.

Fügen Sie hier eine Bildbeschreibung ein

Führen Sie nun einen neuen Container aus und binden Sie ihn an das ursprüngliche Verzeichnis, um zu sehen, ob dort noch Dinge vorhanden sind.

docker run --name mysql-new -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

Fügen Sie hier eine Bildbeschreibung ein

Habe dort noch etwas gefunden.

Guess you like

Origin blog.csdn.net/Yu_Cblog/article/details/133353932