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/volumes
Volume 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 :指定元数据
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: 仅显示名称
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:~]$
-v
3.7 Parameter und --mount
Parameter für die Verwaltungsdatenträgererstellungsmethode 2
Sowohl -v als auch -mount können die Erstellung von Verwaltungsvolumes abschließen
3.7.1 -v
Parameter
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
Lassen Sie uns nun diesen Container betreten und versuchen, dieses Ding zu löschen, um zu sehen, wie das Phänomen aussieht.
Was ist, wenn Sie -ro
Optionen mitbringen? (schreibgeschützt)
[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 --mount
Parameter
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;"
],
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.
Ändern Sie es.
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
Ich habe festgestellt, dass es auf dem Host-Computer geändert werden kann.
Ich habe festgestellt, dass es im Container nicht geändert werden kann.
3.9.3 Fall 3
Wiederholen Sie mithilfe --mount
dieser Methode die Vorgänge der beiden oben genannten Fälle, um festzustellen, ob der Container und der Host synchronisiert werden können.
Wird zum Starten eines Containers verwendet--mount
.
Nehmen Sie Änderungen an der Homepage vor.
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.
Aber wenn docker volume rm test3
das 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 -v
Parameter 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
Nehmen Sie eine Änderung am Host-Computer vor.
Ich habe festgestellt, dass da auch welche drin sein werden.
4.2 --mount
Parameter zum Erstellen eines gebundenen Volumes
--mount '<key>=<value>,<key>=<value>'
Parameter.
type : 类型表示 bind, volume, or tmpfs
source, src : 宿主机目录,这个和管理卷是不一样的。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载
Schreiben Sie eine Datei in den Container und prüfen Sie, ob sie auf dem Host angezeigt wird.
4.3 Bedienungsbeispiele zum Binden von Volumes
4.3.1 Fall 1
Verwendungsmethode --mount
zum 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/html
wenn das Verzeichnis nicht vorhanden ist.webapp1
Sollte das Host-Verzeichnis nicht vorhanden sein, wird direkt ein Fehler gemeldet!
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: --tmpfs
Erstellung angeben
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 mysql
Punktcontainer und führen Sie ihn aus.
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
.
Erstellen Sie eine Datenbank.
Tabelle erstellen.
Löschen Sie diesen laufenden Container.
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
Habe dort noch etwas gefunden.