docker volume
Dat wordt een probleem bij databases, configuraties of gebruikersuploads. Die moeten blijven bestaan, ook als de container die ze gebruikte allang verwijderd is. Een Docker volume is een opslagruimte die buiten de container leeft, beheerd door de Docker-daemon, en in de container gemount wordt als een gewone map.
De container schrijft naar `/data`, maar die bestanden liggen fysiek op de host in een door Docker gereserveerde directory. Verwijder je de container, dan blijft het volume bestaan. Die scheiding tussen applicatie en data is het kernprincipe.
Volume aanmaken: expliciet of impliciet
Je kunt een volume op twee manieren krijgen. Expliciet:```bash docker volume create mijn-data ```
Dit geeft je een volume met een naam die je zelf kiest. Geen opties, geen verrassingen. Het volume staat er, klaar voor gebruik.
Je kunt ook een naamloos volume laten aanmaken door Docker zelf. Dat gebeurt wanneer je een container start met een mountpunt dat nog niet aan een volume gekoppeld is:
```bash docker run -d -v /data nginx ```
Docker genereert dan een willekeurige naam als `abc123def456`. Werkt prima, maar je weet achteraf niet meer wat erin staat. Voor productie of gedeelde omgevingen is een expliciete naam de moeite waard — die kost je één commando en bespaart je later het raden.
Volume aan een container koppelen
Een volume koppel je tijdens `docker run` met `-v` of `--mount`. De `-v`-vorm is korter:```bash docker run -d -v mijn-data:/data nginx ```
`--mount` is explicieter en leest beter in scripts:
```bash docker run -d --mount source=mijn-data,target=/data nginx ```
Alle bestanden die de container in `/data` schrijft, komen in het volume terecht. Verwijder je de container, dan blijft `mijn-data` bestaan. Start je een nieuwe container met dezelfde `-v`-optie, dan staat je data er weer.
Waarom volumes beter zijn dan bind mounts
Bind mounts koppelen een map van de host direct aan een map in de container:```bash docker run -d -v /pad/op/host:/data nginx ```
Dat geeft controle, maar kost ook iets. Je moet weten waar je host-mappen liggen, de paden moeten kloppen op elke machine waar je draait, en in multi-host omgevingen wordt dat al snel een administratieve nachtmerrie. Volumes worden volledig door Docker beheerd. Ze werken hetzelfde op Linux en Windows, je kunt ze delen tussen containers, en volume drivers koppelen ze aan externe opslag zoals NFS of cloud storage. Docker documenteert volumes als de aanbevolen aanpak voor persistente data.
Een nadeel van volumes: je kunt niet zomaar in je favoriete editor bij de bestanden op de host. Daarvoor moet je een container starten die het volume mount, of `docker run -it --rm -v mijn-data:/data alpine sh` gebruiken. Bind mounts blijven daarom handig voor development, waar je direct toegang wilt tot je broncode.
Volumes beheren met de CLI
Overzicht van alle volumes op je host:```bash docker volume ls ```
De uitvoer toont naam en driver (meestal `local`). Filteren kan met `--filter`. Alleen volumes die door geen enkele container gebruikt worden — zogenaamde dangling volumes — vind je zo:
```bash docker volume ls --filter dangling=true ```
Details over een specifiek volume:
```bash docker volume inspect mijn-data ```
Dat geeft een JSON-object met driver, mountpoint op de host, labels en status. In scripts kun je met `--format` alleen de velden pakken die je nodig hebt:
```bash docker volume inspect --format '{{ .Mountpoint }}' mijn-data ```
Volumes opruimen
Een volume verwijderen dat niet meer nodig is:```bash docker volume rm mijn-data ```
Docker weigert een volume te verwijderen dat nog aan een container gekoppeld is, ook als die container gestopt is. Dat is een veiligheidsmaatregel tegen dataverlies. De `-f`-optie forceert verwijdering, maar gebruik die alleen als je zeker weet dat geen enkele container het volume nog nodig heeft.
Voor het opruimen van alle ongebruikte volumes in één keer:
```bash docker volume prune ```
Docker vraagt om bevestiging. Met `-a` verwijder je ook volumes die wel een naam hebben maar nergens aan gekoppeld zijn; met `-f` sla je de bevestiging over. `docker volume prune -a -f` is een effectieve manier om je host op te schonen — en een goede test van je backups.
Verificatie
Controleer of je volume correct gekoppeld is en data bewaart:```bash docker volume ls docker volume inspect mijn-data ```
Schrijf een testbestand in een container, verwijder de container, en start een nieuwe met hetzelfde volume:
```bash docker run --rm -v mijn-data:/data alpine touch /data/test.txt docker run --rm -v mijn-data:/data alpine ls /data ```
Zie je `test.txt` in de tweede uitvoer, dan werkt het volume.
Veelgemaakte fouten
Volume verwijderen lukt niet: "volume is in use" Een gestopte container houdt het volume vast. Vind de container met `docker ps -a`, verwijder hem met `docker rmData lijkt verdwenen na `docker run` zonder `-v` Zonder volume-koppeling schrijft de container naar zijn eigen beschrijfbare laag. Die verdwijnt bij `docker rm`. Het volume is er nog wel — je hebt alleen een nieuwe container zonder koppeling gestart.
Volumes op een andere host kwijt Volumes zijn lokaal aan de host waar Docker draait. Een volume op machine A is niet zichtbaar op machine B. Voor multi-host setups heb je een volume driver nodig die externe opslag gebruikt, zoals NFS of cloud storage.