Host-Verzeichnis in einen Docker-Container einbinden
Neben anderen Funktionalitäten bietet Docker Tools für die Arbeit mit dem Host-Betriebssystem und dem Container-Dateisystem. Zu diesen Funktionen gehört die Fähigkeit, Daten in Containern zu speichern und Daten zwischen Containern auszutauschen, indem Verzeichnisse in Docker-Containern bereitgestellt werden.
Das Mounten von Verzeichnissen in Docker-Containern ist in einer Entwicklungsumgebung und Produktion hilfreich. Neben der Erstellung von Diensten, die von Hostsystemverzeichnissen abhängen, stellt dies sicher, dass nicht das gesamte Dateisystem zerstört wird, wenn ein Docker-Container zerstört wird.
Angenommen, wir möchten eine neue Version des Containers erstellen. In diesem Fall ermöglicht das direkte Einhängen eines Verzeichnisses in einen Docker-Container das erneute Laden im laufenden Betrieb.
Dieser Artikel setzt voraus, dass Docker korrekt eingerichtet ist und über ein Docker-Image und einen Container verfügt. Dies funktioniert unabhängig davon, ob wir Docker auf wsl oder Linux ausführen.
Verwenden von Bind-Mounts zum Einbinden des Host-Verzeichnisses in einen Docker-Container
Bind-Mounts sind eine der frühesten Lösungen, die es uns ermöglichen, Daten durch das Mounten unserer Docker-Container in Verzeichnissen auf unserem Hostsystem zu speichern. Diese ermöglichen es uns, auf ein Verzeichnis zu verweisen, indem wir uns auf den absoluten Dateipfad des Zielverzeichnisses beziehen.
Anders als bei Docker-Volumes hat Docker in diesem Fall keine Kontrolle über dieses Verzeichnis. Docker-Volumes erstellen ein Verzeichnis innerhalb des von Docker verwalteten Docker-Speichersystems.
Darüber hinaus können wir im Gegensatz zu Docker-Volumes Verzeichnisse, die in unseren Containern gemountet sind, nicht direkt über die Docker-CLI oder die Docker-API verwalten. Docker-Mounts sind jedoch sehr leistungsfähig in Hosts wie MAC oder Windows, wo Docker-Volumes etwas leistungsfähig sind.
Wir sollten auch beachten, dass die Verwendung von Bind-Mounts zum Mounten eines Containers in einem Verzeichnis die Größe des Containers sicherlich aufblähen wird.
Wir können zwei Flags verwenden, um ein Verzeichnis in einen Container einzuhängen, während der Container gestartet wird. Dazu gehören die Flags -v
und --mount
.
Mounten Sie das Host-Verzeichnis in einen Docker-Container mit dem Flag -v
oder --volume
Es besteht aus drei Feldern, die immer in der richtigen Reihenfolge und durch einen Doppelpunkt getrennt sein sollten. Diese beinhalten:
- Der Pfad zum Verzeichnis auf dem Hostcomputer, den wir mounten möchten.
- Der Pfad zu dem Verzeichnis im Container, wo wir dieses Verzeichnis mounten sollen.
- Andere optionale Optionen wie
ro
spezifizieren den Nur-Lesen-Modus.
docker run -t -i -v <host_dir>:<container_dir
Sobald wir das Host- und Containerverzeichnis identifiziert haben, das wir zusammen mounten möchten, können wir den obigen Befehl implementieren. Wir dürfen jedoch keine Änderungen an sensiblen Dateien vornehmen.
Dies liegt daran, dass Mounts uns Zugriff auf sensible Dateien geben, die, wenn sie manipuliert werden, zu einem fatalen Ausfall unseres Systems führen können.
In diesem Fall verwenden wir die offiziellen Ruby-Images, um einen Container zu erstellen und ein Verzeichnis zu mounten. Wir haben Skripte mit einem Verzeichnisnamen benannt, genauso wie beim Docker-Container.
isaac@DESKTOP-HV44HT6:~/isaac$ docker run -it --rm -v$HOME/Desktop/scripts:/scripts --name scripts ruby bash
Unable to find image 'ruby:latest' locally
latest: Pulling from library/ruby
e4d61adff207: Pull complete
4ff1945c672b: Pull complete
ff5b10aec998: Pull complete
12de8c754e45: Pull complete
ada1762e7602: Pull complete
f8f0dec0b2ef: Pull complete
7109f2ab3080: Pull complete
fe1e1dda18a5: Pull complete
Digest: sha256:a1ebc64daa170324dde5b668829de85487575eaa2bdea5216b4c983b1822f9df
Status: Downloaded newer image for ruby:latest
Wenn wir das Image nicht lokal haben, lädt Docker es automatisch herunter. Sobald der Containererstellungsprozess abgeschlossen ist, öffnet Docker den Container für uns.
root@9d057cf9e33d:/#
root@9d057cf9e33d:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin scripts srv sys tmp usr var
root@9d057cf9e33d:/# cd scripts
root@9d057cf9e33d:/scripts# ls
Wir können sehen, dass das Skriptverzeichnis im Container leer ist.
Gehen wir nun in das Skriptverzeichnis auf unserem Hostcomputer und erstellen eine neue Datei in diesem Verzeichnis. Es wird automatisch in den Verzeichnisskripten des Docker-Containers wiedergegeben.
isaac@DESKTOP-HV44HT6:~/Desktop$ cd scripts
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ touch new_file.txt
touch: cannot touch 'new_file.txt': Permission denied
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ ls
new_file.txt
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$
Sobald wir eine Datei im lokalen Verzeichnis erstellt haben, wird sie im Containerverzeichnis unten angezeigt.
root@913609933be2:/scripts# ls
new_file.txt
Mounten Sie das Host-Verzeichnis mit dem Flag --mount
in einen Docker-Container
Dies ist eine einfachere Methode als das Tag -v
und besteht aus mehreren Schlüssel-Wert-Paaren, die durch Kommas getrennt sind. Bei diesen Tags spielt die Reihenfolge der Felder keine Rolle.
Im Vergleich zum -v
-Tag ist es jedoch ausführlicher.
Diese Methoden bestehen aus den folgenden Befehlen:
- Die Art des Mounts wie
Bind
,volume
odertmpfs
. - Die Quelle, also der Pfad zu dem Verzeichnis auf dem Host, das wir mounten wollen, wird üblicherweise mit
src
bezeichnet. - Das Ziel, d.h. der Pfad zu dem Verzeichnis auf dem Container, wo wir das Verzeichnis mounten wollen.
- Wir haben auch andere Optionen wie die Nur-Lesen-Option und die Bindungsweitergabe, die dieses Verzeichnis als privat oder freigegeben angeben können.
Sobald wir alle erforderlichen Felder notiert haben, insbesondere die Quelle und das Ziel, können wir den Befehl wie unten gezeigt ausführen.
In diesem Fall verwenden wir das offizielle Nginx-Image, um den Container zu erstellen, und ordnen den lokalen Verzeichnisnamen new_scripts
einem Verzeichnis zu, das sich in etc/nginx
befindet.
$ docker run -d \
> -it \
> --mount type=bind,source=$HOME/Desktop/scripts/new_scripts,target=/etc/nginx \
> nginx \
> bash
e079e3254970e290ae68473239e101c6aa8ba4ba56482c75cd21f9bb9f49600b
Nachdem wir die beiden Verzeichnisse nun erfolgreich zugeordnet haben, werden alle Änderungen, die am Verzeichnis auf dem Host vorgenommen werden, automatisch auf das Verzeichnis im Container übertragen.
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ ls
new_file.txt
Diese Datei spiegelt sich in dem diesem Verzeichnis zugeordneten Docker-Verzeichnis wider und zeigt, dass wir die beiden Verzeichnisse erfolgreich zugeordnet haben.
root@e079e3254970:/etc# cd nginx
root@e079e3254970:/etc/nginx# ls
new_file.txt
Fazit
Wir haben erfolgreich gezeigt, wie man Verzeichnisse mit den Docker-Tags -v
und -mount
einhängt.
Wir sollten jedoch auch beachten, dass Docker bei Verwendung der -v
-Tags zum Mounten eines nicht vorhandenen Verzeichnisses dieses automatisch erstellt; Dies ist nicht der Fall, wenn das Docker-Tag --mount
verwendet wird.
Wir sollten stattdessen Docker-Volumes verwenden, wenn wir eine neue Anwendung entwickeln.
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedInVerwandter Artikel - Docker Container
- Der Unterschied zwischen Docker-Container und Docker-Image
- Erstellen Sie einen Container in einer Docker-Compose-Datei neu
- Führen Sie Container mit Docker kontinuierlich im Hintergrund aus
- Geben Sie einen laufenden Docker-Container mit einem neuen Pseudo-TTY ein
- Listen Sie nur die angehaltenen Container in Docker auf
- Löschen Sie Container dauerhaft in Docker