Online zetten: op de achtergrond
Een server houd je niet open in een terminal. Je start je container op de achtergrond, met een naam, en leert hem beheren zonder dat hij een terminal bezet houdt.
Starten met een naam
Met -d (detached) draait de container op de achtergrond, en met --name geef je hem een naam die je onthoudt:
docker run -d --name gastenboek -p 8000:8000 gastenboek
Docker geeft een lange code terug, het nummer van de container, en je prompt is meteen weer vrij. Kijk wat er draait:
docker ps
Bij PORTS zie je de deur die -p openzette. Wat je site in de terminal zou zetten, lees je nu met logs:
docker logs gastenboek
Met docker logs -f gastenboek blijf je meekijken, tot je Ctrl+C drukt. Dat stopt alleen het meekijken, niet je site.
Stoppen, starten en weggooien
| Commando | Wat er gebeurt |
|---|---|
docker stop gastenboek | de container stopt, en blijft bestaan |
docker start gastenboek | dezelfde container draait weer |
docker rm gastenboek | de gestopte container is weg |
docker rm -f gastenboek | stoppen en weggooien in één keer |
Een gestopte container zie je met docker ps -a, met Exited bij de status. Daar staat ook de container uit les 16 nog, met een naam die Docker zelf verzon.
Weg is weg
Een container heeft een eigen laag bovenop het image. Alles wat er tijdens het draaien bijkomt, komt in die laag: hier gastenboek.db en gebruikers.db, naast main.py in /app. Gooi je de container weg, dan gaat die laag mee.
Probeer het. Maak een account, schrijf een bericht, en start daarna een nieuwe container met dezelfde naam. Die naam is pas vrij als de oude weg is, dus eerst rm -f:
docker rm -f gastenboek
docker run -d --name gastenboek -p 8000:8000 gastenboek
Je gastenboek is leeg, en je account is weg. De nieuwe container begint bij het image, en daarin staan geen databases. Voor een server is dat een probleem: bij elke nieuwe versie gooi je de container weg. Daarom zet je de databases straks buiten de container.
Er gaat iets mis
The container name is already in use
docker: Error response from daemon: Conflict. The container name "/gastenboek" is already in use by container "c6e0858343ca…". You have to remove (or rename) that container to be able to reuse that name.
Oorzaak: er bestaat al een container met die naam, ook als hij gestopt is.
Oplossing: gooi de oude weg met docker rm -f gastenboek, en start opnieuw.
Eerst port is already allocated, daarna Conflict
De eerste docker run geeft port is already allocated, en als je hem opnieuw typt, staat er Conflict.
Oorzaak: Docker maakte de container gastenboek al aan voordat de poort misging. Hij staat in docker ps -a met Created bij de status, en houdt de naam bezet.
Oplossing: maak de poort vrij zoals in les 16, gooi de container weg met docker rm -f gastenboek, en start opnieuw.
De browser krijgt geen antwoord
docker ps toont je container met Up, maar http://127.0.0.1:8000 laadt niet.
Oorzaak: je startte de container zonder -p. Bij PORTS staat dan niets: er is geen deur.
Oplossing: gooi de container weg en start hem opnieuw met -p 8000:8000.
Opdrachten
Opdracht 1: Investigate - Wie bezocht je site?
Maak een account en schrijf een bericht. Kijk daarna met docker logs welke verzoeken je browser deed.
Antwoord
docker logs gastenboek
Onder de startregels staat een regel per verzoek, met de methode, het pad en de statuscode: POST /registreer met 303, en daarna GET /gastenboek met 200. Het adres vooraan is niet dat van je laptop maar van het netwerk van Docker. Dat komt terug in les 23.
Door naar les 18: je databases in één map.