# Docker-Container-Volumes verstehen und verwalten

[Docker](https://www.ionos.at/digitalguide/server/knowhow/was-ist-docker/ "Was ist Docker?") ist eine Open-Source-Software zur Erstellung und Verwaltung von Containern. Mit einem Docker-Volume ist es möglich, Daten zwischen diesen Containern auszutauschen oder Daten aus einem Docker-Container persistent zu sichern.

## Anforderungen

- [Docker ist installiert](https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte/) und läuft.
- Sie haben grundlegende Kenntnisse der Docker-Funktionalität und [Docker-Befehle](https://www.ionos.at/digitalguide/server/knowhow/docker-befehle/).

## Das Docker-Dateisystem

Um Docker-Volumes zu verstehen, ist es wichtig, zuerst einen Überblick darüber zu haben, wie das Docker-Dateisystem funktioniert.

Ein [Docker-Image](https://www.ionos.at/digitalguide/server/knowhow/docker-image/ "Docker-Image") besteht aus mehreren schreibgeschützten Schichten. Wird ein Image aus einem Container gestartet, fügt Docker eine neue beschreibbare Schicht an der Spitze des Systems hinzu. Das wird in Docker **Union File System** genannt.

Jedes Mal, wenn eine Datei geändert wird, erstellt Docker eine Kopie der Datei von den schreibgeschützten Schichten bis in die oberste beschreibbare Schicht. Dadurch bleibt die ursprüngliche (schreibgeschützte) Datei unverändert.

Wird ein Container gelöscht, geht die oberste beschreibbare Schicht verloren. Das bedeutet, dass alle Änderungen, die nach dem Start des Containers vorgenommen wurden, nicht mehr vorhanden sind.

## Abhilfe schaffen durch Docker-Volumes

Ein Container-Volume ermöglicht es, dass Daten erhalten bleiben, auch wenn ein Docker-Container gelöscht wird. Volumes sind auch eine praktische Möglichkeit, Daten zwischen dem Host und dem Container auszutauschen.

Das Einbinden eines Docker-Container-Volumes ist eine gute Lösung, um Folgendes auszuführen:

- Daten in einen Docker-Container übertragen
- Daten aus einem Docker-Container speichern
- Daten zwischen Docker-Containern austauschen

Docker-Volumes existieren außerhalb des Union File Systems mit seinen Read-only-Zugriff und seiner beschreibbaren Schicht. Das Volume ist ein Ordner, der zwischen dem Container und dem Host-Computer geteilt wird. Volumes können auch zwischen Containern geteilt werden.

---

### Tipp

Auf dem [IONOS Cloud-Server](https://www.ionos.at/cloud/cloud-server "IONOS Cloud-Server hosten") können Sie Docker als bereits vorinstallierte Cloud-App auswählen. So können Sie von überall aus auf Ihre Anwendungen zugreifen!

---

## Grundlage der Docker-Volumes

Ein Container-Volume „lebt“ außerhalb des eigentlichen Containers auf dem Host-Computer. Aus dem Container heraus verhält sich das Volume wie ein Ordner, in dem Sie Daten speichern und aus dem Sie Daten abrufen können. Es handelt sich hier um einen sogenannten **Mount Point** auf ein Verzeichnis auf dem Host.

Es gibt mehrere Möglichkeiten, Docker-Volumes zu erstellen und zu verwalten. Jede Methode hat ihre eigenen Vor- und Nachteile.

## Verwendung des Befehls "volume create" von Docker

Ab der Version 1.9.0, die am 3.11.2015 veröffentlicht wurde, können Docker-Volumes ganz einfach mit dem integrierten Befehl ***docker volume* erstellt und verwaltet werden.

### Schritt 1: Volume erstellen und benennen

Der Befehl ***docker volume create*** erstellt ein benanntes Volume. Der Name ermöglicht es Ihnen, Docker-Volumes einfach zu finden und den Containern zuzuordnen.

Um ein Volume zu erstellen, verwenden Sie den Befehl:

```none
sudo docker volume create - - name [volume name]
```

### Schritt 2: Volume im Docker-Container verwenden

Um einen Container zu starten, der ein Volume verwendet, das Sie mit ***docker volume create*** erstellt haben, fügen Sie dem Befehl ***docker run*** das folgende Argument hinzu:

```none
-v [volume name]:[container directory]
```

Um beispielsweise einen Container aus dem **CentOS**-Image mit dem Namen ***my-volume-test*** auszuführen und das **Data-Volume** dem Verzeichnis */**data*** des Containers zuzuordnen, lautet der Befehl:

```none
sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash
```

### Schritt 3: Volumes auflisten

Um alle Docker-Volumes auf dem System aufzulisten, verwenden Sie den Befehl:

```none
sudo docker volume ls
```

Dies gibt eine Liste aller Docker-Volumes zurück, die auf dem Host erstellt wurden.

### Schritt 4: Volume inspizieren

Um ein benanntes Volume zu inspizieren, verwenden Sie den Befehl:

```none
sudo docker volume inspect [volume name]
```

Dieser Befehl liefert Ihnen Informationen über das Volume, einschließlich des Mount Points und des Verzeichnisses auf dem Hostsystem, über das das Docker-Volume angesprochen werden kann.

Um zum Beispiel mehr Informationen über das Volume mit Namen „**Data**“ zu erhalten, das wir oben erstellt haben, ist der Befehl:

```none
sudo docker volume inspect data-volume
```

### Schritt 5: Volume entfernen

Um ein auf diese Weise erstelltes Volume zu entfernen, verwenden Sie den Befehl:

```none
sudo docker volume rm [volume name]
```

Sie können ein Volume nicht entfernen, wenn es von einem vorhandenen Container verwendet wird. **Bevor Sie das Volume entfernen können**, müssen Sie den Docker-Container mit folgenden Befehlen anhalten und löschen:

```none
sudo docker stop [container name or ID]
sudo docker rm [container name or ID]
```

Um beispielsweise das Volume namens „**Data**“ zu löschen, müssen Sie zuerst den Container, der es verwendet, mit ***my-volume-test*** stoppen und löschen:

```none
sudo docker stop my-volume-test
sudo docker rm my-volume-test
```

Das **Datenvolumen** kann dann mit folgendem Befehl **gelöscht** werden:

```none
sudo docker volume rm data-volume
```

## Erstellen Sie ein Docker-Volume und geben Sie ein Verzeichnis auf dem Host an

Wenn Sie ein bestimmtes Verzeichnis auf Ihrem Host-Computer als Docker-Volume auf dem Container mounten möchten, fügen Sie das folgende Argument zu Ihrem *docker run*-Befehl hinzu:

```none
-v [host directory]:[container directory]
```

Um beispielsweise einen neuen Container zu starten und den Ordner **/webfiles** auf dem Host dem Ordner **/var/wwww/html** auf dem Container zuzuordnen, lautet der Befehl:

```none
sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash
```

Testen Sie dies, indem Sie ein Verzeichnis erstellen, das Sie dann als Docker-Volume verwenden. Dies geht mit folgendem Befehl:

```none
sudo mkdir /hostvolume
```

Fügen Sie mit dem Befehl eine kleine Testdatei zu diesem Verzeichnis hinzu:

```none
sudo echo "Hello World" >> /hostvolume/host-hello.txt
```

Als nächstes starten Sie einen Container namens **my-directory-test** und ordnen **/hostvolume** auf dem Host **/containervolume** auf dem Container zu mit folgendem Befehl:

```none
sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash
```

Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, listen Sie die Dateien im freigegebenen Volume mit dem Befehl auf:

```none
ls /containervolume
```

Sie sehen die Datei ***host-hello.txt*,** die wir auf dem Host erstellt haben.

Dies funktioniert auch in die entgegengesetzte Richtung. Dateien, die Sie in dieses Verzeichnis legen, werden auf dem Host angezeigt. Sie können dies vom Container aus testen, indem Sie dem freigegebenen Volume mit folgendem Befehl eine weitere Datei hinzufügen:

```none
echo "Hello from the container." >> /containervolume/container-hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück. Dort listen Sie die Dateien im freigegebenen Volume mit diesem Befehl auf:

```none
sudo ls /hostvolume
```

Sie sehen die beiden Testdateien, die wir vom Host und vom Container aus erstellt haben.

## Erstellen eines Docker-Volumes mit einer Docker-Datei

Verwenden Sie den folgenden Befehl in einer Docker-Datei, um **ein gemeinsames Speichervolumen** im Container zu erstellen:

```none
VOLUME [volume path]
```

Um beispielsweise ein Volume ***/myvolume*** in dem Container zu erstellen, der aus der Docker-Datei gestartet werden soll, lautet der Befehl:

```none
VOLUME /myvolume
```

Um dies zu testen, erstellen Sie zunächst eine Datei namens **Dockerfile** mit dem Befehl:

```none
sudo nano Dockerfile
```

Fügen Sie folgenden Inhalt in die Datei ein:

```none
# The source image to start with
FROM centos
# Create a volume
VOLUME /dockerfilevolume
```

Speichern und beenden Sie die Datei.

Als nächstes erstellen Sie mit folgendem Befehl ein Image namens ***dockerfile-volumetest*** aus dieser Docker-Datei:

```none
sudo docker build -t dockerfile-volumetest
```

Danach starten Sie einen Container namens **my-dockerfile-test** aus diesem Image mit dem Befehl:

```none
sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash
```

Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, erstellen Sie mit diesem Befehl eine kleine Testdatei im freigegebenen Volume:

```none
echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.

Als nächstes suchen Sie den **Mount Point**. Verwenden Sie dazu den Befehl:

```none
sudo docker inspect my-dockerfile-test
```

Scrollen Sie durch die Ausgabe, bis Sie einen Abschnitt mit dem Titel „**Mounts**“ finden, der ungefähr so aussieht:

[![Bild: Mount-Point der Docker-Datei im Terminal](https://www.ionos.at/digitalguide/fileadmin/_processed_/b/2/csm_find-the-mount-point_55e9808df2.webp "Mount-Point der Docker-Datei im Terminal")](https://www.ionos.at/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/find-the-mount-point.jpg) Im Terminal können Sie unter dem Eintrag „Mounts“ ganz einfach nachsehen, welche Dateien Sie auf Ihrem Docker-Container erstellt haben. Hierzu müssen Sie unter dem Punkt „Source“ nachsehen.       ***Quelle/Source* ist das Verzeichnis auf dem Host-Computer.

***Ziel/Destination*** ist der Ordner auf dem Container.

Überprüfen Sie das Quellverzeichnis auf Ihrem Host-Computer. In dem Beispiel ist der Befehl:

```none
sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test
```

Hier finden Sie die Datei **dockerfile-container-hello.txt**, die Sie auf dem Container erstellt haben.

## Vor- und Nachteile der verschiedenen Methoden im Überblick

<table>
  <tbody>
    <tr>
      <td><strong>Methode</strong></td>
      <td><strong>Vorteile</strong></td>
      <td><strong>Nacheile</strong></td>
    </tr>
    <tr>
      <td>Befehl „volume create“</td>
      <td>Schnelle und einfache Handhabung</td>
      <td>Volume auf dem Host wird automatisch erstellt und nur ist schwer zu finden</td>
    </tr>
    <tr>
      <td>Docker-Volume mit Verzeichnis auf dem Host erstellen</td>
      <td>Container kann bestimmtem Ordner des Hosts zugeordnet werden</td>
      <td>Keine Benennung des Volumes und keine Automatisierung mittels [Dockerfile](https://www.ionos.at/digitalguide/server/knowhow/dockerfile/) möglich</td>
    </tr>
    <tr>
      <td>Erstellung mit Docker-Datei</td>
      <td>Automatisierung des Prozesses</td>
      <td>Keine Zuweisung eines Host-Ordners und keine Benennung des Volumes</td>
    </tr>
  </tbody>
</table>

## Teilen von Docker-Volumes zwischen Containern

Es gibt viele Situationen, in denen es sinnvoll ist, ein Docker-Volume zwischen Containern zu teilen, und mehrere Möglichkeiten, dieses Ziel zu erreichen.

### Freigeben eines Volumes auf dem Host

Wenn Sie ein Volume auf dem Host-Computer erstellen, kann es von mehreren verschiedenen Containern gleichzeitig verwendet werden. Auf diese Weise können Sie Daten zwischen Containern und dem Host austauschen.

Für dieses Beispiel erstellen Sie ein Verzeichnis auf dem Host und verwenden dieses Verzeichnis als gemeinsames Volume zwischen zwei Containern.

Beginnen Sie, indem Sie mit folgendem Befehl ein Verzeichnis erstellen, das Sie als Docker-Volume verwenden können:

```none
sudo mkdir /webdata
```

Erstellen Sie in diesem Verzeichnis mit diesem Befehl eine kleine Testdatei:

```none
sudo echo "Hello from the host." >> /webdata/host-hello.txt
```

Als nächstes starten Sie einen Container mit dem Namen **sql-database** aus dem offiziellen PostgreSQL-Image und ordnen **/webdata** auf dem Host mit dem Befehl **/data** auf dem Container zu:

```none
sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash
```

Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, überprüfen Sie, ob das freigegebene Volume mit dem Befehl korrekt eingerichtet ist:

```none
ls /data
```

Sie sehen die Datei **host-hello.txt**, die wir auf dem Host erstellt haben. Fügen Sie mit folgendem Befehl eine Datei zum freigegebenen Volume hinzu:

```none
echo "Hello from the sql-database container." >> /data/sql-hello.txt
```

Verlassen Sie den Container mit  **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.

Starten Sie nun einen Container namens „**Webapp“** aus dem offiziellen PHP+Apache Image und ordnen Sie ***/webdata*** auf dem Host ***/var/www/html*** auf dem Container zu.

```none
sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash
```

Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, überprüfen Sie mit folgendem Befehl, ob das freigegebene Volume korrekt eingerichtet wurde:

```none
ls /var/www/html
```

Sie sehen sowohl die Datei ***host-hello.txt***, die Sie auf dem Host erstellt haben, als auch die Datei *sql-hello.txt*, die Sie auf dem **SQL-Datenbank-Container** erstellt haben.

Fügen Sie jetzt eine Datei aus dem zuletzt erstellten Container hinzu:

```none
echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück. Auf dem Host können Sie sich alle drei Dateien mit folgendem Befehl anzeigen lassen:

```none
sudo ls /webdata
```

Da sich die beiden Container nun ein Verzeichnis teilen, das auf dem Host „lebt“, können **Daten sofort zwischen allen drei Standorten übertragen** werden, indem sie einfach in dieses Verzeichnis verschoben werden.

### Einen Container als gemeinsames Datenvolumen einrichten

Sie können auch einen separaten Container als gemeinsames Datenvolumen einrichten.

Dazu legen Sie zunächst den Datencontainer an. Wenn Sie dann den Container erstellen, der diesen Datencontainer verwenden soll, fügen Sie dem Befehl **docker run** das folgende Argument hinzu:

```none
--volumes-from [name or ID of data container]
```

---

### Hinweis

Dies funktioniert unabhängig davon, ob der Zielcontainer ausgeführt wird oder nicht. Docker-Volumes werden nie gelöscht und bleiben auch nach dem Stoppen des Containers erhalten.

---

Für dieses Beispiel erstellen Sie einen Datencontainer namens „Data-Storage“, der als Datenvolumen dient. Zusätzlich werden zwei weitere Container erstellt, die sich den Datencontainer als Speichervolumen teilen.

Starten Sie zunächst den **Data-Storage-Container** aus dem offiziellen CentOS-7-Image:

```none
sudo docker run -it -v /shared-data --name data-storage centos /bin/bash
```

Fügen Sie dann eine kleine Datei zum Ordner **/shared-data** hinzu:

```none
echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.

Starten Sie nun den **App-Container** aus dem offiziellen Python-Image und mounten Sie den **Datenspeicher-Container** als Volume:

```none
sudo docker run -it --name app --volumes-from data-storage python /bin/bash
```

Listen Sie die Dateien im freigegebenen Volume mit folgendem Befehl auf:

```none
ls /shared-data
```

Wie Sie sehen können, wurde der Ordner **/shared-data** aus dem Ordner **/shared-data** auf dem Datenspeicher-Container gemountet und enthält die Datei **data-storage-hello.txt**.

Fügen Sie jetzt eine Datei aus dem App-Container hinzu:

```none
echo "Hello from the app container." >> /shared-data/app-hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.

Starten Sie schließlich den **Web-Container** aus dem offiziellen Apache-Image und mounten Sie den **Datenspeicher-Container** als Volume:

```none
sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash
```

Listen Sie die Dateien im freigegebenen Volume mit diesem Befehl auf:

```none
ls /shared-data
```

Sie sehen nun die von uns auf den **Speicher-** und **App-Containern** erstellten Dateien.

## Volume schreibgeschützt mounten

In diesem Artikel haben wir Volumes bisher mit Schreib-Lese-Zugriff erstellt bzw. gemountet.

Wenn Sie einen Container darauf beschränken möchten, **nur Lesezugriff** auf ein Volume zu haben, fügen Sie einfach ***:ro*** für „read-only“ zu dem in der *-**v***-Anweisung angegebenen Containervolumen hinzu:

```none
docker run -v /directory:/path:ro
```

Dies kann beispielsweise für Sicherheitszwecke nützlich sein. Auch wenn Sie sicherstellen möchten, dass die Daten in einem bestimmten Volume gegen versehentliches Überschreiben oder Löschen durch einen anderen Docker Container geschützt sind, ist der Read-only-Zugriff eine Überlegung wert.

Erstellen Sie z. B. ein Volume auf dem Host mit dem Namen ***limited-access*** mit folgendem Befehl:

```none
sudo docker volume create --name limited-access
```

Führen Sie dann einen Container aus dem **CentOS**-Image mit dem Namen ***allowed-to-write*** aus und ordnen Sie das Volume „**Limited-Access“** als normales (read-write) Volume zu:

```none
sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash
```

Sobald Sie sich an der Eingabeaufforderung dieses Containers befinden, erstellen Sie eine Testdatei mit dem Befehl:

```none
echo "Hello from the container that is allowed to write." >> /data/hello.txt
```

Verlassen Sie den Container mit **\[Strg\] + \[P\]** und **\[Strg\] + \[Q\]** und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.

Als nächstes führen Sie einen Container aus dem **CentOS-Image** mit dem Namen ***not-allowed-to-write*** aus und ordnen diesem das **Volume Limited-Access** als **Read-only-Volume** zu:

```none
sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash
```

Wenn Sie versuchen, eine Testdatei auf dem freigegebenen Volume mit einem Befehl wie diesem zu erstellen:

```none
echo "Hello from the container that is not allowed to write." >> /data/no-access.txt
```

erhalten Sie einen Fehler, der erklärt, dass dieser Container keinen Schreibzugriff auf dieses Verzeichnis hat.

```none
bash: /data/no-access.txt: Read-only file system
```


This is a markdown version of: [https://www.ionos.at/digitalguide/server/knowhow/docker-container-volumes/](https://www.ionos.at/digitalguide/server/knowhow/docker-container-volumes/) for AI/LLM consumption.