Ga naar hoofdinhoud

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.

Controlevraag
Je verandert een template, bouwt het image opnieuw, gooit de container weg en start een nieuwe met hetzelfde -v. Wat zie je?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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.