Ich werde nicht auf die grundlegenden Operationen von Docker eingehen. Es wird davon ausgegangen, dass der Quellcode der Anwendung im Container bereitgestellt und mithilfe von bind mount entwickelt wurde.
Docker Engine: 19.03.13
Wenn Sie die Eigenschaften von Bind Mount verstehen, können Sie die gesamte Quelle der Anwendung erstellen und ein Image erstellen.
Es ist eine übliche Technik, den Quellcode während der Entwicklung an einen Container zu binden, es ist jedoch erforderlich, eine Möglichkeit zu entwickeln, um bei der Bereitstellung ein Image einschließlich des Quellcodes zu erstellen. Die Methode ist einfach zu schlagen, aber Sie können eine separate Docker-Datei für die Erstellung vorbereiten und die Quelle explizit "kopieren". (Ich habe es selbst recherchiert und mich gefragt: "Ist das wirklich eine so einfache Geschichte ...?")
Es gibt drei Haupt-Volume-Mount-Typen, die mit Docker verwendet werden können. Um jeden Unterschied vollständig zu erklären
--Volumen --Mount auf dem von Docker verwalteten Bereich
Das Volume und das Bind-Mount bieten außerdem die folgenden Funktionen: Zitiert aus Official Storage Overview
Tipps zur Verwendung von Bindemontagen und Volumes Beachten Sie Folgendes, wenn Sie entweder Bind Mount oder Volume verwenden:
Wenn Sie versuchen, ein leeres Volume in einem Verzeichnis in einem Container bereitzustellen, und eine Datei oder ein Verzeichnis in diesem Verzeichnis vorhanden ist, wird diese Datei oder dieses Verzeichnis auf das Volume kopiert. Wenn das angegebene Volume beim Starten des Containers noch nicht vorhanden ist, wird ein leeres Volume erstellt. Es wird als Methode zur Bereitstellung von Daten im Voraus auf Anforderung des Containers verwendet.
Wenn Sie versuchen, mount oder mount eines nicht leeren Volumes in einem Verzeichnis in einem Container zu binden und die Datei oder das Verzeichnis in diesem Verzeichnis vorhanden ist, wird diese Datei oder dieses Verzeichnis durch den Mount ausgeblendet. Dies ist beispielsweise der Fall, wenn Sie eine Datei in / mnt auf einem Linux-Computer speichern und dann ein USB-Laufwerk für / mnt bereitstellen. Was sich in / mnt befand, wird vom Inhalt des USB-Laufwerks ausgeblendet und fortgesetzt, bis das USB-Laufwerk ausgehängt wird. Versteckte Dateien werden nicht gelöscht oder geändert. Es kann jedoch nur darauf zugegriffen werden, wenn das Bind-Mount oder Volume nicht bereitgestellt ist.
Es wird davon ausgegangen, dass der Nginx-Container einfach erstellt und der Quellcode zur Entwicklung auf dem Container bereitgestellt wird. Die Beispielverzeichnisstruktur und die Docker-Datei sind unten aufgeführt.
Verzeichnisaufbau
project-directory/
└html/
└index.html
└Dockerfile
Dockerfile
FROM nginx
COPY ./html /usr/share/nginx/html
EXPOSE 80
index.html
<!DOCTYPE html>
<head>
<title>ContainerA</title>
</head>
<body>
<h1>ContainerA!</h1>
</body>
docker run --name containerA --mount type=bind,source=(pwd)/html,target=/usr/share/nginx/html -d -p 81:80 nginx
Erstellen Sie einen Container mit den folgenden Optionen basierend auf nginx-Image des offiziellen DockerHub-Repositorys
--name
an
--Mount Volume mit --mount
--Volume hat auch die alte Option -v oder --volume
, empfiehlt aber offiziell --mount
, also folge ihr.
--type
gibt den Mount-Typ an (diesmal ist es ein Bind-Mount, also bind
)
--source
gibt den Pfad der Mount-Quelle (Host) an.
--target
gibt den Pfad an, an dem (innerhalb des Containers) gemountet werden soll.
--Modus mit -d
lösen (im Hintergrund starten)
--Stellen Sie den Port mit -p
vorwärtsloclahost: 80
im Container mit localhost: 81
des HostsDer folgende Bildschirm wird angezeigt
index.html
<!DOCTYPE html>
~Kürzung~
<body>
<h1>ContainerA!</h1>
<p>Add message at Host.</p>
</body>
Wenn Sie es erneut laden, wird der hinzugefügte Wortlaut angezeigt. Dies bestätigte auch, dass der Host und der Container sicher gebunden waren.
docker build -t build_with_bind_data ./
docker image ls
Das Bild build_with_bind_data
wird wie unten gezeigt erstellt
docker run --name containerB -d -p 82:80 build_with_bind_data
Wenn Sie auf http: // localhost: 82 zugreifen Ich konnte bestätigen, dass es genau das war, was auf Contaier A angezeigt wurde.
Vorerst, wenn Sie auch die Quelle in containerB überprüfen
docker exec containerB bash -c "cat /usr/share/nginx/html/index.html"
Während der Erstellung können Sie sehen, dass das angegebene Verzeichnis / die angegebene Datei mit dem Befehl COPY
kopiert wurde.
Ich möchte das Bild mit dem Befehl "COMMIT" verfestigen, aber dies ist nur ein Bild der Einstellungen und Änderungen im Container, und das Volume wird [^ 1] auf dem Container __ bereitgestellt. Beachten Sie, dass die Daten nicht in dem durch das Commit erstellten Bild enthalten sind __ </ font>. Daher ist es erforderlich, den Quellcode der Anwendung beim Erstellen mit dem Befehl "COPY" zu platzieren.
[^ 1]: Der Mount-Typ ist entweder volume / bind mount / tmpfs mount.
Vielleicht ist der Inhalt rudimentär. Aufgrund der bisherigen Erfahrung mit Docker hatte ich keine Möglichkeit, Bilder zu erstellen und zu verwalten. Daher fiel es mir schwer, die spezifische Bildgebungsmethode einschließlich der Quelle nicht zu kennen. Ich habe die Eigenschaften des Befehls "COMMIT" nicht bemerkt und war vom Wind überrascht: "Warum ist die Quelle nicht enthalten, auch wenn ich sie festschreibe!" Ich habe den offiziellen Kommentar jedoch sorgfältig gelesen und mein Verständnis vertieft, sodass ich ihn im Artikel belassen habe, um ihn nicht zu vergessen.
Recommended Posts