Meer informatie over Dockerfile
Stappen in de Systematische Probleem Aanpak
1. Doel
Automatiseren van het Docker image build-proces via declaratieve instructies.
2. Subdoelen
Splits het proces in subdoelen, zoals:
- Aanmaken Dockerfile
- Selecteren van een basisimage
- Inrichten van een werkdirectory
- Kopiëren van bestanden
- Installeren van afhankelijkheden
- Exposen van poorten
- Definiëren van een startcommando
Casus
Ontwerp een Dockerfile voor een Node.js API in 7 stappen:
Doel Dockerfile Instructie Resultaat in Image 1. Aanmaken Dockerfile Maak in je projectmap een bestand zonder extensie Dockerfile
Lege Dockerfile klaar voor instructies 2. Selecteren van een basisimage FROM node:18-alpine
Minimale Node.js runtime-omgeving 3. Inrichten van een werkdirectory WORKDIR /app
Volgende commando’s draaien in /app
4. Kopiëren van bestanden dockerfile<br>COPY package*.json ./<br>COPY src/ ./src/
package.json
, lockfiles én broncode in de image5. Installeren van afhankelijkheden RUN npm ci --production
Gepinde npm-packages geïnstalleerd 6. Exposen van poorten EXPOSE 3000
Poort 3000 open voor inkomend verkeer 7. Definiëren van een startcommando CMD ["node", "src/index.js"]
Container start je API automatisch bij opstarten
3. Fasen
-
Aanmaken Dockerfile Actie: Maak een bestand aan zonder extensie en noem het Dockerfile. Plaats dit bestand in je projectmap. Bij C# is dit in dezelfde folder als .csproj en in Javascript in de folder met package.json. Resultaat: Een lege Dockerfile in je project.
-
Base Image Definiëren
Actie: Selecteer een officiële base image die past bij je applicatie (bijv.python:3.11-slim
ofalpine
). Deze base images zijn te vinden op Docker Hub. Zet het commandoFROM
met daarachter de naam van de base image in bovenaan de Dockerfile om deze te gebruiken. Resultaat: Een schone, gestandaardiseerde basis. -
Werkomgeving Configureren
Actie: Plaats het commandoWORKDIR
met daarachter het pad naar een folder. Het pad is niet altijd nodig en is afhankelijk van je applicatie. Als je bijvoorbeeld werkt met Node.js, zal het pad/app
zijn. Resultaat: Een pad waar binnen de container waar de volgende commandos op uitgevoerd worden. -
**Bestanden Kopiëren
Actie: Gebruik hetCOPY
-commando om projectbestanden vanaf je pc naar de image te kopiëren wanneer deze gebouwd wordt. Je kan bijvoorbeeldCOPY . .
gebruiken om alle bestanden naar de directory te kopiëren. Resultaat: Alle benodigde bestanden (code, configuraties) zijn in de image aanwezig. -
Afhankelijkheden Installeren en Build-stappen
Actie: GebruikRUN
om:- Afhankelijkheden te installeren (bijv.
RUN npm install
voor JavaScript ofRUN pip install -r requirements.txt
voor Python). - De applicatie te bouwen (bijv.
RUN npm run build
voor een React-app ofRUN dotnet publish -c Release
voor C#).
Resultaat: Afhankelijkheden zijn geïnstalleerd en de applicatie is klaar voor gebruik.
- Afhankelijkheden te installeren (bijv.
Tip
Plaats dit na het kopiëren van dependency-bestanden om Docker’s cache optimaal te benutten.
-
Poort Exposen
Actie: Gebruik hetEXPOSE
-commando in de Dockerfile om aan te geven op welke poort(en) de container luistert. Dit is dus de poort waar je jouw applicatie vind als je deze lokaal draait. Bij Python Flaks staat dit standaard op poort 5000. Deze kan dan opengezet worden metEXPOSE 5000
.
Resultaat: Docker weet welke poorten relevant zijn voor de applicatie. -
Startcommando Definiëren (CMD)
Actie: GebruikCMD
om het standaardcommando te specificeren dat de applicatie start.
Voorbeelden:- JavaScript:
CMD ["node", "index.js"]
- C#:
CMD ["dotnet", "MyApp.dll"]
- Python:
CMD ["python", "app.py"]
Resultaat: De container voert automatisch het opgegeven commando uit bij opstarten.
- JavaScript:
Als je alle stappen hebt gevolg voor jouw applicatie krijg je een Dockerfile die hierop kan lijken:
# Voor een Node.js-app op poort 3000
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000 # Container luistert op poort 3000
CMD ["node", "index.js"]
Correctieve feedback tijdens de uitvoer
- Build errors:
- “Module not found” ➔ Controleer
COPY
-paden en.dockerignore
als je dit gebruikt. - ”Permission denied” ➔ Voeg
USER
-instructies of voeg mogelijkchmod
toe aan het RUN commando.
- “Module not found” ➔ Controleer
Tips voor efficiënt gebruik van Dockerfiles
- Security: Gebruik
--no-install-recommends
bijapt-get
en scan images mettrivy
- Caching: Scheid
COPY package*.json ./
enRUN npm install
van code-copy voor optimale cache
Tip
Reverse engineering van images: Gebruik
docker inspect [image]
om te zien hoe een image gebouwd is, inclusief Dockerfile-instructies.
Volgende stap: Uitleg Docker Compose