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.
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
ipvFROM 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:
- Lab #2: ADD instruction
- Lab #3: COPY instruction
- Lab #4: CMD instruction
- Lab #5: ENTRYPOINT instruction
- Lab #6: WORKDIR instruction
- Lab #7: RUN instruction
- Lab #8: ARG instruction
- Lab #9: ENV instruction
- Lab #10: VOLUME instruction
- Lab #11: EXPOSE instruction
- Lab #12: LABEL instruction
- Lab #16: Entrypoint Vs RUN
- Writing Dockerfile with Hello Python Script Added