‫Laten we een duik nemen in het Dockerfile, dat eigenlijk een recept is voor het maken van uw afbeelding.
‫Tot nu toe zijn alle Docker-images die we hebben gebruikt gemaakt van Dockerfiles, waar je ze kunt bekijken
‫op Docker Hub.
‫Als je mijn repository hebt gekloond van de bronnen die in de eerste sectie worden vermeld, zou je een map met voorbeeldbestand 1 van docker
‫moeten zien, en daarin zouden we slechts één bestand moeten hebben. Een Dockerfile.
‫We gaan regel voor regel langs en praten over deze verschillende strofen. Een Dockerfile lijkt op een shellscript te lijken,
‫maar is het niet.
‫Het is geen batchbestand, het is geen shellscript. Het is een totaal andere bestandstaal die
‫uniek is voor Docker en de standaardnaam is Dockerfile met een hoofdletter D.
‫Maar vanaf de opdrachtregel, wanneer u een Dockerfile moet afhandelen met behulp van
‫de docker-opdracht, kunt u het streepje f gebruiken. Wat eigenlijk gebruikelijk is bij veel van de tools met Docker,
‫je kunt dash f gebruiken om een ander bestand op te geven dan een standaardbestand.
‫Dus eerst is het van-commando. Het from-commando staat in elk Dockerfile. Het is verplicht om er te zijn.
‫Het is normaal gesproken een minimale distributie.
‫In dit geval is dat Debian.
‫Maar tegenwoordig wordt het vaak Alpine.
‫En echt, de reden dat u deze zou gebruiken, is om uzelf tijd en pijn te besparen. Omdat deze minimale distributies eigenlijk veel kleiner zijn
‫dan de cd's die je zou gebruiken om er een virtuele machine van te installeren.
‫De Ubuntu-versie bevat bijvoorbeeld niet eens cURL, terwijl het duidelijk is dat als u een volledige
‫Ubuntu-installatie op een VM installeert, er cURL en een heleboel andere opdrachten al zijn geïnstalleerd.
‫Omdat al deze distributies officiële afbeeldingen zijn, betekent dit dat ze altijd up-to-date zijn met
‫de nieuwste beveiligingspatches en dat u erop kunt vertrouwen en erop kunt vertrouwen.
‫En een van de belangrijkste voordelen van het gebruik ervan in containers is dat je hun pakketdistributiesystemen kunt gebruiken om de software
‫die je nodig hebt in je pakket te installeren.
‫In dit geval gebruiken we eigenlijk de Jessie-release, die achter de dubbele punt zit.
‫En, zoals je je herinnert uit ons Docker Hub-gesprek, zijn er veel verschillende opties die je hier
‫kunt specificeren voor de Debian-repository.
‫Vervolgens hebben we de ENV-stanza en ENV is voor omgevingsvariabelen.
‫Het is een manier om omgevingsvariabelen in te stellen, die eigenlijk heel belangrijk zijn in containers,
‫omdat ze de belangrijkste manier zijn waarop we sleutels en waarden instellen voor het bouwen van containers en voor het uitvoeren van containers.
‫In dit geval stelt het in feite de versie van Nginx in die we willen installeren en deze
‫omgevingsvariabele zal zo worden ingesteld dat alle volgende regels deze kunnen gebruiken.
‫Ter herinnering aan eerdere lezingen: elk van deze strofen is een echte laag in onze
‫Docker-afbeelding.
‫Dus de volgorde ervan doet er echt toe, omdat het top-down werkt.
‫Zoals je zult zien aan deze relatief lange opdracht hier voor de volgende. Je zult zien dat het eruit ziet als
‫één lang commando.
‫Wat het doet, is eigenlijk gewoon shell-commando's uitvoeren in deze container terwijl het deze aan het bouwen
‫is.
‫Meestal zie je run-commando's wanneer je software moet installeren met een pakketrepository, of je
‫moet wat uitpakken, of wat bestandsbewerkingen in de container zelf.
‫Opdrachten voor uitvoeren kunnen ook shellscripts uitvoeren die u eerder in het bestand hebt gekopieerd of opdrachten die
‫u op dat moment in
‫het bestand vanuit de container kunt openen.
‫Aangezien we van Debian komen, heeft dit run-commando toegang tot alle commando's en binaire bestanden die met
‫die release zouden zijn geïnstalleerd.
‫En in deze voor Nginx voegt deze lijst met opdrachten min of meer een sleutel toe aan de repository
‫waar je het pakket kunt krijgen om de nieuwste Nginx te installeren vanuit de officiële Nginx-repository.
‫Er zijn een paar dingen die echt belangrijk zijn bij het maken van goede Dockerfiles en we zullen
‫hier later meer over praten, waar we het hebben over best practices.
‫Maar twee dingen om op te merken.
‫De reden dat we al deze commando's hier met de dubbele ampersand toevoegen, zodat ze achter elkaar
‫worden geketend, is omdat, als je het je herinnert, elke strofe zijn eigen laag is.
‫Dit zorgt ervoor dat al deze opdrachten in één enkele laag passen.
‫Het scheelt ons een beetje tijd.
‫Het bespaart ons ruimte. En het is zo gewoon dat je het waarschijnlijk in elk Dockerfile op Docker Hub zult zien.
‫Oké, op regel 27 hebben we nog een run-commando.
‫Deze heeft alles te maken met het verwijzen van onze logbestanden naar de stdout
‫en naar de stderr.
‫We zullen later zien dat de juiste manier om in een container te loggen, is om niet in een logbestand te loggen. En er is geen syslogd of
‫een andere syslog-service in
‫een container. Docker regelt eigenlijk al onze logboekregistratie voor ons. Het enige wat we in
‫de container hoeven te doen, is ervoor zorgen dat alles wat we in de logs willen vastleggen, tot stdout wordt
‫spit en stderr en docker zullen de rest afhandelen.
‫Er zijn eigenlijk logboekstuurprogramma's die we in de Docker Engine zelf kunnen gebruiken om alle logboeken voor alle
‫containers op onze host te beheren.
‫En dat is dus eigenlijk wat je met ze wilt doen.
‫Het voegt meer complexiteit toe aan uw app als uw app de logboekregistratie zelf doet.
‫En dan, als je te maken hebt met bestanden in elke container, heb je nu een
‫probleem hoe je die bestanden eruit krijgt, en doorzoekbaar en toegankelijk. Hier nemen we de standaard Nginx-logboeken en we koppelen
‫ze eigenlijk aan de stdout.
‫Zodat Docker ze kan vangen.
‫We hebben ook een bloot commando.
‫Standaard zijn er geen TCP- of UDP-poorten
‫geopend in een container. Het stelt niets van de container bloot aan een virtueel netwerk, tenzij we
‫het hier vermelden.
‫En, natuurlijk, omdat dit een web- en proxyserver is, zal het 80 en 443 blootleggen.
‫Dit bloot-commando betekent niet dat deze poorten automatisch worden geopend op onze host.
‫Dat is wat het dash P-commando is wanneer we docker run gebruiken.
‫Ten slotte hebben we hier de CMD. De CMD is een vereiste parameter die de laatste
‫opdracht is die wordt uitgevoerd telkens wanneer u een nieuwe container vanuit de afbeelding start, of elke keer dat u een gestopte container opnieuw start.
‫Er is echt uitstekende documentatie over al deze strofen, plus nog veel meer, waar we later op in zullen gaan, op
‫de Docker-documentatiewebsite op docs. havenarbeider. com, die
‫u kunt vinden in de bronnen van deze lezing.
‫Oké, dit zijn de basis, toch? Deze vijf verschillende strofen zijn vrij normaal in elk Dockerfile.
‫Sommigen van hen zijn vereist.
‫Sommigen van hen, zoals de run, en de ENV, en de exposure, zijn optioneel, maar ze zijn vrij typisch voor de
‫meeste containers waarvoor je afbeeldingen gaat maken.