[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist

Einführung

Annahme

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.

Versionsinformation

Docker Engine: 19.03.13

Rauer Fluss

  1. Erste Schlussfolgerung
  2. Was ist ein Bind Mount?
  3. Überprüfen Sie die Erstellungsmethode Schritt für Schritt
  4. Bonus
  5. Eindrücke

Ziel dieses Artikels

Wenn Sie die Eigenschaften von Bind Mount verstehen, können Sie die gesamte Quelle der Anwendung erstellen und ein Image erstellen.


Erste Schlussfolgerung

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 ...?")


Was ist ein Bind Mount?

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

image.png

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.


Überprüfen Sie die Erstellungsmethode Schritt für Schritt

Lage

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>

Erstellen Sie mit dem folgenden Befehl einen bindgebundenen Nginx-Container mit dem Quellcode


docker run --name containerA --mount type=bind,source=(pwd)/html,target=/usr/share/nginx/html -d -p 81:80 nginx

image.png

Befehlserklärung

Erstellen Sie einen Container mit den folgenden Optionen basierend auf nginx-Image des offiziellen DockerHub-Repositorys

Gehen Sie zu http: // localhost: 81 und versuchen Sie, den Bildschirm anzuzeigen

Der folgende Bildschirm wird angezeigt image.png

Fügen Sie den Wortlaut hinzu und stellen Sie sicher, dass er im Container angezeigt wird

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.

image.png

Erstellen Sie eine Docker-Datei und erstellen Sie ein Image für jede Quelle


docker build -t build_with_bind_data ./

Überprüfen Sie das erstellte Image

docker image ls

Das Bild build_with_bind_data wird wie unten gezeigt erstellt

image.png

Erstellen Sie einen Container basierend auf dem erstellten Image und prüfen Sie, ob die Quelle ebenfalls enthalten ist


docker run --name containerB -d -p 82:80 build_with_bind_data

image.png

Wenn Sie auf http: // localhost: 82 zugreifen Ich konnte bestätigen, dass es genau das war, was auf Contaier A angezeigt wurde. image.png

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. image.png

Bonus

Der Container kann mit dem Befehl "COMMIT" abgebildet werden, die Volume-Mount-Daten sind jedoch nicht enthalten.

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.


Impressionen

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

[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist
So überprüfen Sie das Protokoll im Docker-Container
[Java] Memo zum Schreiben der Quelle
[IntelliJ IDEA] Formatieren nur lokaler Änderungen beim Speichern des Quellcodes
Beim Lesen des Quellcodes
Die Zeit ist falsch mit der Anwendung, die auf dem Docker-Container gestartet wurde
[Docker] Zugriff auf den Host aus dem Container heraus. http: //host.docker.internal:
So lösen Sie, wenn Sie mit einem neuen Container keine Verbindung zur Datenbank herstellen können, weil der Port dem vorhandenen Docker-Container zugewiesen ist
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
So erstellen Sie CloudStack mit Docker
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
Installieren Sie Ubuntu20.04 auf RaspberryPi 4 und erstellen Sie Kubernetes, um den Container auszuführen
Wie die Website auf dem Bildschirm angezeigt wird
Docker Container Build kann PHP-Radis nicht installieren
Erstellen Sie eine Redmine-Code-Leseumgebung in Docker
So erstellen Sie eine Rails 6-Umgebung mit Docker
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
Mit Pg_resetwal kann der PostgreSQL Docker-Container gestartet werden, wenn WAL fehlerhaft ist und nicht gestartet werden kann.
Als ich zu Docker Hub wechselte, wurde mir der Zugriff auf die Ressource verweigert
Fügen Sie JDK zum TeamCity Build Agent-Container hinzu
So mounten Sie den Speicherort der Batchdatei über WSL2 und starten den Docker-Container
So erhalten Sie einen Heapdump aus einem Docker-Container
Anzeigen der vom Docker-Container verwendeten Festplattenmenge für jeden Container
So löschen Sie die Datenbank beim Neuerstellen der App
So aktualisieren Sie eine vorgefertigte Datei in einem Docker-Container
[Heroku] So lösen Sie, wenn ein Fehler von git push heroku master angezeigt wird
Festlegen, wann in junit "Der Konstruktor Empty () ist nicht sichtbar" auftritt
[Rails] So erstellen Sie eine Umgebung mit Docker
So erstellen Sie eine Pytorch-Umgebung unter Ubuntu
So erstellen Sie die einfachste Blockchain in Ruby
[Rails] [Docker] Kopieren und Einfügen ist in Ordnung! So erstellen Sie eine Rails-Entwicklungsumgebung mit Docker
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
So ändern Sie den Prozess in Abhängigkeit von der Liste, die gedrückt wird, wenn mehrere ListViews vorhanden sind
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
So identifizieren Sie die Ursache, wenn GC häufig auftritt und die CPU-Auslastung hoch ist
[Java] So erhalten Sie die URL der Übergangsquelle
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
So erstellen Sie die Docker + Springboot-App (für grundlegendes Lernen)
Wie weit ist die richtige Antwort, um den Prozess zu teilen?
So ermitteln Sie, wie viel Festplatte Docker verwendet
So erstellen Sie eine Docker-Umgebung mit Gradle for IntelliJ
[Ruby on Rails] So ändern Sie den Spaltennamen
Erstellen Sie einen Docker-Container, um EPS in eine PGF-Quelle zu konvertieren
So erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
[swift5] So führen Sie die Verarbeitung aus, wenn Sie auf die TabBar tippen
Installieren Sie MySQL 5.6 unter CentOS6 [So geben Sie die Version an]
BasicDataSourceFactory ist ClassNotFoundException, wenn eine Verbindung zur Datenbank in Tomcat 8 hergestellt wird
So installieren Sie Docker