Online zetten: je berichten bewaren
Een container gooi je weg zodra er een nieuwe versie is. In les 17 zag je wat er dan met je berichten gebeurt: ze gaan mee. Daarom komen de databases buiten de container, in een volume: opslag die Docker los van elke container bewaart.
Sinds les 18 staan alle databases in één map, /app/data. Die map zet je in een volume:
docker rm -f gastenboek
docker run -d --name gastenboek -p 8000:8000 -v gastenboek-data:/app/data gastenboek
-v gastenboek-data:/app/data betekent: koppel het volume gastenboek-data aan de map /app/data in de container. Voor de dubbele punt staat de naam van het volume, erna de map in de container. Bestaat het volume nog niet, dan maakt Docker het. Wat je site in /app/data schrijft, komt in het volume.
Bekijk het volume:
docker volume ls
DRIVER VOLUME NAME
local gastenboek-data
De proef
Maak een account, schrijf een bericht, en gooi de container weg. Start een nieuwe, met hetzelfde volume:
docker rm -f gastenboek
docker run -d --name gastenboek -p 8000:8000 -v gastenboek-data:/app/data gastenboek
De container is nieuw, maar de databases kwamen uit het volume.
Een nieuw volume begint met wat er in het image in die map stond. In je image is /app/data een lege map van app (uit de vorige les), dus het volume is ook van app. Zo mag je site er meteen in schrijven.
Er gaat iets mis
Bij een volume gaat het mis zonder foutmelding. Je site werkt, maar na een docker rm zijn de berichten toch weg.
Een andere naam
Oorzaak: je typte de naam van het volume een keer anders, zoals gastenboek-date of gastenboekdata. Docker maakt dan zonder iets te zeggen een nieuw, leeg volume.
Oplossing: kijk met docker volume ls. Staan er twee, gebruik dan steeds dezelfde naam. Een volume dat je niet meer nodig hebt, gooi je weg met docker volume rm en de naam.
Een andere map
Oorzaak: de map na de dubbele punt is niet de map waar je site schrijft, zoals -v gastenboek-data:/data. Het volume blijft leeg, en de databases komen in de container, in /app/data.
Oplossing: de map moet precies /app/data zijn: WORKDIR /app uit de Dockerfile plus data uit main.py.
volume is in use
Error response from daemon: remove gastenboek-data: volume is in use - [3eb36ed7ad44…]
Oorzaak: je probeert een volume weg te gooien dat nog aan een container hangt, ook een gestopte.
Oplossing: gooi eerst de container weg. Bedenk wel dat een volume weggooien je berichten weggooit, en dat dat niet terug te draaien is.
Opdrachten
Opdracht 1: Investigate - Wat zit er in het volume?
Je kunt een volume ook aan een andere container hangen. Kijk met een losse container wat erin staat:
docker run --rm -v gastenboek-data:/data python:3.13-slim ls -l /data
Welke bestanden staan erin? Van wie zijn ze, en waarom staat er een getal in plaats van een naam?
Antwoord
Je ziet gastenboek.db en gebruikers.db, en meer als je site meer databases heeft. Als eigenaar staat er 999 999, en geen naam. De gebruiker app heeft in jouw image nummer 999, maar in het image python:3.13-slim bestaat geen gebruiker app. Linux bewaart bij een bestand alleen het nummer; de naam zoekt hij op in de gebruikers van de computer, of hier van de container. Je ziet ook dat een volume niet aan één container vastzit: elke container die hem koppelt, ziet dezelfde bestanden.
Door naar les 21: alles in één bestand.