Host-Verzeichnis in einen Docker-Container einbinden

Isaac Tony 23 August 2022
  1. Verwenden von Bind-Mounts zum Einbinden des Host-Verzeichnisses in einen Docker-Container
  2. Fazit
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 oder tmpfs.
  • 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.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

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.

LinkedIn

Verwandter Artikel - Docker Container