Wenn man sich mit Container beschäftigt kommt irgendwann der Punkt, wo man Daten außerhalb des Containers ablegen möchte um zum Beispiel diese in einen anderen Container einbinden zu können. Um dies zu bei Docker zu realisieren, kann ein sogenanntes Volume erstellen. Wie man dies genau macht, schauen wir uns nun hier im Artikel an.
Inhaltsverzeichnis
Warum Volume anstelle von bind mounts?
Es gibt ein paar sinnvolle Gründe, warum man Volumes anstelle von bind mounts verwenden sollte. Hier mal eine kleine Liste
- Volumes sind einfacher zu sichern oder zu migrieren als bind mounts
- Volumes können mit Docker CLI-Befehlen oder der Docker-API verwaltet werden.
- Volumes funktionieren sowohl auf Linux- als auch auf Windows-Containern.
- Volumes können sicherer auf mehrere Container verteilt werden.
- Mit Volume-Treibern können Sie Volumes auf entfernten Hosts oder Cloud-Providern speichern, um den Inhalt von Volumes zu verschlüsseln oder andere Funktionen hinzuzufügen.
- Neue Volumes können durch einen Container vorbestückt werden.
Ich denke es sind eine gute Gründe dabei, warum man sich mit Volumes beschäftigen sollte.
Anlegen eines Docker Volume
Als erstes müssen wir ein Volume anlegen, welches wir in einem Docker Container einbinden können.
1 2 | docker volume create vol1 vol1 |
Dieses Volume kann man sich mit docker volumes ls anzeigen lassen.
1 2 3 4 5 6 | docker volume ls DRIVER VOLUME NAME local a9d89e372b08fe51a1c1f310971a9bef5ceb0f7d93c55d7aeaa4436a7fd27c69 local d13a76d8c6192b5409c6729c217c5a8ad1feb5453a06a3c834097144c9bf7b08 local dd0f6e7a1d3cb321c23eecbccc9e7f9ddf5ab447d70bde576821d802c4f214b6 local vol1 |
Will man etwas genauere Informationen zu einem Volume haben, kann man sich diese mit dem Befehl docker volume inspect anzeigen lassen.
1 2 3 4 5 6 7 8 9 10 11 12 | docker volume inspect vol1 [ { "CreatedAt": "2018-07-26T15:25:26Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/vol1/_data", "Name": "vol1", "Options": {}, "Scope": "local" } ] |
Starten eines Container mit Docker Volume
Damit ein Volume einen Container zugeordnet werden kann, verwendet man den Parameter –mount. Diesem Parameter gibt man dann über source und target die benötigten Pfadangaben mit. Das ganze sieht dann so aus.
1 2 | docker run -d --name test_vol --mount source=vol1,target=/mnt redis:latest dfdd9325b435394be7ff8343848a61f23decfe6d93323bc754b35db6c7c39def |
Wenn man sich den laufenden Container nun mit docker inspect anschaut, sieht man das im Abschnitt Mounts unser Volume vol1 mit aufgelistet wird. Das heißt es steht innerhalb des Containers zur Verfügung.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | "Mounts": [ { "Type": "volume", "Name": "vol1", "Source": "/var/lib/docker/volumes/vol1/_data", "Destination": "/mnt", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "1a3cafe7c2c6ddae60780c5046bb36cce6ee2a322317c0592e43005a0ad80f7a", "Source": "/var/lib/docker/volumes/1a3cafe7c2c6ddae60780c5046bb36cce6ee2a322317c0592e43005a0ad80f7a/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], |
Iljas meint
Würdest du immernoch –mount verwenden oder mittlerweile eher -v zum einbinden von Volumes in einen Container?