Skip to main content

Dockerfiles

Dockerfiles zijn cruciale bouwstenen om te werken met containers. Het zijn tekstbestanden die beschrijven hoe de container opgebouwd wordt. Elke lijn die daarin voorkomt creëert een extra laag in de container. Die lagen kwamen al eerder aan bod toen we docker inspect image commando uitvoerden.

FROM ubuntu:22.04 
RUN apt-get update
RUN apt-get install apache2 -y
RUN apt-get install apache2-utils -y
RUN apt-get clean
EXPOSE 80
CMD [“apache2ctl”, “-D”, “FOREGROUND”]

Bovenstaand voorbeeld toont een Dockerfile waarbij een container wordt aangemaakt op basis van Ubuntu. Met FROM geef je aan welke base image je wil gebruiken. Hier wordt Ubuntu gekozen, maar als je mikt op een extreem kleine en snelle image, kan je ook opteren voor bijvoorbeeld Alpine. met RUN worden daarna een aantal acties uitgevoerd op de container. Let wel, zoals eerder vermeld zal elke lijn in het bestand een extra laag aanmaken in de container. Het zou dus efficiënter zijn om de verschillende apt-get install commando's te combineren. Met EXPOSE geef je aan welke poort(en) moeten zichtbaar zijn voor de buitenwereld. Tenslotte wordt CMD gebruikt om aan te geven welk proces moet gestart worden.

info

EXPOSE is in de Dockerfile eerder informatief en zorgt niet echt voor een open poort. Met "docker run -p" kunnen sowieso andere poorten effectief gekoppeld worden. EXPOSE laat eigenlijk, aan de gebruiker die de container zal starten, weten op welke poort(en) de applicatie luistert. Wel kan je met "docker run -P" (let op de hoofdletter) alle EXPOSE poorten automatisch laten mappen met een random poort op de host (meestal niet zo handig).

De mogelijkheden voor zo'n bestand zijn uiteraard veel ruimer dan wat hierboven beschreven werd. Daarvoor verwijzen we naar enkele externe bronnen:

Best practices

Enkele best practices bij het maken van Dockerfiles

  • Combineer gelijkaardige commando's in één regel om het aantal lagen beperkt te houden (bijvoorbeeld de installatie van verschillende pakketten in één regel in plaats van meerdere)
  • Zet commando's die vaak veranderen (vb source files kopiëren) relatief onderaan je Dockerfile, dat komt de snelheid bij het builden ten goede omdat cache (de verschillende lagen) dan optimaal kan gebruikt worden.
  • Vermeld steeds de tags van base images zodat je zeker bent dat je image ook op lange termijn stabiel blijft. (vb FROM ubuntu:22.04 ipv FROM ubuntu)

De container bouwen

Eens de Dockerfile klaar is, kan daarvan een image gemaakt worden met docker build

# bouw een image op basis van de Dockerfile in de huidige map
docker build .

# bouw een image met meteen een tag aan gekoppeld
docker build . -t roelvs/dockie

Bijhorende Labs

Maak een container op basis van Alpine waarin je Git installeert:

De verschillende instructies gedemonstreerd:

Uitbreidingslabs