Over het algemeen zijn Docker-containers kortstondig en worden ze net zo lang uitgevoerd als nodig is tot de opdracht die in de container is uitgevoert, te voltooien. Alle gegevens die in de container zijn gemaakt, zijn standaard alleen beschikbaar vanuit de container en alleen terwijl de container actief is.
Docker-volumes kunnen worden gebruikt om bestanden te delen tussen een hostsysteem en de Docker-container. Laten we bijvoorbeeld zeggen dat je de officiƫle Docker Nginx-image wilde gebruiken en een permanente kopie van de logbestanden van Nginx wilde bewaren om later te analyseren. Standaard nginx
logt in op de Docker-image in de /var/log/nginx
map in de Docker Nginx-container. Normaal gesproken is het niet bereikbaar vanaf het hostbestandssysteem.
In deze les onderzoeken we hoe je gegevens vanuit de container toegankelijk kunt maken op de hostcomputer.
Met de volgende opdracht wordt een map gemaakt met de naam nginxlogs
in de homedirectory van uw huidige gebruiker en wordt deze gekoppeld aan /var/log/nginx
de container:
docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx
Laten we even de tijd nemen om deze opdracht in detail te bekijken:
--name=nginx
geeft de container een naam, zodat we er gemakkelijker naar kunnen verwijzen.-d
maakt het proces los en voert het op de achtergrond uit. Anders zouden we alleen een lege Nginx-prompt bekijken en deze terminal niet kunnen gebruiken totdat we Nginx hebben gestopt.-v ~/nginxlogs:/var/log/nginx
zet een mount-volume op dat de /var/log/nginx
directory vanuit de Nginx-container koppelt aan de ~/nginxlogs
directory op de hostcomputer. Docker gebruikt een :
om het hostpad te splitsen van het containerpad, en het hostpad komt altijd op de eerste plaats.-p 5000:80
stelt een poort in. De Nginx-container luistert 80
standaard op poort . Deze optie wijst de poort 80
van de container toe aan de poort 5000
op het hostsysteem.nginx
specificeert dat de container moet worden gebouwd op basis van de Nginx-afbeelding, die de opdracht geeft nginx -g "daemon off"
om Nginx te starten.Let op: De -v
optie is erg flexibel. Het kan een volume binden of een naam geven met slechts een kleine aanpassing in de syntaxis. Als het eerste argument begint met een /
of ~/
, maakt je een mount. Verwijder dat, en je geeft het volume een naam.
-v /path:/path/in/container
koppelt de host-directory /path
aan de/path/in/container
-v path:/path/in/container
maakt een volume met de naam path
zonder relatie met de host.We hebben nu een kopie van Nginx die in een Docker-container op onze computer draait, en de poort van onze hostcomputer 5000
verwijst rechtstreeks naar die kopie van de poort van Nginx 80
.
Laad het adres in een webbrowser, met behulp van het IP-adres of de hostnaam van je server en het poortnummer : . Je zou Nginx moeten zien op:http://your_server_ip:5000
Interessanter is dat als we in de ~/nginxlogs
directory op de host kijken, we zien dataccess.log
is gemaakt door de container nginx
die ons verzoek zal tonen:
cat ~/nginxlogs/access.log
Dit zou iets moeten weergeven als:
Output
192.168.182.130 - - [11/Feb/2021:16:08:46 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
192.168.182.128 - - [11/Feb/2021:16:10:54 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0" "-"
192.168.182.128 - - [11/Feb/2021:16:10:54 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.182.130/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0" "-"
192.168.182.128 - - [11/Feb/2021:16:11:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0" "-"
192.168.182.128 - - [11/Feb/2021:16:11:04 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.182.130:5000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0" "-"
Als je wijzigingen in de ~/nginxlogs
map aanbrengt, kun je deze ook in realtime vanuit de Docker-container bekijken.